内部类~~

目录

成员内部类

静态内部类

局部内部类

匿名内部类


成员内部类

 1.成员内部类是什么?如何创建其对象?
·就是类中的一个普通成员,类似前面我们学过的普通成员变量、成员方法

外部类名.内部类名 对象名= new 外部类(…). new 内部类(…);
2.成员内部类的实例方法中,访问其他成员有啥特点?
.可以直接访问外部类的实例成员、静态成员
.可以拿到当前外部类对象,格式是:外部类名. this 。

package com.xinbao.d1_inner_class1;

public class Outer {
    private int age = 99;
    private static String a;
    //成员内部类
    public class Inner {
        private String name;
        public static String schoolName;//JDK16开始才支持定义静态成员变量
        private int age = 88;

        public void test() {
            System.out.println(age);//88
            System.out.println(a);//null

            int age = 66;
            System.out.println(age);//66
            System.out.println(this.age);//88
            System.out.println(Outer.this.age);//99
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    public void test2(){
        System.out.println(age);
        System.out.println(a);
    }
}
package com.xinbao.d1_inner_class1;

public class Test {
    public static void main(String[] args) {
        //目标:了解成员内部类和其他特点
        Outer.Inner in = new Outer().new Inner();
        in.test();
    }
}
E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=46006:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\oop-app5 com.xinbao.d1_inner_class1.Test
88
null
66
88
99

Process finished with exit code 0
静态内部类

1.什么是静态内部类?如何创建对象?有啥特点?
●有 static 修饰的内部类。
.外部类名.内部类名对象名= new 外部类.内部类(.…);
●可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。

package com.xinbao.d2_inner_class2;

public class Outer {
    private int age;
    public static String schooleName;
    //静态内部类
    public static class Inner{
        private String name;
        public static int a;

        public void test(){
            System.out.println(schooleName);
            //System.out.println(age);//错误
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    public static void test2(){
        System.out.println(schooleName);
        //System.out.println(age);//错误
    }
}
package com.xinbao.d2_inner_class2;

public class Test {
    public static void main(String[] args) {
        //目标:了解静态内部类
        Outer.Inner in = new Outer.Inner();//直接通过类名访问
        in.test();
    }
}
局部内部类

局部内部类是定义在方法中、代码块中、构造器等执行体中

package com.xinbao.d2_inner_class2;

public class Test2 {
    public static void main(String[] args) {
        class B{};
    }
    
    public static void go(){
        class A{};
        
        abstract class C{};
        
        interface D{};
    }
}
匿名内部类

就是一种特殊的局部内部类,所谓匿名,就是指程序员不需要为这个类声明名字

new 类或接口(参数值){

        类体(一般是方法重写)

};

特点:

本质就是一个子类,并会立即创建一个子类对象

作用:

可以更方便的创建出一个子类对象;匿名内部类通常作为一个参数传输给方法

例1:

package com.xinbao.d3_inner_class3;

public class Test {
    public static void main(String[] args) {
        //目标:认识匿名内部类,并掌握其作用
//        Animal a = new Cat();
//        a.cry();

        //1.把这个匿名内部类编译成一个子类,然后会立即创建一个子类对象出来
        Animal a = new Animal() {
            @Override
            public void cry() {
                System.out.println("喵喵喵~~");
            }
        };
        a.cry();//喵喵喵~~
    }
}

//class Cat extends Animal{
//
//    @Override
//    public void cry() {
//        System.out.println("喵喵喵~");
//    }
//}

abstract class Animal{
    public abstract void cry();
}

例2:

package com.xinbao.d3_inner_class3;

public class Test2 {
    public static void main(String[] args) {
        Swimming s1 = new Swimming(){
            @Override
            public void swim() {
                System.out.println("The dog is swimming.");
            }
        };
        go(s1);

        go(new Swimming() {
            @Override
            public void swim() {
                System.out.println("The cat is swimming.");
            }
        });
    }

    public interface Swimming{
        void swim();
    }

    public static void go(Swimming s){
        System.out.println("start-------------");
        s.swim();
    }
}


E:\JVsoft\Java\jdk-17\bin\java.exe -javaagent:E:\JVsoft\IntelliJIDEA2021.1.1\lib\idea_rt.jar=13185:E:\JVsoft\IntelliJIDEA2021.1.1\bin -Dfile.encoding=UTF-8 -classpath E:\JVsoft\code\out\production\oop-app5 com.xinbao.d3_inner_class3.Test2
start-------------
The dog is swimming.
start-------------
The cat is swimming.

Process finished with exit code 0

你可能感兴趣的:(java,开发语言)