java 构造函数和super

package one;
class book
{
	book()
	{System.out.println("这是没有参数的父类的构造方法");}
	book(int i)
	{System.out.println("有参数   父类的构造方法");}
	
	public void get()
	{System.out.println("book父类");}
		
}
class dictionary extends book
{
	dictionary()  
	{System.out.println("子类 无参数 的构造方法哦");}	
	dictionary(int i)
	{System.out.println("子类 有参数 的构造方法哦");}
	
	
	public void get() //子类覆盖父类的方法
	{
	System.out.println("子类dictionary.");
	}
	public void get(int pages)  /*get方法的重载, 重载是  方法名相同,参数表不同*/	
	{
	System.out.println("子类dictionary get方法重载.");
	}
	public void son()
	{
		System.out.println("这是子类新添加的方法,父类没有哦.");
	}
}

public class haha { 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		book a= new book();
		System.out.println("-----------------");
		book e= new book(123);
		System.out.println("-----------------");
		book b= new dictionary(2);//多态  向上类型转换
		System.out.println("-----------------");
		dictionary c=new  dictionary(3);
		System.out.println("-----------------");
		dictionary d=new  dictionary();
		b.get();		 
        c.son();
//		b.son();   此句编译不通过
		/*(编程看左边,执行看右边)book b= new dictionary(2); 
		 即编译器看的是引用变量,因为book类里面没有son这个方法*/


	}

}

运行结果

这是没有参数的父类的构造方法
-----------------
有参数   父类的构造方法
-----------------
这是没有参数的父类的构造方法
子类 有参数 的构造方法哦
-----------------
这是没有参数的父类的构造方法
子类 有参数 的构造方法哦
-----------------
这是没有参数的父类的构造方法
子类 无参数 的构造方法哦
子类dictionary.
这是子类新添加的方法,父类没有哦.

1 调用子类构造函数的时候,会默认先调用父类的无参数构造方法,即相当于隐藏了一行代码 super();

2.在你程序没有写构造方法时候,编译器会默认帮你写一个无参数的构造方法,只不过方法里面没有内容
然而当你编写了构造函数的话,编译器就不会再帮你添加无参数的构造方法了,即使你只编写了有参数的构造方法。
如果你已经写了一个有参数的构造函数,并且你需要一个没有参数的构造函数,你必须自己动手写。
只要你有自己写的构造函数,不管是哪一种,这都会想是在跟编译器说:老兄,我自己的构造函数不用你管。


java 构造函数和super

写了book(i),而没有写book()这种无参数的,编译器会认为你既然写了构造函数了,我就不管了,所以不会为你默认添加book() 而子类的构造函数是要先调用父类的,默认无参数的构造函数,此时我们因为没有定义这种,所以报错。

java 构造函数和super

dictionary()通过super(i)调用父类构造函数。编译成功

dictionary(i)没有编译成功,是因为默认 子类构造函数 先调用无参数的父类构造函数,super() ,然后因为没有嘛,所以错误。

构造函数的作用
来初始化对象的状态。