继承

我们定义了两个类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person{
String name;

public void setName(String name){
this.name = name;
}
public String getName(){
System.out.println(this.name);
}
}
class Person2{
String name;
public void setName(String name){
this.name = name;
}
public String getName(){
System.out.println(this.name);
}
}

有很多重复代码,这是没必要的。这时候可以用上继承这个特性

1
2
3
4
5
6
7
8
9
10
11
12
13
class Person{
String name;
public void setName(String name){
this.name = name;
}
public void getName(){
System.out.println(this.name);
}
}
class Person2 extends Person{}
Person2 pre = new Person2();
pre.setName("张三");
pre.getName();//张三

可以看到,我们第二个类都没声明任何东西,就可以使用父类的方法以及属性

通过关键字extends可以使子类继承父类的方法和属性

class 子类名 extends 父类名{}

无法被访问的字段

如果父类里面有private所修饰的字段,子类是无法访问和使用的

这个时候改用protected来修饰字段就可以了。

super

子类在继承父类的时候,子类不会继承父类的构造方法,用super可以解决这个问题

父类如果没有定义无参的构造函数,子类定义自己的构造函数时,会报错

因为构造方法,如果没有明确的调用父类的构造方法,编译器隐式的加上super(),可是我们这里父类并没有定义无参的构造方法,所以就造成了错误

super更像是子类与父类的接口,这里解决方案就是super(a,b)

还是有个问题

如果我需要在子类的构造方法中去初始化子类自己的变量

1
2
3
4
5
6
7
8
class Person2 extends Person {
int age;
public Person2(int age) {
//这里系统会自动加上super()
this.age = age;
System.out.println(this.age);
}
}

但是又不想去初始化从父类继承过来的那个变量,这里不用super就会报错。

最优解还是父类定义一个无参的构造方法,最方便。

不想被继承的类

final这个功能很强大,不仅是将变量变成常量,而且还能修饰别的

类,方法,字段如果被final修饰了,则不能被其他子类所继承

1
2
3
public final int a(){} //不让被继承的方法
final class Person{} //不让被继承的类
final String name = "Unamed";//不让被继承的属性

可以在构造函数里面初始化被final修饰的字段