继承
继承的概念:
继承是从已有的类派生出新的类,新的类能吸收已有类的数据属性和行为,并扩展新的能力,继承使用的关键字是extends
1.类的继承格式:
class 父类{}
public class Animal {
public void eat(){
System.out.println("动物的吃饭方法");
}
public void sleep(){
System.out.println("动物的睡觉");
}
}
class 子类 extends 父类{}
public class Person extends Animal {
//重写了Animal的eat()方法
@Override
public void eat() {
System.out.println("人类的吃饭");
}
//Person类独有的方法
public void study(){
System.out.println("人类会学习");
}
}
2.子类的对象可以调用父类中的(public、protected)属性和方法 当做自己的来使用
public static void main(String[] args) {
Person person=new Person();
person.sleep();
}
}
运行结果:
动物的睡觉
Process finished with exit code 0
3.子类可以添加自己独有的属性和方法
//Person类独有的方法
public void study(){
System.out.println("人类会学习");
}
public static void main(String[] args) {
Person person=new Person();
person.study();
}
}
运行结果:
人类会学习
Process finished with exit code 0
*4.子类从父类中继承过来的方法有的不能满足子类的需要,可以在子类中覆写(Override)父类的方法。
//重写了Animal的eat()方法
@Override
public void eat() {
System.out.println("人类的吃饭");
}
public static void main(String[] args) {
Person person=new Person();
person.eat();
}
运行结果:
人类的吃饭,讲究色香味俱全
Process finished with exit code 0
(1)、权限: 子类的访问权限可以大于等于父类,父类是protected,子类可以是public,但是子类的访问权限不能小于父类。
(2)、特征:fina static abstract
父类方法是final的,子类不能重写
父类方法是static 子类不存在 因为static是属于类的,与类静态绑定,子类不能重写。
父类方法时abstract 子类必须重写(如果子类时抽象类,可以不重写)
(3)、返回值: 子类可以小于父类
(4)、名字:子类方法的名字必须与父类一致
(6)、参数:子类与父类一致
(7)、异常:如果父类方法抛出运行时异常,子类可以不予理会
如果父类抛出的是编译时异常,子类抛出异常的个数、类型都要小于等于父类
(8)、方法体:子类与父类方法内容不一致 ,每一个重写方法过程不一致
5.每一个类都有继承类,如果不写extends关键字,默认继承Object,如果写了extends则继承后面那个父类,可以理解为Object类非常重要,是一个应用类型的父类(直接或者间接的继承Object)Object没有父类
6.Java中继承是单个存在的(单继承)每一个类只能有一个继承类(在extends后面只能写一个类)可以通过传递的方式实现多继承的效果,例如,Animal类继承了Object类,Person类继承了Animal类,所以Person间接继承了Object类,可以使用Object中的一般方法和属性。
public static void main(String[] args) {
Person person=new Person();
//Person默认继承了Object类,可以使用Object中的方法
person.equals();
person.hashCode();
person.toString();
}
*7.关于this和super的使用:
如果子类没有写构造方法,默认执行父类的无参数构造方法
public class Animal {
Animal(){
System.out.println("父类中的无参数构造方法");
}
public class Person extends Animal {
}
public static void main(String[] args) {
Person person = new Person();
}
运行结果:
父类中的无参数构造方法
Process finished with exit code 0
如果子类写了构造方法,先执行父类无参数构造方法,再执行子类的构造方法,因为父类的无参数构造方法(super())隐藏在子类构造方法的第一行,所以执行时,首先执行父类的构造方法。
public class Person extends Animal {
Person(){
//super();隐藏在第一行,首先执行
System.out.println("子类的无参数的构造方法");
}
public static void main(String[] args) {
Person person = new Person();
}
运行结果:
父类中的无参数构造方法
子类的无参数的构造方法
Process finished with exit code 0
this和super都是指代词 代替的是对象
this代替的是当前执行方法时的那个对象,不一定指的是当前类的
super代替的是当前执行方法时的对象的父类对象
都能调用一般属性和一般方法
可以放置在类成员的任意位置(属性 方法 构造方法 块)
*注:调用一般方法的时候可以来回调用 ,执行时可能产生问题
可以调用构造方法(放在构造方法的第一行),this和super在构造方法中调用另一个类的构造方法不能同时出现在第一行,构造方法之间不能来回调用。