继承-面向对象
1、继承
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可
1)什么是继承
public class Student extends People{}
Student 称为子类(派生类) People称为父类(基类或超类)
作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了
好处:提高代码的复用性,减少代码冗余,增强类的功能扩展性
java中子类功能更强大
public class People{
public void run(){
syso("RUNRUN!!")
}
}
public class Student extends People{
}
main:
Student s = new Student();
s.run;
2)继承设计规范与内存图
设计规范:子类们相同的特征放在父类中,子类独有的属性与行为放在自己类中
public class People{
private String name;
private int age;
public void queryCourse(){
syso(name+"查看课表");
}
getter、setter方法
}
public class Student extends People{
private String className;
public void writeInfo(){
syso(getName+"写下了,学习语法");
}
}
main:
Student s = new Student();
s.setName("蜘蛛精");//使用父类的
s.setAge(999);//使用父类的
s.queraCourse();//使用父类的
s.writeInfo();//子类的方法
内存工作原理:

3)继承的特点
(1)子类可以继承父类的属性和行为(非私有),但是不能继承父类的构造器(构造器是用来申请对应对象的)
(2)单继承,一次只能继承一个直接父类
(3)Java不支持多继承,但是支持多层继承
(4)Java中所有的类都是Object类的子类(抛开基本数据类型,但其是每个都对应一个引用数据类型(包装类) eg:Integer)
byte------>Byte
short----->Short
int------->Integer
long------>Long
float----->Float
double---->Double
char------>Character
boolean--->Boolean
(5)final修饰的类为最终类,不能被继承
注:
Q 1:子类是否可以继承父类的私有成员?可以,只是不能直接访问,继承时在父类这块内存空间是开辟了空间保存的
Q 2:子类是否可以继承父类的静态成员?子类可以直接使用父类的静态成员,但个人认为是共享而不是继承,因为内存区只保存一个 (类名.静态变量名)
Q 3:只支持单继承不支持多继承,因为多继承若有相同方法会有歧义!
但是支持多层继承,有相同的方法时,选择就近。
Q 3:Java中所有的类都是Object类的子类,即默认继承Object类,所以可以使用Object的方法
4)继承后的特点
(1)继承后在子类中访问成员(变量、方法)满足:就近原则

有局部存在,访问成员用this,访问父类用super
(2)方法重写
方法重载:方法名一样,参数类型、个数、顺序一样,与修饰符和返回值类型无关。
方法重写:方法名相同, 形参列表相同, 重写后访问修饰符必须大于父类方法, 父类方法若返回值为void,子类也必须是void。 其次返回值类型要么和父类保持一致,要么是父类返回值的子类(小于等于父类的方法返回值类型)。

在继承关系中子类中出现了和父类中一样的方法声明,称为方法重写
应用场景:子类需要父类的功能,但父类的该功能不能完全满足自己的需求
@Override:(告诉编译器必须满足方法重写的条件)1、重写校验注解,加上之后,这个方法必须是正确重写的,这样更安全。2、提高程序的可读性,代码更优雅
注意:重写方法的名称、形参列表必须与被重写的方法一样
私有方法不能被重写
子类重写父类方法时,访问权限必须大于等于父类(default<protected<public),父类方法public 子类方法就不能是proteed等
子类不能重写父类的静态方法,因为静态方法本身属于各自类
一般维持:申明不变,重新实现

(3)子类构造器的特点
子类的全部构造器默认会先访问父类的无参构造器再执行自己,因为子类初始化可能用到父类的数据

(4)子类构造器访问父类有参构造器
super调用父类有参构造器的作用:初始化继承自父类的数据
父类中没有无参构造器,只有有参构造器:会报错,因为子类默认调用父类无参构造器
解决办法:子类构造其中可以通过super(...),手动调用父类的有参构造器


(5)super和this详情
当子类没有定义方法时,this对象会寻找父类中的方法

this(...)的使用:


具体代码使用:

(6)继承的缺点
在实际开发中,我们尽可能减少继承的使用
1、在JAVA中,类的继承是单一继承,一旦一个类有了直接父类,他就无法继承其他类了
2、在实际开发中,有个设计思想是高内聚低耦合
高内聚低耦合:把类似的方法聚集在一个类中(eg:String类聚集了所有对字符串操作的方法)减少类与类之间的联系,降低类与类之间的耦合度
遵循6个设计原则来实现高内聚低耦合
1.类的单一原则:一个类只做一件事
2.开闭原则:对修改关闭,对扩展开放
3.依赖倒置原则:应该依赖父类类型,不应以来子类类型 上层模块不应该依赖底层模块,它们都应该依赖于抽象。 抽象不应该依赖于细节,细节应该依赖于抽象
4.接口隔离原则:在一个接口中不要有太多的抽象方法,把一个接口分成多个接口去写 ,由实现类选择实现 1、客户端不应该依赖它不需要的接口。2、类间的依赖关系应该建立在最小的接口上。
5.里氏替换原则:所有引用父类的地方必须能透明地使用其子类的对象
eg:Animal a1 = new Cat();
6.迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

浙公网安备 33010602011771号