有名内部类
内部类是指在一个外部类内定义的类。
按照是否有类名分为有名内部类和匿名内部类。
说明:全局有名内部类的使用方式类似于全局变量;局部有名内部类的使用方式类似局部变量——它们都有固定的使用范围;
public class Foo {
class A{
}
public static void main(String[] args) {
class B{
}
}
}
A和B都是内部类,A类似于全局变量 ,在Foo类的任何位置都可以调用,但B类只能在定义之后的后面调用。
匿名内部类
匿名内部类由于没有类名而不能单独存在,定义匿名内部类的同时须直接实例化该类,其语法格式如下:
new 父类构造器([参数列表])|接口(){
//匿名内部类类体
}
普通类匿名内部类实质为普通类的子类。
public class Foo {
public static void main(String[] args) {
Mammal1 q = new Mammal1(){
@Override//可以重写父类的方法
public void a() {
System.out.println(222);
}
};
}
}
class Mammal1{
public void a() {
System.out.println(111);
}
}
抽象类:抽象类匿名内部类实质为抽象类的子类。必须实现父类抽象类或接口中包含的所有抽象方法。
public class Foo {
static Mammal1 q = new Mammal1(){
@Override
public void a() {
};
};
public static void main(String[] args) {
Mammal1 w = q;
w.a();
}
}
abstract class Mammal1{
public void a() {
System.out.println(111);
}
}
接口:接口匿名内部类实质为接口的实现类。
public class Foo {
static Mammal1 q = new Mammal1(){
@Override
public void a() {
}
};
public static void main(String[] args) {
Mammal1 w = q;
w.a();
}
}
interface Mammal1{
public void a();
}
匿名内部类特点:
匿名内部类一定是接口的实现类(该实现类仅能实现一个接口)或类(普通类或抽象类)的子类;
匿名内部类不能自定义构造方法,但是可以通过非静态代码块初始化成员变量;
匿名内部类一定不能是抽象类;
可以在匿名内部类中添加新的属性和方法,但是这些属性和方法不能被上转型对象所调用,只能被非上转型对象方式创建的 匿名内部类对象所调用,例如:
public class Foo {
public static void main(String[] args) {
new Mammal1(){
@Override
public void a() {
}
public void b() {
}
}.b();//同一个匿名内部类对象只能调用一个新增的属性或方法,无法再调用实现的抽象方法、重写的方法或继承的方法,也无法调用继承的属性
}
}
interface Mammal1{
public void a();
}
按照是否有static修饰分为静态内部类和非静态内部类,有static修饰的为静态内部类,没有static修饰的为非静态内部类,非静态内部类前面已经讲过,这里不再赘述。
静态匿名内部类;
public class Foo {
static Mammal1 a = new Mammal1(){
@Override
public void a() {
}
public void b() {
}
};
}
interface Mammal1{
public void a();
}
如果为static内部类只能直接定义在外部类中。
匿名内部类定义位置的区别
直接定义在外部类中的匿名内部类必须实例化,因为如果不实例化就永远不会被调用
public class Foo {
new Mammal1(){//报错
@Override
public void a() {
System.out.println(111);
}
public void b() {
}
};
public static void main(String[] args) {
a.a();
}
}
public class Foo {
new Foo();//报错
}
只有实例化后才能直接在外部类中调用。匿名内部类里面新创建的方法只能通过在类后面加上点后调用,而且只能在方法或代码块中没有实例化时调用,且只能调用一个,多余的不能调用。