内部类

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

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

    }

}

Java第十三天,内部类的更多相关文章

  1. “全栈2019”Java第九十三章:内部类应用场景(迭代器设计模式)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. Java的四种内部类

    Java的四种内部类包括如下: 成员内部类 静态内部类 局部内部类 匿名内部类 成员内部类: 定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法 ...

  3. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  4. C#的匿名委托 和 Java的匿名局部内部类

    .NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...

  5. Java面向对象 Object类 内部类

     Java面向对象 Object类    内部类 知识概要:                 一:Object类                 二:内部类 匿名内部类的写法 1.Object O ...

  6. Java的四种内部类(含代码实例)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  7. “全栈2019”Java第九十章:内部类可以向上或向下转型吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第十三章:基本数据类型

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第二十三章:流程控制语句中决策语句switch上篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

随机推荐

  1. Oracle数据库使用sysdba登陆时出现ORA-01031: insufficient privileges问题

    今天在自己本本上装上了oracle数据库,然而在命令框登录时 用 sqlplus / as sysdba   时却出现了: insufficient privileges问题 原因就是没有加入ora_ ...

  2. Git&sourceTree软件安装、使用说明及遇到问题解决

    一.软件版本 1.Git版本为1.9.5 2.Source版本为1.5.2 二.软件安装步骤 1.Git安装步骤 1)双击Git安装文件进入下图界面,单击Next 2)继续Next 3)进入Selec ...

  3. table 上下左右 4根线的写法 :before :after 他们就能把td里面右下的那颗线给盖上 还有body和header横向滚动的联动 || 不能把body套在header上是为了上header表头固定 || 还有表头header的右侧overflow-y 是否出现滚动条的位置 记得有一个$nextTick 要不然会获取不到高度 高度就为0了 || 横向滚动条纵向滚动条

    table 上下左右 4根线的写法 <!--* @description 重点查核人员表!--><template> <div class="keyChecke ...

  4. 初学嵌入式Linux

    初学嵌入式Linux,感觉需要学习的东西太多了.把学习过程中的收获和问题记录在这里,算是一份经验吧.     前面利用开发板带的现成的东西step by step让Linux 2.4.19在开发板上跑 ...

  5. 使用vue构建一个可视化大数据平台

    使用vue全家桶以及v-charts和datav实现一个github可视化大数据界面展示,没有设计搞的原因,只能忽略设计编写一下界面, 用户只需要登录的时候填写自己github用户名.就可以看到数据展 ...

  6. Nginx 入门及基本命令行操作

    Nginx 介绍 Nginx 是一个高性能的 Web 服务器,从 2001 年发展至今,由于 Nginx 对硬件和操作系统内核特性的深度挖掘,使得在保持高并发的同时还能够保持高吞吐量.Nginx 还采 ...

  7. MySQL笔记(3)-- SQL分析

    Linux服务器安装MySQL后,直接命令mysql进入服务,需进行修改: /usr/bin/mysqladmin -u root password 123456 设置开机自启动: chkconfig ...

  8. Go语言defer分析

    什么是defer? defer语句是专门在函数结束以后做一些清理工作的.我们先举一个例子来更好的理解,现在有一个函数,它的作用是把一个文件内容拷贝到另一个文件. func CopyFile(dstNa ...

  9. gRPC(2):客户端创建和调用原理

    1. gRPC 客户端创建流程 1.1 背景 gRPC 是在 HTTP/2 之上实现的 RPC 框架,HTTP/2 是第 7 层(应用层)协议,它运行在 TCP(第 4 层 - 传输层)协议之上,相比 ...

  10. MySQL学习(3)

    一 SQL语句 1. 数据库级别(*) 显示全部数据库:show databases; 创建数据库:create database '数据库名字’; 使用数据库:use '数据库名字'; 删除数据库: ...