博客
关于我
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 主从同步文档的大坑
查看>>
mysql 主键重复则覆盖_数据库主键不能重复
查看>>
Mysql 事务知识点与优化建议
查看>>
Mysql 优化 or
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>