内部类
内部类: 写在一个类内部的类
java中允许将一个类A声明再类B中,则类A就是内部类, 类B称为外部类
为什么要有内部类: 简答来说 比如一个人有个大脑 但是这个人的大脑是这个人独有的不是别人有的,所以这个大脑我们放在自己内部不暴露出去,
那为什么不去用私有一个变量或者方法来代表这个类呢? 因为大脑有很多的用途可以思考问题 提供人体必需物质等多个属性和方法所以定义一个内部类,
来只所属于这个人类的本身
内部类的总结
* 内部类的分类,成员内部类(静态的非静态的)Vs局部内部类(方法内, 代码块内,构造器内) * * 成员内部类: * 一方面作为外部类的成员 * > 调用外部类的结构 * > 静态的内部类只能调用外部静态的方法 * > 可以被static修饰 * > 可以被四种不同权限修饰 * * * 另一方面作为一个类 * >类内可以定义属性,方法, 构造器等 * >可以被final修饰不可以被继承, 不被final修饰可以被继承 * > 可以被抽象abstract修饰 * * * 4:关注如下的3个问题: * a: 如何实例化内部类成员对象 * b:如何在成员内部类中区分外部类结构 * c: 开发中局部内部类的使用
public class InnerClassTest { public static void main(String[] args) { // 实现静态的成员内部类 PersonTestOne.InnTestTwo innTestTwo = new PersonTestOne.InnTestTwo(); //实现非静态的成员内部类,因为是非静态的需要先实例化对象 然后去调用内部的非静态内部类,就是有了对象用对象去调用内部结构 PersonTestOne personTestOne = new PersonTestOne(); PersonTestOne.InnTestOne innTestOne = personTestOne.new InnTestOne(); innTestOne.innermethod(); } } class PersonTestOne{ String name = "外部类的name"; int age = 30; public void eat(){ System.out.println("吃饭"); } //静态成员内部类 static class InnTestTwo{ }; // 非静态内部类 class InnTestOne{ String name = "老王"; int age; public void show(){ System.out.println("非静态内部类的show方法"); }; public void innermethod(){ method1(); System.out.println(this.name); // 调用内部类属性 System.out.println(PersonTestOne.this.name); //调用外部类属性 } }; public static void method1(){ //静态方法 System.out.println("我是外部类的静态方法"); } public void mthod(){ // 局部内部类 class aa{}; } { //局部内部类 class cc{}; } }
如何实例化外部中的静态内部类:
直接在使用外部类.静态内部类就直接实例化
// 实现静态的成员内部类 PersonTestOne.InnTestTwo innTestTwo = new PersonTestOne.InnTestTwo();
如何实例化非静态内部类
外部类 外部类对象= new 外部类(); 外部类对象.内部类 对象名 = 外部类对象.new. 内部类(); //实现非静态的成员内部类,因为是非静态的需要先实例化对象 然后去调用内部的非静态内部类,就是有了对象用对象去调用内部结构 PersonTestOne personTestOne = new PersonTestOne(); PersonTestOne.InnTestOne innTestOne = personTestOne.new InnTestOne();
如何调用内部类中与外部类同名的属性
public void innermethod(){ method1(); System.out.println(this.name); // 调用内部类属性 System.out.println(PersonTestOne.this.name); //调用外部类属性 }
在局部内部类中的方法中调用外部类的方法中的属性 这个属性在内部类中必须是final的不然就会报错
jdk7: 要求此属性显示的就是一个final
jdk8: 要求此方法可以省略final的声明
好比 这个属性在外部类的作用域中存在,内部类是另一个作用域 你想使用我 我给你一个copy的副本,这个副本是随着我外部类本身的作用域改变的 内部类拿的是副本不可以改变
声明局部内部类:
在一个方法中或者内部类中在声明的内部类就叫局部内部类 只在这一块区域生效
如何使用局部内部类
只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方 都不能使用该类
但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类 的父类或父接口类型
局部内部类的特
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但 是前面冠以外部类的类名和$符号,以及数字编号。 只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方 都不能使用该类。 局部内部类可以使用外部类的成员,包括私有的。
局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局 部变量的声明周期不同所致。 局部内部类和局部变量地位类似,不能使用public,protected,缺省,private
局部内部类不能使用static修饰,因此也不能包含静态成员
匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一 个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或 实现一个类。 格式: new 父类构造器(实参列表)|实现接口(){ //匿名内部类的类体部分 } 匿名内部类的特点 匿名内部类必须继承父类或实现接口 匿名内部类只能有一个对象 匿名内部类对象只能使用多态形式引用