- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问,但私有属性和方法不能在子类直接访问,要通过父类提供的公共方法访问。
- 子类必须调用父类的构造器,完成父类的初始化。
- 当创建子类对象时,不管使用哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译出错。
- 如果去指定调用父类的某个构造器,则显示的调用一下:super(参数列表)
- super在使用时,需要放在构造器的第一行
- super()和this()都只能放在构造器的第一行,因此两个方法不能共存在一个构造器中。
- java中所有类都是Object的子类,Object是所有类的基类。(Ctrl + h可以查看类的层级)
- 父类构造器的调用不限于直接父类,将一直追溯到Object类(顶级父类)
- 子类最多只能继承一个父类(指直接继承),即java中是单继承机制。
- 如何让A类继承B类和C类?
- A类先继承B类,在让B类继承C类。
- 不能滥用继承,子类和父类之间要用一定的逻辑关系。 ```java package student;
public class Base {//父类 //4个属性 public int n1 = 100; protected int n2 = 200; int n3 = 300; private int n4 = 400;
public Base() { //无参构造器
System.out.println("父类Base()构造器被调用....");
}
public Base(String name, int age) {//有参构造器
//默认super()
System.out.println("父类Base(String name, int age)构造器被调用....");
}
public Base(String name) {//有参构造器
System.out.println("父类Base(String name)构造器被调用....");
}
//父类中提供一个public方法,返回私有属性n4
public int getN4() {
return n4;
}
//父类中提供一个public方法,调用私有方法test400
public void callTest400() {
test400();
}
//4个方法
public void test100() {
System.out.println("test100");
}
protected void test200() {
System.out.println("test200");
}
void test300() {
System.out.println("test300");
}
private void test400() {
System.out.println("test400");
}
}
```java
package student;
public class Sub extends Base{//子类
public Sub(String name, int age) {
//1. 调用父类的无参构造器, 如下或者什么都不写,默认就是调用super()
//super();//父类的无参构造器
//2. 调用父类的 Base(String name) 构造器
//super("hsp");
//3. 调用父类的 Base(String name, int age) 构造器
super("king", 20);
//细节: super在使用时,必须放在构造器第一行
//细节: super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
//this() 不能再使用了
System.out.println("子类Sub(String name, int age)构造器被调用....");
}
public Sub() {//无参构造器
//super(); //默认调用父类的无参构造器
super("smith", 10);
System.out.println("子类Sub()构造器被调用....");
}
//当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器
public Sub(String name) {
super("tom", 30);
//do nothing...
System.out.println("子类Sub(String name)构造器被调用....");
}
public void sayOk(){
//非私有的属性和方法可以在子类直接访问
//调用属性
System.out.println("n1 = " + n1 + " n2 = " + n2 + " n3 = " + n3);
//n4为私有属性,无法直接访问
//System.out.println(n4);//报错!!!
//要通过父类提供的公共方法访问
System.out.println("n4 = " + getN4());
//调用方法
test100();
test200();
test300();
//test400()为私有方法,无法直接访问
//test400();//报错!!!
//要通过父类提供的公共方法访问
callTest400();
}
}
package student;
public class TestDetails {
public static void main(String[] args) {
Sub sub = new Sub();
sub.sayOk();
}
}