- 内部类标识符:
每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生一个.class文件,但是它的名称却不是内部类的类名,而是有着严格限制:外围类的名字,加上$,再加上内部类名字
- 匿名内部类
也就是没有名字的内部类,其名称由Java编译器给出,一般是形如:外部类名称+$+匿名类顺序,没有名称也就是其他地方就不能引用,不能实例化,只用一次,当然也就不能有构造器。它通常用来简化代码编写
- 匿名内部的创建格式:
new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
}
-
匿名类分类
匿名类由于是一个new的结果,所以其实可以赋值给一个父类对象。因此可以分为两种匿名类,成员匿名类和局部匿名类(作为函数参数)。 -
使用匿名内部类前提条件
必须继承一个父类或实现一个接口当然也仅能只继承一个父类或者实现接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的引用。当然这个引用是隐式 -
匿名内部类使用的注意事项
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。同时要实现父类或接口中所有抽象方法,可以改写父类中的方法,添加自定义方法。
2、匿名内部类因为没有类名,可知匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内类生效。
5、因为在创建匿名内部类的时候,会立即创建它的实例,匿名内部类不能是抽象的,它必须要实现继承的类或者实现接口的类的所有抽象方法。
6、匿名内部类和外部类有同名变量方法)时,默认访问的是匿名内部类的变量(方法),要访问外部类的变量(方法)则需要加上外部类的类名。匿名内部类访问外部类成员变量或成员方法必须用static修饰 -
匿名内部类的使用
package com.vg.demo04;
//不使用匿名内部类来实现抽象方法
abstract class Person{
public abstract void eat();
}
class Child extends Person{
public void eat() {
System.out.println("eat something");
}
}
public class TestDemoniming {
public static void main(String[] args) {
Person p = new Child();
p.eat();
}
}
package com.vg.demo04;
//匿名内部类的基本实现
abstract class Person{
public abstract void eat();
}
public class TestDemoniming {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
package com.vg.demo04;
//在接口上使用匿名内部类
interface Person{
public abstract void eat();
}
public class TestDemoniming {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
package com.vg.demo04;
//Thread类的匿名内部类实现
public class TestDemoniming {
public static void main(String[] args) {
Thread t = new Thread() {
public void run () {
for(int i = 1;i<=5;i++) {
System.out.println(i+" ");
}
}
};
t.start();
}
}
package com.vg.demo04;
//Runnable接口的匿名内部类实现
public class TestDemoniming {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run () {
for(int i = 1;i<=5;i++) {
System.out.println(i+" ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}