海阔天空

当前时间为:
欢迎大家来到海阔天空https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

2020java教程:内部类与常用类

未分类
2020-08-17 15:16:59
1822677238@qq.com

手机扫码查看

2020java教程:内部类与常用类

内部类与常用类

内部类

内部类的分类
成员内部类、静态内部类、局部内部类、匿名内部类

什么是内部类
概念:在一个的内部在定义一个完整的类

class Outer{
    class Inner{
        
    }
}

特点:
编译之后可生成独立的字节码文件(Outer$Inner.class,Outer.class)
内部类可直接访问外部类的私有成员,而不破坏封装

class Outer{
    class Inner{
        int b;
        public void m2(){
            System.out.println("inner m2()"+b);
        }
    }
}

可为外部类提供必要的内部功能组件

成员内部类
在类的内部定义,与实例变量、实例方法同级别的类

在外部类的一个实例部分,创建内部对象时,必须依赖外部类对象
Out out=new Oout();
Inner in=out.new Inner();

当外部类、内部类存在重名时,会优先访问内部类属性

class Outer{
    private int a=10;
    /**
    成员内部类,依赖内部对对象
    */
    class Inner{
        int a=20;
        public void m2(){
            int a=30;
            //内部类可以访问自身局部变量
            System.out.println(a);
            //内部类可以访问内部类的实例变量
            System.out.println(this.a);
            //内部类可以访问外部类实例变量
            System.out.println(Outer.this.a);
        }
    }
}

成员内部类不能定义静态成员


静态内部类

不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)

public class demos{
    public static void main(String[] args) {
        //外部类的静态属性
        System.out.println(Outer.a);
        //外部类的静态方法
        Outer.m1();
        //静态内部类 创建,不依赖外部类的对象
        //创建静态内部类对象时,可以直接通过完整名称进行创建
        Outer.Inner in=new Outer.Inner();
        //创建内部类对象后,访问实例属性和方法
        System.out.println(in.a);
        in.m2();
        //额外比成员内部类多了一个定义的内容(静态属性和静态方法)
        //通过外部类类名.内部类类名.内部类的静态属性
        System.out.println(Outer.Inner.str);
        //通过外部类类名.内部类类名.内部类的静态方法
        Outer.Inner.m3();
    }
}
class Outer{
    static int a=10;
    static class Inner{
        int a=20;
        static String str="abc";
        public void m2(){
            System.out.println("Inner m2()");
        }
        public static void m3(){
            System.out.println("Inner m3()");
        }
    }
    static void m1(){
        System.out.println("Outer m1()");
    }
}

局部内部类

定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
局部内部类访问外部类当前方法的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
限制类的使用范围

匿名内部类

没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或实现一个接口
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
优点:减少代码量
缺点:可读性较差

public class demos{
    public static void main(String[] args) {
        Teacher t = School.RandomT(3);
        t.tech();
    }
}
class School{
    public static Teacher RandomT(int n){
        class Gt extends Teacher{
            @Override
            public void tech() {
                System.out.println("高级老师正在上课。。。");
            }
        }
        Teacher t=null;
        if(n%2==0){
            //匿名内部类
            t=new Teacher(){
                @Override
                public void tech() {
                    System.out.println("初级老师正在上课。。。");
                }
            };
        }else{
            t=new Gt();
        }
        return t;
    }
}
abstract class Teacher{
    public abstract void tech();
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注