博客
关于我
2021-03-13
阅读量:201 次
发布时间:2019-02-28

本文共 2860 字,大约阅读时间需要 9 分钟。

4大内部类的解析

首先我们要先了解java类的主要组成部分。

类的成员:

1.属性

普通属性静态属性

2.方法

普通方法静态方法

3.构造器

4.代码块

普通代码块静态代码块

5.内部类:

在一个类的内部在写一个类-内部类    (1).普通成员内部类  普通属性      (2).静态成员内部类  静态属性    查看源码	(3).局部内部类    局部变量	(4).匿名内部类   匿名对象 参照

内部类的作用:

1.可以对外部类的功能进行拓展 且 可以不被外界访问
2.间接实现多继承 内部类与外部类都去继承一个类

(1).普通成员内部类:

普通成员内部类:

1.外部类 只能使用 public default 修饰
2.内部类可以被四种权限修饰符修饰
3.内部类中不能有静态的属性 但是可以存在 静态的常量
4.内部类中不能有静态的方法
5.内部类中可以直接使用外部类中的资源 属性 方法 静态非静态都可以
6.外部使用内部类的资源
非静态资源 创建内部类对象才能访问
静态资源 内部类名.属性名
7.在外部类的静态方法内 不能直接创建内部类对象

8.在外部直接创建内部类对象的方式

外部类名.内部类名 变量名 = 外部类对象.new 内部类对象();
Person.Inner inner = new Person().new Inner();

9.内部类编译后 产生的字节码文件 命名规则

外部类名 内 部 类 名 P e r s o n 内部类名 Person PersonInner
内部类也会生成独立的字节码文件

(2).静态成员内部类:

静态成员内部类:

1.声明方式 在外部类中 写 static class 类名{
}
2.内部类中可以存在静态的属性
3.内部类中 不能直接使用外部类中的 非静态资源 需要创建外部类对象才能使用
4.在外部类的静态方法内 可以创建内部类对象
可以通过 内部类对象 调用内部类中 非静态资源
内部类名 调用 内部类中 静态资源
5.在外部类中直接创建内部类对象
外部类名.内部类名 变量名 = new 外部类名.内部类名();
变量名:内部类对象
Outer.Inner inner = new Outer.Inner();
6.内部类会生成独立的字节码文件 命名方式
外部类名$内部类名
7.直接创建外部类对象 是否会引发 静态内部类的初始化?
如果没有使用内部类中的资源 那不会进行内部类的初识化
如果只是使用内部类中的资源 也不会触发外部类的初始化

(3).局部内部类:

局部内部类: 参照 局部变量

1.如何声明局部内部类
在方法中 新建一个类
2.局部内部类地位比较低 使用外部类的什么资源 由所在方法决定
静态方法 可以使用外部类中的静态资源
非静态方法 可以使用外部类中的所有资源
3.局部内部类中的不能有静态属性但是可以有静态的常量

4.使用内部类中的资源 需要先执行外部类的方法 创建内部类的对象

通过内部类对象.相关资源

5.局部内部类也会生成独立的字节码文件 字节码文件的命名方式

外部类名$序号内部类名 序号从1开始
Outer$1Inner
Outer$2Inner

6.当 局部内部类中的方法 使用 所在外部类的局部变量时 该局部变量 会自动被final修饰

jdk1.8自动加final

(4).匿名内部类:

匿名内部类:

没有名字的内部类
什么作用:
节约代码

如何创建匿名内部类:

new 类(){   } new 接口(){   }    1.创建了一个没有名字的匿名子类    2.创建了该匿名子类对象

注意:

1.匿名内部类 就是没有名字的局部内部类
2.匿名内部类能使用外部类什么资源 要看所在的方法是否静态
静态方法 只能使用静态资源
非静态方法 能使用所有资源
3.匿名内部类使用了所在方法的局部变量 则此变量 会被final修饰
4.匿名内部类也会生成独立的字节码文件
命名方式 外部类名$序号
Test2$1.class
Test2$2.class
Test2$3.class

示例:

public class Test2 {       static String  name = "Test2";    int age  =10;    public static void main(String[] args) {           int num = 10;        //创建了一个Person的匿名子类 并且完成了该匿名子类对象的创建        new Person() {           }.eat();        new Person("李白", 20) {           }.eat();        new Animal() {               @Override            void eat() {                   System.out.println(name);                System.out.println("小猫吃饭");                System.out.println(num);            }        }.eat();        new Fly() {               @Override            public void fly() {                   System.out.println("超人飞");            }        }.fly();    }}interface Fly {       void fly();}abstract class Animal {       abstract void eat();}class Person {       String name;    int age;    public void eat() {           System.out.println(name + "Person eat");    }    public Person() {       }    public Person(String name, int age) {           this.name = name;        this.age = age;    }    @Override    public String toString() {           return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }}

转载地址:http://nini.baihongyu.com/

你可能感兴趣的文章
MySQL:某个ip连接mysql失败次数过多,导致ip锁定
查看>>
MySQL:索引失效场景总结
查看>>
Mysql:避免重复的插入数据方法汇总
查看>>
MyS中的IF
查看>>
M_Map工具箱简介及地理图形绘制
查看>>
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
M×N 形状 numpy.ndarray 的滑动窗口
查看>>
m个苹果放入n个盘子问题
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N!
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
Nacos Client常用配置
查看>>
nacos config
查看>>
Nacos Config--服务配置
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>
Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
查看>>
Nacos 启动报错[db-load-error]load jdbc.properties error
查看>>