JAVA_SE_笔记整理(面向对象二)
面向对象二
1、继承:
继承概述:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。原因。
用法:class 子类名 extends 父类名{}
单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
继承的好处:
提高了代码的复用性,多个类的相同成员可以放到同一个类中。
提高了代码的维护性,如果功能更改只需修改一处。
让类与类之间产生了关系,是多态的前提:弊端,类的耦合性增强。
代码设计原则:高内聚低耦合
简单的理解:
内聚就是自己完成某件事情的能力。
耦合就是类与类之间的关系。
我们在设计的时候原则是:自己能完成的就不麻烦别人,这样将来别人产生了修改,就对我的影响较小。
由此可见:在开发中使用继承其实是在使用一把双刃剑。今天我们还是以继承的好处来使用,因为继承还有很多其他的特性。
继承的特点:
java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
// class SubDemo extends Demo{} // 是可以的。
// class SubDemo extends Demo1, Demo2{} // 不可以多个爹
java支持多层继承(继承体系)
class A{}
class B extends A {}
class C extends B {}
注意事项:
子类只能继承父类所有非私有的成员(成员方法和成员变量),可以继承父类的静态非私有属性。
其实这也体现了继承的另一个弊端:打破了封装性
子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
不要为了部分功能而去继承。
继承中成员变量的关系:
子父类中同名和不同名的成员变量:
子类中访问一个变量
首先在子类局部范围内找
然后在子类的成员范围找
最后在父类成员范围找(肯定不能访问到父类局部范围)
如果还是没有找到就报错。
2、super关键字
super的用法和this很像
this代表本类对象的引用
super代表父类存储空间的标识(可以理解为父类对象的引用)
用法(this和super均可如下使用)
访问成员变量:
this.成员变量 super.成员变量
访问构造方法(子父类的构造问题讲)
this(…) super(…)
成员方法(子父类的成员方法问题讲)
this.成员方法() super.成员方法()
3、继承中构造方法的关系
子类中所有的构造方法默认都会访问父类的无参构造方法。
因为子类会继承父类中的数据,可以还会使用父类的数据。所有子类初始化之前,一定要先完成父类数据初始化。
每一个构造方法第一条语句默认都是:super();
如果自行显示调用,就不会默认调用super();
子类通过super去显示调用父类其他的带参的构造方法
子类通过this去调用本类的其他构造方法
本类其他构造也必须首先访问了父类构造
一定要注意:
super(…)或者this(….)必须出现在第一条语句
否则报错。
4、代码块
什么是代码块?
可以执行的代码段,简称代码块,{}中
三种:普通代码块,构造代码块,静态代码块。
普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”代码块中定义变量只在代码块中有效。
构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。 //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
注意:静态代码块,不可能存在于任何方法体内
静态代码块,不能直接访问实例变量和实例方法。需要通过实例对象来访问。
5、继承中的成员方法:
通过子类对象去访问一个方法
首先在子类中找
然后在父类中找
如果还是没有就报错。(不考虑父类的父类)
方法重写概述:
子类中出现了和父类中一模一样的方法声明(定义),也被称为方法覆盖,方法复写。
使用特点:
如果方法名不同,就调用对应的方法。
如果方法名相同,最终使用子类自己的。
方法重写的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
注意事项:
父类中的私有方法不能被重写
子类重写父类方法时,访问权限不能更低。
// 报错:正在尝试分配更低的访问权限; 以前为public-》子类重写后方为权限小于父类方法权限
父类静态方法,子类也必须通过静态方法进行重写。(其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解)
6、final关键字
final关键字是最终的意思,可以修饰类,成员变量,成员方法。
修饰类,类不能被继承
修饰方法,方法不能被重写
修饰变量,变量就变成了常量,只能被赋值一次。普通变量被修饰成为局部常量。成员变量被修饰,成员常量。成员常量只能在构造方法及构造方法之前进行初始化。否则不允许初始化。
修饰成员变量:
基本类型,是值不能被改变
引用类型,是地址值不能被改变
final修饰成员变量初始化的时机:
在对象构造完毕前即可 (必须只赋值一次,不能重复赋值)