java 的继承注意事项 ①

继承

  • ① 子类继承了所有的属性和方法,但是私有属性、方法不能在子类直接访问,要通过公共的方法去访问。
  • ② 子类必须调用父类的构造器,完成父类的初始化。
  • ③ 当创建子类对象时,不管使用子类的那个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。【父类构造器的初始化】

子类继承了所有属性和方法,但是私有属性也就是 private 不能在子类直接访问,要通过公共的方法访问。


Base.java

public class Base{
	public int n1=100;
	protected int n2=200;
	int n3 = 300;
	private int n4=400;


	// 当创建子类对象时,不管使用子类的哪个构造器,
	// 默认情况下总会去调用父类的无参构造器
	public Base(){
		 System.out.println("父类的无参构造器被调用");
	}
	
    public Base(String name){
		// do nothing ...
	}
    
	public void test100(){
		System.out.print("test100");
	}

	protected void test200(){
		System.out.print("test200");
	}

	void test300(){
		System.out.println("test300");
	}

	// 很显然这个方法子类不能继承,要想访问这里面的数据
	// 可以通过公共方法来访问
	private void test400(){
		System.out.print("private test400 方法");
	}

	public void gettest400(){
		test400();
	}

}

Bub.java

public class Bub extends Base{
	public Bub(){
		System.out.println("子类 Bub() 构造器被调用");
	}

	public Bub(String name){
		System.out.println("子类的 sub(String name) 被调用");
	}

	public void sayOK(){
		System.out.println(n1);
		System.out.println(n2);
		System.out.println(n3);

		gettest400();
	}
}

example.java

public class example{
	public static void main(String[] args) {
		Bub sub = new Bub();
		System.out.println();
		Bub jack = new Bub("jack");
	}
	
}

G:\java\继承>java example
父类的无参构造器被调用
子类 Bub() 构造器被调用

父类的无参构造器被调用
子类的 sub(String name) 被调用

当创建子类的对象时,父类的无参构造器也调用了,这是因为这里有个 super() 的东西。

在 子类 构造器中会默认调用 super() ,写不写都有这个东西导致在创建子类对象的时候,会调用父类的无参构造器。


当自己写了一个新的构造器,原来默认的构造器就被覆盖了。

Base.java

// 此时Base的无参构造器只有这个
public Base(String name){
		// do nothing ...
}

Bub.java

public Bub(){

}

// 报错:There is no default constructor available in 'Base'
// 在 Base父类 中没有一个可用的默认构造器

修改↓

public Bub(){        
	super("jack");  // 指定使用了 public Base(String name) 
}					// 这个构造器

父类有一个无参构造器就没必要写一个 super 了,默认调用无参构造器;但是如果父类被覆盖了那必须在子类的每一个构造器中指定使用的是父类的那个构造器。

posted @ 2024-05-05 22:54  takenika  阅读(11)  评论(0)    收藏  举报