创建一个Computer抽象类:用来在Test类中创建匿名抽象类
package com.zhiyou;
public abstract class Computer {
int a = 1;
/**
* 不能够创建出抽象类的一个对象
*/
public abstract void online();
public abstract void watchTv();
}
创建一个外部类Outter,在这个外部类Outter的内部在创建一个内部类Inner,在不同的位置定义变量a,我们需要注意的是如何调用不同位置的变量a!
package com.zhiyou;
public class Outter {
public void a() {
int a = 3;
System.out.println("外部类a方法--" + this.a);
}
/**
* 嵌套的概念 除了变量和方法之外,我们还可以定义一个类 这个类就是内部类
*/
int a = 1;
class Inner {
int a = 2;
public void b() {
int a = 3;
// 不加任何描述的时候根据就近原则调用离他最近的变量
System.out.println("方法内部局部变量--" + a);
// this. 代表调用本类的成员变量或方法
System.out.println("内部类的成员变量--" + this.a);
// Outter.this. 代表调用外部类的成员变量或方法
System.out.println("外部类的成员变量--" + Outter.this.a);
// 调用方法的形式:方法名--()参数列表--分号
// a();
}
}
}
创建一个接口AAA用来创建接口的匿名内部类
package com.zhiyou;
public interface AAA {
}
创建测试类Test,用来输出
package com.zhiyou;
/**
* 同一个包下面,普通类创建对象时可以直接调用 但是内部类就需要使用import引入
*/
// import com.zhiyou.Outter.Inner;
public class Test {
/**
* 内部类
*
*/
public static void main(String[] args) {
// 生成的二进制字节码文件(.class文件)名称是Outter.class
// 那么它里面的内部类Inner生成的文件名称是Outter$Inner.class
Outter outter = new Outter();
// System.out.println(outter.a);
// outter.a();
/*
* 讲继承的时候说过:没有父类就没有子类 对于内部类也一样:没有外部类的对象就不能创建一个内部类的对象
*
* 创建内部类对象的方法:通过外部类的对象去创建内部类的对象
*/
// 写法1
Outter.Inner inner = outter.new Inner();
// 写法2
// 通过这种方式创建出来的外部类对象没有引用,是不能使用里面的变量和方法的
// 匿名:new Outter().new Inner();创建出来了一个外部类的对象,但是他没有引用,没用名字
Outter.Inner inner1 = new Outter().new Inner();
System.out.println(inner.a);
inner.b();
/**
* 不能够创建出抽象类的一个对象 匿名的概念
*
* 匿名内部类 这下面其实是有一个类的存在的,但是我们看不见类的任何影子 在编译后的目录中多出来一个 Test$1.class
*
* 相当于:创建出来了一个匿名内部类继承了抽象类Computer并实现了他的抽象方法 创建出了一个抽象类的子类的对象
*/
Computer computer = new Computer() {
public void watchTv() {
System.out.println("匿名内部类中的方法 看电视");
}
public void online() {
System.out.println("匿名内部类中的方法 上网");
}
};
System.out.println("抽象类中的变量 a" + computer.a);
computer.watchTv();
computer.online();
/*
* 匿名内部类的创建形式
*
* 不是new+构造方法
*
* new--抽象类或者接口名--()--{}实现抽象方法的地方--分号
* 接口是没有构造方法的的,抽象类有
*/
AAA a = new AAA() {
};
}
}