我们可以将一个类定义在另一个类或者一个方法的内部
class OuterClass{
public int data1=1;
public static int data2=2;//外部类可以定义静态属性
private int data3=3;
class InnerClass{
public int data4 = 4;
private int data6 = 6;
public void test(){
System.out.println("InnerClass::test()");
}
}
public void test(){
System.out.println("OuterClass:: test()");
}
// OutClass是外部类
// InnerClass是内部类
1.如何实例化实例内部类的对象?
正确做法:内部类必须有外部类的引用
public class Test {
public static void main(String[] args) {
//InnerClass innerClass = new InnerClass();//无法实例化
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
}
}
2.内部类无法创建static对象?
public static int data5 = 5;//不行
因为内部类需要外部类的调用,而static成员是不需要去实例化这个成员的,这样两个就打架了
可以加一个final,在编译的时候就确定了变成常量。
public static final int data5 = 5;//可以
3.内部类的可以直接访问外部类的变量,如果内部类有和外部类重名的变量,那么在内部类方法在使用该变量时优先调用内部类的变量
那我非要在内部类方法访问外部类的相同名称的变量,那就这么干
System.out.println(OuterClass.this.data1);//1
实例内部类,包含了两个this,一个是内部类的,一个是外部类的
内部类的字节码文件长这样
class Out {
public int data1 = 1;
public static int data2=2;
private int data3 = 3;
static class Innerclass{
public int data4 =4;
public static int data5 = 5;
private int data6 = 6;
public void test(){
System.out.println("InnerClass::test()");
}
}
public void test(){
System.out.println("Out: test()");
}
}
实例化:
public static void main(String[] args) {
Out.Innerclass innerclass = new Out.Innerclass();
innerclass.test();
}
在内部类方法中,自己的变量可以调,无法调用外部类中非static修饰的变量
那就在这个方法里面实例化外部类就可以调用外部类中非static修饰的变量
interface IA{
void test();
}
public class Test {
public static void main(String[] args) {
//实例化
IA a = new IA(){
@Override
public void test() {
System.out.println("这是重写了接口的方法!");
}
};
a.test();//调用
}
有一个类实现了IA接口,还重写了他的方法,再接口名称前面new一下,就是匿名内部类
另一种调用方法
new IA(){
@Override
public void test() {
System.out.println("这是重写了接口的方法!");
}
}.test();
局部内部类(用的很少)
只能在方法体内部使用
public void func(){
class AA{
public int a;
}
AA aa = new AA();
System.out.println(aa.a);
}