欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内部类:内部类的继承

程序员文章站 2022-05-22 08:37:45
...

一、父类和子类在同一个外部类中

package org.lgy.study.innerclass;

public class InnerClassInheritance{
	
	//如果父类是静态的,则子类既可以是静态的也可以是非静态的;
	//如果父类是非静态的,则子类只能是非静态的。
	public static class InBase{
		public InBase(String msg){
			System.out.println("InBase's constructor : " + msg);
		}
		
		public void method1(){
			System.out.println("method1 in InBase");
		}
	}
	
	/*
	子类和父类位于同一个外部类中,这种继承和普通的继承没有任何区别。
	*/
	public class InSub extends InBase{
		public InSub(String msg){
			super(msg);
			System.out.println("InSub's constructor");
		}
		
		//子类中的method1方法会覆盖掉父类中的method1方法
		public void method1(){
			System.out.println("method1 in InSub");
			super.method1();
		}
	}
}

 

package org.lgy.study.main;

import org.lgy.study.innerclass.InnerClassInheritance;

public class InnerClassMain{
	public static void main(String[] args){
		InnerClassInheritance.InBase inBase = null;
		inBase = new InnerClassInheritance().new InSub("*****");
		inBase.method1();
	}
}

 

二、子类不在父类所在的外部类中

 

1、父类为非静态内部类

package org.lgy.study.innerclass;

public class InnerClassInheritance{
	
	//如果父类是静态的,则子类既可以是静态的也可以是非静态的;
	//如果父类是非静态的,则子类只能是非静态的。
	public class InBase{
		public InBase(String msg){
			System.out.println("InBase's constructor : " + msg);
		}
		
		public void method1(){
			System.out.println("method1 in InBase");
		}
	}
}

 

package org.lgy.study.innerclass;

public class InSub extends InnerClassInheritance.InBase{
	public InSub(InnerClassInheritance obj){
		//因为子类InSub的父类是一个非静态内部类,所以在调用它的构造器时,必须使用一个其外部类的对象。
		//也就是说,必须显式创建一个外部类的对象并传入子类,然后在子类中使用这个外部类对象来调用
		//非静态内部类的构造器
		obj.super("*****");
		System.out.println("InSub's constructor");
	}
	
	public void method1(){
		//子类中的method1方法会覆盖掉父类中的method1方法
		System.out.println("method1 in InSub");
		//当创建完子类的对象之后,就可以像普通子类一样通过super来调用父类的方法
		super.method1();
	}
}

 

2、父类为静态内部类

package org.lgy.study.innerclass;

public class InnerClassInheritance{
	
	//如果父类是静态的,则子类既可以是静态的也可以是非静态的;
	//如果父类是非静态的,则子类只能是非静态的。
	public static class InBase{
		public InBase(String msg){
			System.out.println("InBase's constructor : " + msg);
		}
		
		public void method1(){
			System.out.println("method1 in InBase");
		}
	}
}

 

package org.lgy.study.innerclass;

//继承静态内部类就像继承普通类一样
public class InSub extends InnerClassInheritance.InBase{
	public InSub(){
		//因为父类是一个静态内部类,它属于外部类,调用它的构造器时无需创建对象
		super("*****");
		System.out.println("InSub's constructor");
	}
	
	public void method1(){
		//子类中的method1方法会覆盖掉父类中的method1方法
		System.out.println("method1 in InSub");
		//当创建完子类的对象之后,就可以像普通子类一样通过super来调用父类的方法
		super.method1();
	}
}

 

public class InnerClassMain{
	public static void main(String[] args){
		InnerClassInheritance.InBase inBase = new InSub();
		inBase.method1();
	}
}