zoukankan      html  css  js  c++  java
  • 《java入门第一季》之面向对象面试题(继承中构造方法的关系)

    /*
    	继承中构造方法的关系
    		A:子类中所有(子类的有参和无参)的构造方法(默认都会访问父类)中(空参数)的构造方法,默认访问父类空参数构造,不默认访问有参数构造
    		B:为什么呢?
    			因为子类会继承父类中的数据,可能还会使用父类的数据。
    			所以,子类初始化之前,一定要先完成父类数据的初始化。
    			
    			注意:子类(每一个构造方法)(无论是无参构造还是有参构造)的第一条语句(默认)都是:super();
    */
    class Father {
    	int age;
    
    	public Father() {
    		System.out.println("Father的无参构造方法");
    	}
    	
    	public Father(String name) {
    		System.out.println("Father的带参构造方法");
    	}
    }
    
    class Son extends Father {
    	public Son() {
    		//super();子类默认第一条语句;
    		System.out.println("Son的无参构造方法");
    	}
    	
    	public Son(String name) {
    		//super();子类默认第一条语句;
    		System.out.println("Son的带参构造方法");
    	}
    }	
    
    class ExtendsDemo6 {
    	public static void main(String[] args) {
    		//创建对象
    		Son s = new Son();
    		System.out.println("------------");
    		Son s2 = new Son("林青霞");
    	}
    }

    根据执行结果可以更直观的了解整个过程:

    接下来进一步了解:

    /*
    	如果父类没有无参,但是有有参构造方法,那么子类的构造方法会出现什么现象呢?
    		报错。
    		(但是父类没有无参,也无有参构造方法,不报错因为父类默认是有有参构造)
    	如何解决上边报错呢?	
    		A:在父类中加一个无参构造方法,这个方式太简单。
    		B:通过使用super关键字去(显示的)调用父类的(带参)构造方法
    		C:子类通过this去调用(本类)的其他构造方法。例如this()是访问本类的无参构造
    			子类中一定要有一个去访问父类的构造方法(一定记得访问一次父类),否则父类数据就没有初始化。
    			
    	注意事项:
    		this(...)或者super(...)必须出现在第一条语句上。
    		如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。
    */
    class Father {
    	
    	/*public Father() {
    		System.out.println("Father的无参构造方法");
    	}*/
    	
    	public Father(String name) {
    		System.out.println("Father的带参构造方法");
    	}
    }
    
    class Son extends Father {
    	public Son() {
    		super("随便来");//访问父类中的带参构造方法Father()。从而解决了报错问题
    		System.out.println("Son的无参构造方法");
    		//super("随便给");//如果放在这里就会报错,因为子类第一句默认为super();已经对父类做了初始化,如果再一次访问super("随便给"),相当于给父类构造方法第二次初始化,报错!
    	}
    	
    	public Son(String name) {//子类的有参构造方法
    		//super("你好");
    		this();//访问(本类中的无参构造方法)Son(),第一句有了this就不再使用super的功能,因而就不再调用父类中的无参构造了;
    		System.out.println("Son的带参构造方法");
    	}
    }
    
    class ExtendsDemo7 {
    	public static void main(String[] args) {
    		Son s = new Son();
    		System.out.println("----------------");
    		Son ss = new Son("林青霞");
    	}
    }

    根据执行结果理解一下:



  • 相关阅读:
    Codeforces 120F Spiders
    Codeforces 509C Sums of Digits
    Topcoder SRM 497 DIV2 1000 MakeSquare
    codeforces 22B Bargaining Table
    Codeforces 487B Strip
    Codeforces 132C Logo Turtle
    关闭窗口对话框提示 messagedlg应用和showmodal的使用
    如何让窗口显示在电脑屏幕中间
    delphi项目程序输出编译成应用程序文件
    delphi程序项目创建和保存
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299867.html
Copyright © 2011-2022 走看看