内部类

内部类:在一个类的内部在定义一个完整的类。(套娃dog)

特点:

  • 编译之后可生成独立的字节码文件。
  • 内部类可直接访问外部类的私有属性,而不破坏封装。
  • 可为外部类提供必要的功能组件。

内部类分为:成员内部类、静态内部类、局部内部类和匿名内部类。


 

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

      外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。

      当外部类与内部类属性重名时,优先访问内部类属性。

      内部类里面不能包含静态成员,但可以包含静态常量

创建对象方式以及重名时如何调用外部类方式如下:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();


public class Outer {

    private int id = 110;
    private String name = "张三";

    public void out(){
        System.out.println("外部类的方法");
    }

    public class Inner{

        private int id = 120;
        private  String name = "李四";


        public void in(){

            System.out.println("内部类的方法");
        }

        //获得外部类的私有属性
        public void getid(){

            System.out.println(id);
        }

        //当外部内于内部类重名时,优先获取内部类的信息。
        public void show(){
            System.out.println(name);
            System.out.println(Outer.this.name);//获取外部类信息。
        }

    }
}

 


静态内部类:不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员

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

 

public class Outer {

    private String name = "张三";
    private int age = 18;

    //静态内部类和外部类同级
    static class Inner{
        private String address = "江西";private static int count = 19;

        public void show(){
            //访问外部类属性
            Outer outer = new Outer();
            System.out.println(outer.name);

            //调用静态内部类的属性
            System.out.println(Inner.count);//Inner可以不加
        }
    }
}

局部内部类:定义在外部类的方法之中,作用范围和创建对象范围仅限于当前方法

//局部内部类
public class Outer {
    private int phone = 1327783241;

    public void show1(){

        //定义局部变量
        String name = "桐人";

        class Inner{//与方法同级

            private String address = "刀剑神域";

            public void show2(){
                //访问外部类属性
                System.out.println(phone);
                //或者这样访问System.out.println(Outer.this.phone);

                System.out.println(this.address);//或address

                //访问局部变量,jdk1.7要求变量必须是常量final,jdk1.8之后final可省略  自动添加
                System.out.println(name);

            }
        }
        //创建局部内部类对象
        Inner inner = new Inner();
        inner.show2();
     //然后在main方法中定义Outer的对象 通过对象调用内部类所在的方法就可以啦 } }

匿名内部类:没有类名的局部内部类(一切特征都与局部内部类相同)

      必须继承一个父类或者实现一个接口。

//在Usb接口中声明一个service();方法


public class TestUsb {
    public static void main(String[] args) {

        //匿名内部类(相当于创建了一个局部内部类)
        Usb usb = new Usb(){

            @Override
            public void service() {
                System.out.println("键盘链接成功,开始工作。。。");
            }
        };
        usb.service();
    }
}

 

 

 

 

 

  

posted @ 2022-03-10 18:37  长空扯淡  阅读(65)  评论(0)    收藏  举报