Java 内部类(成员内部类,静态内部类,局部内部类,匿名内部类)

   在 Java 中,在一个类中定义的类称为内部类。内部类分为:成员内部类,静态内部类,局部内部类,匿名内部类。


1、成员内部类

   成员内部类需要依靠外部类,只有创建了外部类才能创建成员内部类,成员内部类有个隐式引用指向外部类。我们可以类比类的成员属性和方法来分析成员内部类的特性。

成员内部类的定义:

//外部类
public class Outer{
    //成员内部类
    class Inner{
        
    }
}
成员内部类可以定义的属性和方法

   成员内部类可以定义成员变量,成员方法,类常量。不能定义静态变量和方法。

成员内部类对外部类的访问

   可以访问外部类的所有变量和方法。

外部类对成员内部类的访问

   对于成员内部类中的成员属性和方法必须通过实例对象访问,而对于类常量可以通过类名直接访问。

成员内部类的创建
  • 外部类外部创建

    静态方法中创建:
       外部类.内部类 对象名 = new 外部类().new 内部类();
       Outer.Inner in = new Outer().new Inner();

    非静态方法中创建:
       外部类.内部类 对象名 = new 外部类().new 内部类();
       Outer.Inner in = new Outer().new Inner();

  • 外部类内部创建

    静态方法中创建:
       外部类.内部类 对象名 = new 外部类().new 内部类();
    ​    Outer.Inner in = new Outer().new Inner();

    非静态方法中创建:
    ​    内部类 对象名 = new 内部类();
    ​    Inner in = new Inner();

代码示例:

//外部类
public class Outer {

    String outerProperty = "外部类全局属性";
    static String outerStaticProperty = "外部类静态属性";

    public void outerMethod(){

        Inner inner = new Inner();

        System.out.println("访问外部类成员方法");
    }
    public static void outerStaticMethod(){

        Outer.Inner in = new Outer().new Inner();

        System.out.println("访问外部类静态方法");
    }
	
	//成员内部类
    class Inner{

        String innerProperty = "内部类全局属性";
        static final String constantProperty = "内部类类常量";

        public void innerMethod(){
            System.out.println( outerStaticProperty );
            System.out.println(outerProperty);
            outerStaticMethod();
            outerMethod();

        }
    }

    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();
        inner.innerMethod();
    }
}

class OtherClass{
    public static void main(String[] args) {
        Outer.Inner in = new Outer().new Inner();
    }
}

2、静态内部类

   静态内部类需要依靠外部类,可以直接创建。我们可以类比类的静态属性和方法来分析静态内部类的特性。

静态内部类的定义:

//外部类
public class Outer{
    //静态内部类
    static class Inner{
        
    }
}
静态内部类可以定义的属性和方法

   因为静态内部类独立于外部类,可以定义正常类的所有属性和方法。

静态内部类访问外部类

   对于静态属性和方法可以直接访问,对于非静态属性和方法需要通过外部类实例进行访问。

外部类对静态内部类的访问

   对于静态属性和方法,可以通过静态内部类类名直接访问。对于非静态属性和方法,必须通过实例对象访问。

静态内部类的创建
  • 外部类外部创建

    静态方法中创建:
       外部类.静态内部类 对象名 = new 外部类.静态内部类();
       ​Outer.Inner in = new Outer.Inner();

    非静态方法中创建:
       外部类.静态内部类 对象名 = new 外部类.静态内部类();
       Outer.Inner in = new Outer.Inner();

  • 外部类内部创建

    静态方法中创建:
       静态内部类 对象名 = new 静态内部类();
       Inner in = new Inner();

    非静态方法中创建:
       静态内部类 对象名 = new 静态内部类();
       Inner in = new Inner();

代码示例:

//外部类
public class Outer {

    String outerProperty = "外部类全局属性";
    static String outerStaticProperty = "外部类静态属性";

