Java学习笔记(四):内部类

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Java学习笔记四内部类

内部类 在一个类的内部定义一个类。可以直接访问外部的全部资源包括私有成员

一、局部内部类

定义在外部类的局部位置比如方法有类名

  • 可以直接访问外部类的所有成员包括private

  • 不能添加访问修饰符可以加final关键字就相当于一个局部变量

  • 外部类和局部内部类的成员重名时遵循就近原则如果想访问外部类使用外部类名.this.成员访问

  • 作用域在定义的方法或代码块中本质仍然是一个类类的相关内容仍然适用

  • 外部类访问局部内部类的成员需要先创建对象再访问需要在其作用域内

class Outer{
    private int n1 = 100;

    private void m2(){}

    public void m1(){

        final class Inner{
            public void f1(){
                System.out.println("n1="+n1);
                System.out.println("n1="+Outer.this.n1);
                m2();
            }
        }

        Inner inner = new Inner();
        inner.f1();

    }

}

二、匿名内部类

在new对象的时候给出类的定义形成了匿名类匿名类可以继承某类也可以实现某接口。

匿名类本质还是类该类没有类名系统分配被隐藏同时还是一个对象。作用是简化开发

new 类或接口(参数列表){类体};

  • 可以直接访问外部类的所有成员包括private

  • 不能添加访问修饰符就相当于一个局部变量

  • 作用域在定义的方法或代码块中

  • 外部类和局部内部类的成员重名时遵循就近原则如果想访问外部类使用外部类名.this.成员访问

  • 外部类不能访问匿名内部类在设计中可以将匿名类作为实参直接传递

在创建匿名内部类时自动分配了一个类名创建了一个实例并把地址返回给对象匿名内部类使用一次就不能使用。

package innerClass;

public class AnonymousinnerClass {
    public static void main(String[] args) {
        Outer01 outer01 = new Outer01();
        outer01.method();

    }
}

class Outer01{
    private int n1 = 10;
    public void method(){
        
        /*在底层会给匿名类分配一个类名
        class Outer01$1 implements A{
            @Override
            public void cry() {
                System.out.println("cry()");
            }
        }
        */
        
        
        A a = new A(){//对象的编译类型是A
            @Override
            public void cry() {
                System.out.println("cry()");
            }
        };
        
        System.out.println(a.getClass());//获取对象a的运行类型
        a.cry();

    }

}


interface A{
    public void cry();
}
class innerClass.Outer01$1
cry()
package innerClass;

public class AnonymousinnerClass {
    public static void main(String[] args) {
        Outer01 outer01 = new Outer01();
        outer01.method();

    }
}

class Outer01{
    public void method(){
        Father father = new Father("YYY"){

        };
        System.out.println(father.getClass());
    }
}



class Father{
    public Father(String name) {

    }
    public void test(){
    }
}

class innerClass.Outer01$2

匿名内部类既是一个对象也是一个类既有定义类的特征也有创建对象的特征可以调用匿名内部类方法。

A a = new A(){//对象的编译类型是A
    @Override
    public void cry() {
        System.out.println("cry()");
    }
};
a.cry();


new A(){//对象的编译类型是A
    @Override
    public void cry() {
        System.out.println("cry()");
    }
}.cry();

三、成员内部类

定义在外部类的成员位置没有使用static关键字修饰。

  • 可以直接访问外部类的所有成员Private

  • 可以任意添加访问修饰符就是一个成员

  • 作用域为整个类体访问外部类直接访问外部类访问成员内部类先创建对象再访问

  • 外部类和局部内部类的成员重名时遵循就近原则如果想访问外部类使用外部类名.this.成员访问

class Outer02{
    private int n1 = 100;

    class Inner02{
        public void fun(){
            System.out.println(n1);
        }
    }
}
package MemberinnerClass;

public class memberinnerclass {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        Outer02.Inner02 inner02 = outer02.new Inner02();
        inner02.fun();
    }
}

class Outer02{
    private int n1 = 100;

    class Inner02{
        public void fun(){
            System.out.println(n1);
        }
    }
}

四、静态内部类

定义在外部类的成员位置使用static关键字修饰。

  • 可以直接访问外部类的所有成员Private但是不能直接访问非静态成员

  • 可以任意添加访问修饰符就是一个成员

  • 作用域为整个类体直接访问外部类中所有静态成员外部类访问静态内部类先创建对象再访问

  • 外部类和局部内部类的成员重名时遵循就近原则如果想访问外部类使用外部类名.成员访问

类的五大成员 属性、方法、构造器、代码块、内部类

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java