继承-面向对象

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.迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
posted @ 2022-05-18 19:19  夜色哪里都是美  阅读(47)  评论(0)    收藏  举报