一、父类和子类在同一个外部类中
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();
}
}