我们先简单罗列继承的相关知识点:
- 关键字:extends
- 格式:public class 子类名 extends 父类{}
- 1. 继承的属性和方法:子类可以直接继承到父类的成员属性和成员方法(构造方法不能被继承)
思考:子类继承父类方法后,方法写成什么样子?
先看下面两段简单的代码,A是B的父类,B可以继承A的成员方法。
public class A {
int age=18;
void test(){
System.out.println(age);
}
}public class B extends A{
int age=22;
}那么问题来了,B继承A类方法,方法体内部要怎么写呢?
void test(){
System.out.println(age);
} void test() {
super.test();
}正确答案是下面这个哦!
- 2. 构造方法:子类构造方法必须调用父类的构造方法。并且要在子类构造方法的第一行调用。格式为super(参数列表).
a.自己在每个子类的构造方法中老老实实地显式调用父类构造方法
b.没有显式调用父类构造方法,则编译器会在子类的构造函数第一行为我们添加super(),即替我们添加了调用父类的无参构造方法。如果自己调用的话则不会为我们做任何事情。
c.使用this关键字在某个构造方法的第一行调用了其他构造方法,而其他构造方法调用了父类的构造方法,那也是可以的。
为方便理解,我们举个例子:
public class Son extends Father{
//第一个构造方法没有显式调用父类构造方法
Son(){}
//第二个构造方法显式调用父类构造方法
Son(int year){
super("na");
}
//第三个构造方法通过this关键字满足了调用父类构造方法的条件
Son(Float a){
this(23);
}
}public class Father {
Father(){
System.out.println("父类");
}
Father(String n){}
}- 3. 方法重写:
(1)在子类中重新定义父类的方法,必须和父类的方法同名同参,且方法的返回值类型都相同
(2)子类可以重写父类的方法并修改方法体,但不能修改方法结构
(3)子类重写父类方法后,子类对象调用时调用的是重写后的方法,不能再调用重写前的方法;这是因为修改子类方法后,它覆盖了父类的方法,这个过程叫override;
- 4. 成员变量重写
子类中假如有一个与父类同名的属性,那么这个同名的属性不会覆盖继承的属性,也不会冲突,它属于一个隐藏属性变量。
举个例子:
public class A {
int age = 10;
void test() {System.out.println("test--A" + age);}
}
public class B extends A {
int age = 12;
void test(){System.out.println("test--B" + age);}
}
public class Entrance {
public static void main(String[] args) {
A a = new B();
System.out.println(a.age);
a.test();
}
}结果如下:
10
test--B12- 5. super关键字
(1)用在子类的构造方法中,表示对父类构造方法的调用,格式: super+(参数列表);
(2)用在子类的成员方法中,表示对父类成员方法的调用,格式: super.方法名字(参数列表);
- 6. 注意:
(1)java不支持直接多重继承,一个子类只能有一个父类。
class 子类 extends 父类1,父类2{} ×(但这种写法在c++中是支持的)
(2)java可以有间接的多重继承,比如A继承了B,B继承了C,此时相当于A间接地继承了C。
(3)也就是说,一个类只能有一个直接父类,但可能有多个间接父类。