面向对象的三大基本特征(封装、继承、多态)
1 封装
将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的访问和操作。
- 设计思想:把需要隐藏的隐藏起来,把需要展示出来的展示出来。
- 封装的目的:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
要修改和查看人类的信息必须通过SET、和GET方法来实现。 这是能初步体现封装的的例子。
2 继承
1 什么是继承?
面向对象三大特征之一;可以使得子类拥有父类的属性和方法,还可以在子类中重新定义,或者追加属性和方法。
2 怎么实现继承?
可以使用关键字extends实现继承
格式: class 子类 extends 父类 { }
3 使用继承能带来的哪些好处?
1 继承可以使得类和类之间产生关系;比如子类可以访问父类中除了私有的其他成员。
2 提高了代码的复用性; 多个类中相同的成员可以放到一个类中
3 提高了代码的维护性; 如果需要修改代码,只需要修改一处即可
4 使用继承的弊端?
继承让类和类之间产生了联系,类的耦合性增强,如果父类发生变化时,子类也得跟着变化,削弱了子类的独立性
5 那些地方适合使用继承?
需要先判断类与类之间是否存在is a的关系(谁是谁的一种);比如,老师和学生都是人的一种,人即是父类,老师和学生即是子类
6 super关键字:
在对象的内部使用,可以代表父类对象的引用。(父类存储空间的标识)
this和Super的区别?
this:
-
this 能出现在实例方法和构造方法中。
-
this 不能在静态方法中使用。
-
this. 可以引用本类的属性或方法。
-
this. 在区分局部变量和实例变量的时候是不能省略的,其他大部分情况下可以省略。
super: -
super(实参) 的作用:初始化当前对象的父类型特征。并不是创建新对象。实际上对象只创建了一个。
-
super关键字代表:“当前对象”的那部分父类型特征。
-
super 不能使用在静态方法中
-
当父类和子类中有相同的方法时,如果此时想在子类中访问父中的数据,须使用“super.”进行区分。
结论:
当一个构造方法第一行:既没有this()又没有super()的话,默认会有一个super();
因为:通过当前子类的构造方法调用父类的无参数构造方法。
所以必须保证父类的无参数构造方法是存在的。
父类的构造方法是一定会执行的。
this是引用、保存内存地址、也指向任何对象。
super 不是引用、不保存内存地址、也不指向任何对象。其只是代表当前对象内部的那一块父类型的特征。
7 继承中变量访问有什么特点?
在子类中访问一个变量,采用就近原则。
子类在局部范围找;子类在成员范围找;父类在成员范围找;如果都没有,就报错。
8 构造方法访问的特点?
子类所有的构造方法都会默认地访问父类的无参构造方法。
子类会继承和使用父类的数据。所以,子类在初始化之前,一定要先初始化父类的数据。
每一个子类的构造方法第一条语句,都是默认的super()
如果父类中没有无参的构造方法,只有有参的构造方法,怎么处理?
1 子类中使用super(参数),调用有参的方法。
2 父类中构造一个无参的构造方法。
9方法的重写
子类如果对继承的父类的方法不满意,或者想要实现子类特有的功能,可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。
值得注意的是:我们在重写方法时:返回值类型,方法名,类型及个数,这些都要与父类继承的方法相同,才叫方法的重写。
重载和重写的区别:
方法重载: 在同一个类中处理不同数据的多个相同方法名的多态手段。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。(不同类)
10 final关键字
- 表示最终的意思,可以修饰成员变量,成员方法,类。
- 效果:
-
修饰类:该类不可以被继承(可以有父类,不能有子类)
-
修饰方法: 该方法不能被重写
-
修饰变量:
该变量变为了一个常量,不能再被赋值
-
修饰基本的数据变量:
基本类型的数据变量,变为常量(数据值不能再改变),不能再被赋值
-
修饰引用的数据变量:
引用类型的数据变量,其地址值不能再改变,但其地址下的内容可以再改变。final Student s = new Student(23);
s = new Student(24); // 错误
s.setAge(24); // 正确
3 多态
同一个对象,表现出来的多种形态
前提?
要有继承关系
方法要重写
父类的引用指向子类的对象
多态的引用:
-
父类的引用可以指向本类的对象;
-
父类的引用可以指向子类的对象;
注意:我们不能使用一个子类的引用来指向父类的对象,如:
为什么子类的引用不能用来指向父类的对象呢?我们能说:学生是一种人类,但是不能说人类是一种学生,人类和学生类是父类和子类的继承关系,它们的从属是不能颠倒的。当父类的引用指向子类的对象时,该对象将只是看成一种特殊的父类(里面有重写的方法和属性),反之,一个子类的引用来指向父类的对象是不可行的!
成员变量访问的特点?
编译看左边,运行看左边
编译和运行用的都是父类的变量
结果:
可以看到,得到的是父类(左边)成员变量的值。
注意:如果父类的成员变量是私有的,调用的时候一般用get成员方法。所以得出的结果是子类(右边)的成员变量。
成员方法访问的特点?
编译看左边,运行看右边
编译时,父类要有相应的方法,运行时,运行的方法是对应子类的方法
多态的好处?
可以提高代码的扩展性
定义方法时,如果用父类作为参数,在使用方法时,他可以传递给任意的子类对象
弊端:
不能使用子类的特定的成员
向上转型和向下转型:
向上转型:
父类引用指向子类对象就是向上转型
Animal a=new Cat()
向下转型:
将父类型的引用转化为具体的子类型的对象
Cat c=(Cat) Animal
注: 当父类没有相应的方法,子类有,这时,需要调用子类的方法,就可以使用向下转型,将父类引用强转为子类。