成员内部类: 1.位置 class 外部类名{ class 内部类名{} }2.外部类只能使用 public default 修饰
成员内部类 可以被四种权限修饰符修饰
3.在内部类中可以直接使用外部类的所有资源4.外部类中可以使用内部类资源
5.可以采用内部类实现多继承的效果
让内部类 外部类都去继承另一个类6.内部类中不能声明静态的资源 但是可以有静态的常量
7.内部类会产生独立的字节码文件 命名方式
外部类名$内部类名.class
Outer$Inner.class8.如果内部类与外部类又同名的属性
访问外部类的属性 外部类名.this.属性名
成员内部类对象的创建的两种方式
必须用外部类对象.new的方式
Outer outer = new Outer()
方式一
Outer.Inner inner = outer.new Inner()
方式二
Outer.Inner inner = new Outer.new Inner()
静态成员内部类:
1.位置
class 外部类名{
static class 内部类名{
}
}
2.静态内部类可以有静态的资源
3.静态内部类 不能【直接】使用 外部类的非静态资源
可以创建外部类对象使用 外部类的非静态资源
4.可以实现多继承的效果
5.外部类使用静态内部类资源
静态资源 内部类名.资源名
非静态资源 内部类对象名.资源名
6.静态内部类又独立的字节码文件
命名方式 外部类名$内部类名.class
Outer$Inner.class
7.使用内部类资源
7.1内部类静态资源
外部类名.内部类名.资源名;
7.2内部类非静态资源
外部类名.内部类名 对象名 = new 外部类名.内部类名();
Outer.Inner inner = new Outer.Inner();
局部内部类:
位置:方法内
1.局部内部类使用外部类资源
1.1 如果局部内部类在普通方法中 可以直接使用外部类所有资源
1.2 如果局部内部类在静态普通方法中 可以直接使用外部类静态资源
2.局部内部类 只能被 权限修饰符 default 修饰 不能使用static 可以使用 final abstract3.局部内部类中不能有静态的资源 但是可以有静态常量
4.局部内部类也会产生独立的字节码文件 命名方式
外部类名$序号内部类名.class
Outer$1A.class
Outer$2A.class 序号从1开始5. 如果局部内部类中 使用了方法中的局部变量 那么 此变量 会被final修饰
jdk8之前 手动添加final
jdk8(含)之后 自动添加final
package com.atguigu.innerclass.in3;
public class Test {
public static void main(String[] args) {
A a = getValue();// A a = new B();
int num = a.getNum();
System.out.println("num = " + num);
}
public static A getValue(){
int m = 10;
class B implements A{
@Override
public int getNum() {
return m;
}
}
B b = new B();
return b;
}
}
interface A{
int getNum();
}
public static void main(String[] args) {
int m = new Object(){
@Override
public int hashCode() {
return 10;
}
}.hashCode();
String s = new Object(){
@Override
public int hashCode() {
return 10;
}
}.toString();
System.out.println(s);
}
匿名内部类:
没有名字的内部类
1.创建匿名内部类的形式
1.1 new 类名(构造器){};
1.2 new 接口名(){};
2.创建匿名内部类 会有两个作用
2.1创建了该类/接口的匿名子类
2.2创建了该/接口匿名子类对象3.匿名内部类会生成独立的字节码文件
命名方式 外部类名$序号.class
Test$1.class4.匿名内部类是特殊的局部内部类 在方法中