Day4
继承
- Java中使用
extends
关键字建立继承 - 当类与类之间,存在相同的内容,并满足子类是父类中的一种,就可以考虑使用继承
- 子类从父类中继承的内容
- 父类的构造方法不能被继承
- 父类的成员变量可以被继承,但是private修饰的不能访问
- 创建子类实例的时候会在堆内存中先创建一个父类实例,该实例与子类实例相关联,父类实例不能被构造 两次
- 父类的成员方法可以被继承
- Java会从顶级父类中将不被
private
,static
,final
修饰的方法放进一个虚方法表,依次传承给孩子
- Java会从顶级父类中将不被
构造方法 | 非私有 不能 | private 不能 |
---|---|---|
成员变量 | 非私有 能 | private |
成员方法 | 虚方法表 能 | 否则不能 |
- Java中所有类都有一个祖先
Object
- 成员变量的访问特点
- 使用
this
表示使用本类的成员变量,使用super
表示使用父类的成员变量
- 使用
- 成员方法的访问特点
- 同成员变量
- 方法的重写:当父类的方法不能满足子类现在的需求时,需要进行方法重写,在方法重写前,要添加@Ovverider重写注解
- 方法的重写的本质:覆盖虚方法表中的虚方法
- 只有被添加到虚方法表的方法才能被重写
- 构造方法的访问特点
- 父类的构造方法不会被子类继承
- 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己的
- 想调用父类的有参构造,使用
super(paramenter1...)
this
理解为实例对象的地址,是类中默认存在的属性
多态
-
多态是指一个单独的行为可以表现出多种形态
-
多态的实现,相同父类的子类对父类中的方法进行Override或者Overload
-
Overload:同名方法但是参数不同
-
Override:同名方法并且参数和返回值都相同
-
多态的表现形式:
Fu f = new child();
父类引用向上指向子类对象,这样可以提高代码复用 -
多态调用成员
- 调用成员变量:由于创建子类实例的时候,会创建一个父类实例,所以访问该实例的时候,调用的成员变量实际上是父类的变量
- 调用成员方法:创建子类后,子类的方法会复写父类的同名方法,因此这个父类实例的方法和子类方法相同
- 向上转型,会为child贴上parent的标签,他会被当成parent使用,可以访问他里面的所有与parent相关的东西
-
多态的优势
- 多态形式下,右边的对象可以实现解耦合,便于扩展和维护
- 定义方法的时候,使用父类为形参,可以传入任何子类
-
多态的劣势
- 不能调用子类的特用功能
Note:
a instanceof b
可以判断a所记录的对象是不是b的类型
package
- 包就是文件夹,用于管理不同功能的java类
- 使用
import
关键字导包,可以直接使用某包中的东西 - 使用同一个包中的类时不用导包
final
- final修饰方法
- 当前方法是最终方法,不能被重写
- final修饰类
- 当前类是最终类,不能被继承
- final修饰变量(命名全部大写)
- 表示为常量不能修改值
权限修饰符
修饰符 | 同一个类中 | 同一个包中其它类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | √ | |||
空着不写/friedly | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
static
代码块:在类中使用static
修饰代码块,可以在类第一次加载时运行代码,可以用于初始化静态成员变量
抽象类
-
抽象方法:每一个子类的内容都不一样。如果一个类中有一个抽象方法,那么这个类必须是抽象类,其命名格式为:
public abstract class Person { public abstract void work(); }
-
抽象类不能实例化
-
抽象类中不一定有抽象方法,也有抽象方法的一定是抽象类
-
可以有构造方法(用于为子类构造)
-
抽象类和抽象方法的意义:可以通过父类的定义,知道这种方法的统一参数和返回值
匿名内部类
-
本质:隐藏了名字的内部类
new 类名或接口名() { 方法重写; };