匿名内部类通过接口来创建,不能显式地定义构造器,因此匿名内部类只有一个隐式无参构造,故new接口名后括号不能传参。
但如果通过继承父类来创建匿名内部类对象时,匿名内部类将拥有和父类相似的构造器(拥有相同的形参列表)
abstract class Device {
private String name;
public abstract double getPrice();
public Device() {
}
public Device(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void abc() {
System.out.println("asd");
}
}
public class AnonymousInner {
public void test(Device device) {
System.out.println(device.getName() + device.getPrice());
}
public static void main(String[] args) {
AnonymousInner anonymousInner = new AnonymousInner();
//匿名内部类通过有参构造创建对象
anonymousInner.test(new Device("液晶显示器") {
@Override
public double getPrice() {
return 100.56;
}
});
//匿名内部类通过无参构造创建对象
anonymousInner.test(new Device() {
{
System.out.println("匿名内部类的初始化块");
}
@Override
public double getPrice() {
return 56.8;
}
@Override
public String getName() {
return "鼠标";
}
});
}
}
如果有需要,也可以重写父类的普通方法
匿名内部类中使用的局部变量只能是final修饰或者默认不写就是final
interface A {
void test();
}
public class ATest {
public static void main(String[] args) {
final int age = 10;
var a = new A() {
@Override
public void test() {
System.out.println(age);
}
};
a.test();
}
}
interface A {
void test();
}
public class ATest {
public static void main(String[] args) {
int age = 10;
var a = new A() {
@Override
public void test() {
System.out.println(age);
}
};
a.test();
}
}
以上两段代码只有局部变量final的写与否,都是final
如果修改了a的值
interface A {
void test();
}
public class ATest {
public static void main(String[] args) {
int age = 10;
var a = new A() {
@Override
public void test() {
System.out.println(age);
}
};
a.test();
//修改a的值
age=10;
}
}
不管你是啥时候改的,都不行,运行结果: