博客
关于我
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/

你可能感兴趣的文章
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>