如果以上两篇文章同学你已经跟练过了,接下来你就可以来了解我们面向对象的四个基本特征了,概念其实很简单,我会以最简单的方式告诉你,重点是如何将这些重要的概念融会贯通到你的代码中,用代码体现出来你学习成果;首先别着急,一点一滴的做事情,不积跬步无以至千里,不积小流无以成江河,学习也是一样,积少成多的过程。
接下来我们来聊聊面向对象4大特种中几个:
- 什么是封装?
- 封装,就是隐藏实现细节。
- 封装的举例:
- 类对于属性和方法的封装。
- 对象对于数据的封装。
- 方法对于代码的封装。
- 对于属性的封装。
- 如何对于属性封装?
- 将属性私有化,提供公有方法访问私有属性。
- 老师类的属性封装:
-
public class Teacher { private String name; // 教员姓名 private int age; // 年龄 /** * 返回自我介绍的内容 */ public String introduction() { return "大家好!我是" + name + ",我今年" + age + "岁"; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ if(age>=22&&age<=150){ this.age = age; }else{ System.out.println("年龄不合法,恢复到初始状态"); this.age = 22; } } public int getAge(){ return age; } }
-
-
老师类的测试类
-
public class TeacherTest { public static void main(String[] args) { Teacher t1 = new Teacher();//创建老师对象 //t1.name = "张老师"; //t1.age = -10; t1.setName("张老师"); t1.setAge(1000); String s = t1.introduction(); System.out.println(s); System.out.println(t1.getName()); System.out.println(t1.getAge()); } }
-
- 为什么使用构造方法:
- 要简化对象初始化的代码,可以通过构造方法来解决。
- 检查属性的赋值,将代码的安全性得到提高。
- 构造方法的作用,对象的初始化操作。
- 升级教师类,增加构造方法。
-
public class Teacher { private String name; // 教员姓名 private int age; // 年龄 private String edu;// 学历 private String position;// 职位 //缺省的 public Teacher(){ } public Teacher(String name,int age,String edu,String position){ this.name = name; this.age = age; this.edu = edu; this.position = position; } /** * 返回自我介绍的内容 */ public String introduction() { return "大家好!我是" + name + ",我今年" + age + "岁,学历是" + edu + ",职位是" + position; } //属性的:get 和 set 方法已经被省略 }
-
-
测试老师,使用构造方法
-
public class TeacherTest { public static void main(String[] args) { Teacher t1 = new Teacher("张老师", 33, "硕士", "讲师"); String s = t1.introduction(); System.out.println(s); System.out.println(t1.getName()); System.out.println(t1.getAge()); } }
-
- 构造方法必须满足以下语法规则:
- 方法名与类名相同
- 没有返回类型
- 方法重载:
- 方法名称相同,形参列表不同。
- 典型案例:
- println方法
- Math.abs方法(求绝对值)
- 构造方法重载
- 方法重载是多态特性的重要体现
- 代码运行时根据参数的不同会选择不同的方法。
- 普通方法名称可以与类名相同,但是不规范
- 普通方法名要准守驼峰命名法,例如:setName(String name);
- 构造方法与普通方法的区别
- 构造方法没有返回值类型。
- 构造方法名称必须和类名相同。
- 构造方法是实例化对象时使用。(构造方法在创建该类的对象时候使用)
- 注意:
- 一个类中,默认缺省状态有一个无参的构造方法。
- 一旦人为定义一个有参的构造方法时候,缺省构造方法则消失。
- 面向对象的四大特性
- 封装
- 继承
- 多态
- 抽象
- 在Java程序中,代码封装带给我们的好处是什么?
- 代码封装的方法可以重复使用。
- 隐藏实现细节。
- 提高数据的安全性。
- 继承关系设计
- 符合一个原则:什么是什么的一种。
- 父类更加通用,子类更加具体。
- 继承:
- 概念:子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性。
- 继承的好处
- 子类自动继承父类的属性和方法,子类中不再存在重复代码。
- 关键字super,表示的是:父类 或者是 基类。
- 关键字 this,表示的是:当前类的引用。
- 关键字extends,表示一个类继承了另一个类。
- 继承的特点
- 子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法。
-
创建老师类
-
public class Teacher { private String name; private String school; public Teacher() { } public Teacher(String name, String school) { this.name = name; this.school = school; } public void giveLession() { System.out.println("知识点讲解"); System.out.println("总结提问"); } public void introduction() { System.out.println("我是来自" + this.school + "的" + name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSchool() { return school; } public void setSchool(String school) { this.school = school; } }
-
-
创建JavaTeacher类
-
public class JavaTeacher extends Teacher { public JavaTeacher(String name,String school){ super(name, school); } /* * 方法重写,自类重写父类的方法 */ @Override public void giveLession() { System.out.println("打开Eclipse,讲授JavaSE"); super.giveLession(); } }
-
-
创建DoNet老师类
-
public class DoNetTeacher extends Teacher { public DoNetTeacher() { super(); } public DoNetTeacher(String name, String school) { super(name, school); } @Override public void giveLession() { System.out.println("打开VS2019"); super.giveLession(); } }
-
-
创建测试类
-
public class TeacherTest { public static void main(String[] args) { JavaTeacher t1 = new JavaTeacher("Lisa", "HK"); t1.introduction(); t1.giveLession(); DoNetTeacher t2 = new DoNetTeacher("Tom", "BJ"); t2.introduction(); t2.giveLession(); } }
-
- Object:一切类的根父类
- 一切类直接过着间接都继承了Object类
- 方法重写
- 子类继承父类,重写父类的方法要求:
- 方法名称相同,返回值类型相同,形参列表相同。
- 访问修饰符不能小于父类的访问修饰符范围。、
- 方法重写的典型案例:
- Object的toString()方法;
- 返回该对象的字符串表示形式。
- 默认返回该对象的内存地址。
- Object的toString()方法;
- 子类继承父类,重写父类的方法要求:
- 多态
- 概念:多态是具有表现多种形态的能力的特征,
- 同一个实现接口,使用不同的实例而执行不同操作。
- 多态性是OOP的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定,而非在编辑期间就决定了。这对于大型系统来说能提高系统的灵活和扩展性。
- 多态形成的条件:
- 要有继承关系;
- 要有方法重写;
- 父类引用指向子类对象。
- 多态的体现形式:
- 方法重载是多态特性的重要体现
- 代码运行时根据参数的不同会选择不同的方法。
- 方法的形参处定义的是父类的类型,实际传入的是具体子类的对象。
- 方法重载是多态特性的重要体现
- 多态的优点
- 提高了代码的灵活性和可扩展性。
- 优点的案例:
- 使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强。
- 构造器的相关知识点:
- 继承关系,子类创建对象时候。
- 会默认的先执行父类的构造器。
- 如果没有明确指出,就会执行父类无参的缺省构造器。
- 普通方法调用
- 子类重写了父类的方法,就会替换父类的方法。
- 如果需要调用父类的方法,需要使用关键字:super。
未完待续,下一篇文章见。