JAVA内部类
内部类就是将类定义在一个类中
注意:
1.内部类都可以直接访问外部类所有的成员,就像访问自己的,没有限制
2.外部类如果想要访问内部类数据,就需要创建对象
3.内部类中的this指的是内部类实例的对象,要想调用外部类的实例对象外部名.this的方式获得
4.内部类中不能有静态成员,因为内部类的实例对象就是外部类实例对象的一个成员
根据位置的不同分为成员内部类和局部内部类
成员内部类
成员内部类就是定义在外部类方法外类中的类
可以在测试类中用 外部类名.内部类名 对象名=new 外部类名().内部类名() 直接访问内部类数据
成员内部类可以用 private static 修饰
public class Mytest {
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
System.out.println("============");
Outer.Inner inner = new Outer().new Inner();
inner.show();
}
}
class Outer{
int a=10;
private int b=20;
class Inner{
int c=30;
private int d=40;
int a=60;
public void show(){
System.out.println(a);
System.out.println(b);
System.out.println(Outer.this.a);
}
}
public void show(){
Inner inner = new Inner();
System.out.println(inner.c);
System.out.println(inner.d);
}
}
静态内部类
当在成员内部类用static修饰类时,就变成静态内部类
静态内部类访问外部类数据必须用static修饰
内部类的成员方法可以是静态也可以是非静态的
成员内部类被static修饰后在测试类中直接访问的格式:
外部类名.内部类名 对象名=new 外部类名.内部类名()
public class MyTest {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.show();
}
}
class Outer{
static int a=10;
static class Inner{
public void show(){
System.out.println(a);
}
}
}
因为静态内部类和静态方法一样只能访问其他静态的成员,而不能访问实例成员。因此静态内部类和外部类联系就少了,他们之间可能也就是命名空间上的关系
局部内部类
局部内部类定义在外部类的方法中的类
局部内部类一样可以访问所有外部类的成员,没有限制
局部内部类在外界没有直接创建的语法,可以间接调用局部内部类中的数据
局部内部类想要访问局部变量必须用final修饰
因为局部内部类是随着方法的调用完毕而消失的,这个时候局部内部类对象没有立马从堆内存中消失,还要使用那个变量。为了让数据能够继续使用,就用final修饰,这样在堆内存中存储的就是一个常量值。
JDK1.8之后final系统会默认加上
public class MyTest3 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
}
class Outer{
int a=10;
private int b=20;
public void show(){
class Inner{
Inner(){
System.out.println(a);
System.out.println(b);
}
}
Inner inner = new Inner();
}
}
匿名内部类
匿名内部类:就是局部内部类的简写形式。通常都定义在方法种,因为只能调用一次。
匿名内部类的定义格式:
new 对象名或接口名(){
重写方法
};
匿名内部类本质上就是继承了该类或者实现了该接口的子类匿名对象
public class MyTest {
public static void main(String[] args) {
MyInterface myInterface=new MyInterface() {
@Override
public void show() {
System.out.println("我重写了我的接口方法");
}
};
myInterface.show();
test(new MyInterface() {
@Override
public void show() {
System.out.println("我重写了接口的show方法");
}
});
}
public static void test(MyInterface myInterface){
myInterface.show();
}
}
interface MyInterface{
public void show();
}