10章-内部类-内部类的继承(笔记)

一、内部类的继承问题

二、this和super关键字的两种用法

 

一、内部类的继承问题

       当需要继承一个内部类的时候需要用如下语法才能编译通过:

public class OutClass {	
	class InnerClass {
		public InnerClass() {
		}
		
		public void test() {
			System.out.println("我是内部类InnerClass打印的东西");
		}
	}		
}

public class ExtendInnerClass extends OutClass.InnerClass {	
	public ExtendInnerClass(OutClass outClass) {
		outClass.super();
	}		
	public static void main(String[] args) {
		OutClass outClass = new OutClass();
		ExtendInnerClass extendInnerClass = new ExtendInnerClass(outClass);
		extendInnerClass.test();
	}	
}

 

       为什么必须要用这样的语法才能实现继承内部类那?需要从子类和父类的创建关系、内部类和外部类的创建关系入手。既然ExtendInnerClass 继承了InnerClass,那么在创建ExtendInnerClass 之前一定需要调用父类InnerClass的构造方法,现在问题来了一旦需要调用InnerClass的构造方法就是要创建内部类对象,但是在创建内部类对象之前一定要创建外部类OutClass的对象,由于OutClass和InnerClass虽然为外部类和内部类的关系,但是他们编译后其实就是两个独立的类,并不会在创建内部类的时候自动帮你创建外部类,所以我们不能定义普通的没有任何参数的构造函数,只能创建一个包含外部类引用的构造函数。现在有了外部类的引用,现在就可以outClass.super(); 调用父类内部类的构造函数了。

 

       我们在理解 outClass.super() 这种语法的时候可以将这条语句分成前后两部分,super代表调用父类的构造函数,outClass为外部类对象的引用,通过前面加上外部类对象的引用调用方式,首先:可以为编译器指明外部类对象已经创建,其次:可以指明内部类所处的位置为该引用类型内部。

 

outClass.super()和outClass.new InnerClass() 这两种语法可以一块来分析:

它们都可以将.前后分开来理解,对于outClass.super()就不再重复一遍了,对于outClass.new InnerClass() 这种语法中 new代表创建对象 outClass代表此内部类所处的外部类引用outClass已经创建,并且指明InnerClass所处的位置就是outClass对应的类型内部。

 

二、this和super关键字的两种用法

 

public class Parent {

	public void parentMethod() {
		
	}
}

public class Child extends Parent {

	public Child(String name,String sex){
		super();
		super.parentMethod();
		System.out.println("姓名:" + name);
		System.out.println("性别:" + ((sex == null || "".equals(sex)) ? "未知" : sex) );
	}
	
	public Child(String name) {
		this(name,"");
		this.test();
	}
	
	public void test() {
	}
}

 从上面这段代码可以看出:

 this和super都有两种用法:

 this,后面直接调用方法或属性时,代表当前类;后面直接跟括号代表调用当前类的构造方法。

 super,后面直接调用方法或属性时,代表父类;后面直接跟括号代表调用父类的构造方法。

 与上面内部类的继承语法结合在一块,可见上面的super关键字代表调用父类的构造函数,只是与外部类引用通过.组合使用罢了。

 

你可能感兴趣的:(类的继承)