继承
定义
extends,子类继承父类,直接继承父类的属性与方法,访问修饰符不能为私有。
- java中只能有一个父类,可以有多个子类。
- 继承后直接拥有父类的属性与方法(不包含构造方法),当属性的访问修饰符为private时,需要用get和set方法。
- 子类可以重写由父类继承过来的方法,重写后父类子类调用该方法都为重写后的方法,父类以前定义的方法直接被覆盖(替换)。
- 创建子类对象必须先创建父类对象。
当创建了子类的构造方法后,会先创建一个无参的父类的构造方法,因此当调用子类的构造方法时先调用父类的构造方法。 - object万类之祖,如果一个类没有定义它的父类,则默认继承一个JDK定义的Object类
public Person(){
System.out.println("--- new Person--");
}
public Student(){
// 先调用父类的无参构造方法
System.out.println("--- new student---");
}
Student s = new Student();
输出结果为:
— new Person–
— new student—
this与super关键字
- super表明调用父类的内容
super(参数列表)表示调用父类的构造方法,创建子类的时候会调用子类的构造方法,会先偷偷执行super()。使用时需要放在第一行。 - this表明调用当前对象,后面可以跟属性或方法。
this(参数列表)表示调用本类的构造方法,使用时需要放在第一行。 - this与super都需要放在第一行,所以不能同时使用。
重写与重载
-
重写:子类可以重写由父类继承过来的方法。
1.返回类型:基本数据类型必须保持一致
引用数据类型:父类的返回类型>=子类的返回类型
2.方法名必须保持相同
3.参数列表必须相同
4.父类的访问修饰符与异常>=子类 -
重载:对一种功能有多种实现方式。
1.方法名必须相同
2.参数列表必须不同
final关键字
修饰属性:
- final修饰属性的内容必须进行初始化,不能更改
- 初始化:1.定义属性直接赋值 2.在构造器中进行初始化
修饰方法:
表示这个方法不能被重写
修饰类:
表示这个类不能被继承
强转
具有继承关系的类可以进行强转:
- 强转划分接线:
假设Person为父类,Student为子类,BigStudent为孙类。
关系线:Object---->Person---->Student---->BigStudent
Person p = new Student();
在Student后面划分界线:Object---->Person---->Student–|-->BigStudent,p可以强转成Student以左的类。
Student s = (Student) p;
父转子
Person p1 = (Person)s
当不满足此条件时会运行时异常 ClassCastException。 - String与Object之间也可以转(Object是万类之祖)
String ss = new String();
Object obj = (Object)ss;
//Person跟String没有继承关系,所以编译异常
Person obj = new BigStudent();//编译异常
String ss = (String) obj; //编译异常
- instanceof 用来判断对象是什么类型
用法:对象 instance 类。
意义:这个对象是否是这个类,返回一个boolean类型的值。
编译错误:表示没有继承关系。
false:表示不满足强转条件。
true:对象能强转成这个类型。
public static void main(String[] args) {
method(new Person());//结果:false
method(new Student());//结果:true并且执行study方法
method(new Object());//编译错误!!
}
public static void method(Person p) {
System.out.println(p instanceof Student);
if (p instanceof Student) {
((Student) p).study();
}
}
多态
即多种表现形态,父类对象引用子类实例,需要父类对象的时候给个子类实例Person p = new Student();
- 调用方法时:调用向左看,执行的方法向右看
方法先查找子类的方法,如果子类没有再查找父类
Person p = new Student();
p.eat();//此时的eat方法为子类中重写的eat方法
- 调用属性时:调用向左看,执行向左看
System.out.println(p.name);
//输出的name为父类中给的初始值