内部类

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

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();

    }

}

最新文章

  1. chkdsk磁盘修复命令工具怎么用,怎样运行chkdsk工具修复?
  2. maven引入本地jar
  3. Three.Js学习第一天
  4. ubuntu中maven建的web项目不能将project facet设置为 dynamic web module 3.0
  5. 夺命雷公狗ThinkPHP项目之----企业网站30之网站前台头部导航的高亮显示
  6. Linux系统调用--mmap/munmap函数详解【转】
  7. php中读取文件内容的几种方法
  8. win10 64bit 安装scrapy-1.1
  9. django学习之Model(三)QuerySet
  10. 微信jssdk已无力吐槽
  11. C++在stack的deque实现
  12. C++ 11 学习3:显示虚函数重载(override)
  13. 【BZOJ4903】【UOJ#300】吉夫特(卢卡斯定理,动态规划)
  14. HDFS高可用性及其分布式系统思想基础
  15. (WF, Debug) System.Xaml.XamlObjectWriterException: Cannot create unknown type '{clr-namespace:xx;assembly=xx}xx'.
  16. 【VBA】合并多个excel文件
  17. shiro 实现自己定义权限规则校验
  18. 构建更好的HashMap
  19. LWIP应用指南学习。
  20. MySQL 5.6.20-4 and Oracle Linux DTrace

热门文章

  1. (转)浅析epoll – epoll例子以及分析
  2. Mybatis(一)Mybatis相关概念
  3. Java基础 - 原码、反码、补码
  4. Scapy编写ICMP扫描脚本
  5. Angularjs优点
  6. CF1324F Maximum White Subtree 题解
  7. 浅谈VUE,使用watch方法监听父组件传到子组件的数据。
  8. 服务器安装 mongodb
  9. effective-java学习笔记---静态工厂方法替代构造方法
  10. js实现动态球球背景