• Java第十三天,内部类


    内部类

    一、①成员内部类、②局部内部类包含③匿名内部类

    1、内部类用外部类属性和方法的时候,可以随意进行访问。

    2、外部类用内部类属性和方法的时候,需要通过内部类对象访问。

    3、在编译成class文件的时候,内部类会用 $ 符号标志。形式如下:

    外部类 $ 内部类

    二、成员内部类

    1.如何定义成员内部类?

    修饰符 class 外部类名{

          ......

          修饰符 class 内部类名{

                ......

          }

    }

    2.如何使用成员内部类?

    ①间接方式:外部类的方法中使用内部类,通过调用外部类访问外部类的方法而间接使用内部类。

    ②直接方式:外部类.内部类 对象名 = new 外部类().new 内部类()

    eg:

    Animal.Dog dog = new Animal().new dog();

    3.如果内部类和外部类初现同名变量,内部类中应该如何访问外部类的同名变量

    外部类.this.同名变量

    eg:

    pubilc class Animal{

          int age = 2;

          public class Dog{

                 Animal.this.age = 3;

          }

    }

    三、局部内部类

    定义在方法内的类,成为局部内部类

    只有方法内可以使用,出了这个方法就不能用了。

    局部内部类如果要访问所在外部类成员方法的变量,则这个变量必须是被final修饰的不可变 变量(原因:new的对象是在堆内存,但是局部变量和方法同在栈内存,方法调用结束后会被回收,但是局部对象(堆内存)不会。为了防止局部对象访问变量失败,必须复制局部变量值(不可改变))。

    四、匿名内部类(属于局部内部类)

    如果接口的实现类或者父类的子类只需要使用一次,那么就可以省略掉该类的定义,而改用匿名内部类。

    匿名内部类定义格式如下:

    接口 对象名 = new 接口(){

          //覆盖重写所有抽象方法

    };

    抽象类 对象名 = new 抽象类(){

          //覆盖重写所有抽象方法

    };

    new 接口(){

          //覆盖重写所有抽象方法

    };

    new 抽象类(){

          //覆盖重写所有抽象方法

    };

    注意

    前两个是匿名内部类但却不是匿名对象。

    后两个是匿名内部类同时也是匿名对象。

    五、匿名内部类注意事项:

    ① 匿名内部类在创建对象的时候,只能使用一次。也就是说每创建一个对象,都得实现一次接口或者抽象类。

    ② 匿名对象在使用方法的时候,只能调用一次。

    六、内部类修饰权限规范

      外部类 成员内部类 局部内部类
    public YES YES NO
    protected NO YES NO
    (default) YES YES NO
    private NO YES NO

    从表中我们可以得到信息,外部类只允许使用public和默认(不写)修饰;成员内部类允许所有类型的权限修饰符;局部内部类不允许使用任何权限修饰符(不写任何关键字,但是意义也不等同于“default”)。

    七、代码:

    Usb抽象类代码:

    public abstract class UsbAbs {

        public abstract void inPut();
    }

    Usb接口代码:

    public interface UsbInt {

        public abstract void outPut();
    }


    电脑类代码:

    public class Computer {

        public static void main(String[] args) {

            new UsbAbs(){

                @Override
                public void inPut() {

                    System.out.println("优盘已经插入。");
                }
            }.inPut();

            new UsbInt(){

                @Override
                public void outPut(){

                    System.out.println("优盘已经拔出");
                }
            }.outPut();

            UsbAbs usbAbs = new UsbAbs() {
                @Override
                public void inPut() {

                    System.out.println("优盘再次被插入");
                }
            };

            UsbInt usbInt = new UsbInt() {
                @Override
                public void outPut() {

                    System.out.println("优盘再次被拔出");
                }
            };

            usbAbs.inPut();
            usbInt.outPut();
        }
    }


  • 相关阅读:
    c++ primer 中讲的顶层const 和 底层 const 理解
    github 0 学习
    MySQL 0 学习
    c++11 move构造函数和move operator 函数 学习
    c++11 多线程 1
    c++ 多线程 0
    学习 emplace_back() 和 push_back 的区别 emplace_back效率高
    crontab执行脚本失败问题
    lucene 排序
    maven 内置变量
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700536.html
Copyright © 2020-2023  润新知