    public void outerMethod(){
        System.out.println("访问外部类成员方法");

        System.out.println(Inner.innerStaticProperty);  //访问内部类静态属性
        Inner.innerStaticMethod();  //访问内部类静态方法

        Inner inner = new Inner();  //创建内部类,访问全局属性和方法
        System.out.println(inner.innerProperty);
        inner.innerMethod();
        
    }
    public static void outerStaticMethod(){

        System.out.println("访问外部类静态方法");
    }
	
    //静态内部类
    static class Inner{

        String innerProperty = "静态内部类全局属性";
        static final String constantProperty = "静态内部类类常量";
        static String innerStaticProperty = "静态内部类静态属性";

        public void innerMethod(){
            System.out.println(outerStaticProperty);    //访问外部类静态属性
            outerStaticMethod();    //访问外部类静态方法

            Outer outer = new Outer();  //创建外部类,访问全局属性和方法
            System.out.println(outer.outerProperty);
            outer.outerMethod();
        }
        public static void innerStaticMethod(){
            System.out.println("静态内部类静态方法");
        }
    }
}

class OtherClass{
    public static void main(String[] args) {
        //创建内部类
        Outer.Inner inner = new Outer.Inner();  
    }
}

3、局部内部类

   局部内部类是定义在一个方法或者作用域中的类。我们可以类比方法中的局部变量来分析局部内部类的特性。

局部内部类的定义:

//外部类
public class Outer {
    public void outerMethod(){
		//局部内部类
        class Inner{
            
        }
    }
}
局部内部类可以定义的属性和方法

   局部内部类可以定义成员属性,类常量,成员方法。不能定义静态属性和方法。

局部内部类访问外部类

   外部类属性和方法可以直接访问。

外部类对局部内部类的访问

   局部内部类只能由创建它的方法访问,对创建它的方法以外是与世隔绝的。

局部内部类的创建

   只能在局部内部类所在的方法内创建:

局部内部类 类名 = new 局部内部类();
​ Inner in = new Inner();

其他特性

​ 1)、在访问局部内部类所在方法的形参时,形参必须是final修饰的。JDK8以前必须显示声明final,JDK8以后不用声明,默认为final修饰。

​ 2)、局部内部类不能指定访问修饰符(public、private、protected),不能被static修饰。

代码示例:

//外部类
public class Outer {

    String outerProperty = "外部类全局属性";
    static String outerStaticProperty = "外部类静态属性";


    public void outerMethod(int n){
        System.out.println("访问外部类成员方法");
		
        //局部内部类
        class Inner{
            String innerProperty = "内部类全局属性";
            static final String constantProperty = "内部类常量";

            public void innerMethod(){
                System.out.println(outerStaticProperty); //访问
                System.out.println(outerProperty);
                outerStaticMethod();
//                n = 2; n被final修饰,再次赋值编译报错
            }
        }

        new Inner().innerMethod();

    }
    public static void outerStaticMethod(){

        System.out.println("访问外部类静态方法");

    }

    public static void main(String[] args) {
        Outer o = new Outer();
        o.outerMethod(1);
    }
}

4、匿名内部类

   假如只创建这个类的一个实例,就不必命名了。匿名内部类拥有局部内部类的所有特性,一般在接口中创建一个接口对象或类对象,本质是对接口或者类的继承,然后对继承方法的实现或者重写。

代码示例:

public class Outer {

    String outerProperty = "外部类全局属性";
    static String outerStaticProperty = "外部类静态属性";


    public void outerMethod(){
        System.out.println("访问外部类成员方法");

        new MyInterface(){
            @Override
            public void test() {
                System.out.println("调用局部内部类的test方法");
            }
        }.test();
        
    }
    public static void outerStaticMethod(){

        System.out.println("访问外部类静态方法");

    }

    public static void main(String[] args) {
        Outer o = new Outer();
        o.outerMethod();
    }
}

interface MyInterface{
    void test();
}



——THE END——
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值