匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练
通常情况下,要使用一个接口或者抽象类,都必须创建一个子类
有的时候,为了快速使用,直接实例化一个抽象类,并“当场”实现其抽象方法。
既然实现了抽象方法,那么就是一个新的类,只是这个类,没有命名。
这样的类,叫做匿名类
public
abstract
class
Hero {
String name;
//姓名
float
hp;
//血量
float
armor;
//护甲
int
moveSpeed;
//移动速度
public
abstract
void
attack();
public
static
void
main(String[] args) {
ADHero adh=
new
ADHero();
//通过打印adh,可以看到adh这个对象属于ADHero类
adh.attack();
System.out.println(adh); //
这里的结果是 ADHero类
Hero h =
new
Hero(){ //
这里本来不能实例化一个抽象类,但由于在其实例
//当场实现attack方法 //
后面写出了抽象方法,因此相当于新建一个类
public
void
attack() {
System.out.println(
"新的进攻手段"
);
}
};
h.attack();
//通过打印h,可以看到h这个对象属于Hero$1这么一个系统自动分配的类名
System.out.println(h); //
这里的结果是 Hero$1类 系统自动起的新类(匿
}
//
明类)
}
本地类可以理解为有名字的匿名类
与内部类不一样的是,内部类必须声明在成员的位置,即与属性和方法平等的位置。
本地类和匿名类一样,直接声明在代码块里面,可以是主方法,for循环里等等地方
public
abstract
class
Hero {
String name;
//姓名
float
hp;
//血量
float
armor;
//护甲
int
moveSpeed;
//移动速度
public
abstract
void
attack();
public
static
void
main(String[] args) {
//与匿名类的区别在于,本地类有了自定义的类名
class
SomeHero
extends
Hero{
public
void
attack() {
System.out.println( name+
" 新的进攻手段"
);
}
}
SomeHero h =
new
SomeHero();
h.name =
"地卜师"
;
h.attack();
}
}
默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法
Mortal 这个接口,增加了一个默认方法 revive,这个方法有实现体,并且被声明为了default
public
interface
Mortal {
public
void
die();
default
public
void
revive() {
System.out.println(
"本英雄复活了"
);
}
}
假设没有默认方法这种机制,那么如果要为Mortal增加一个新的方法revive,那么所有实现了Mortal接口的类,都需要做改动。
但是引入了默认方法后,原来的类,不需要做任何改动,并且还能得到这个默认方法
通过这种手段,就能够很好的扩展新的类,并且做到不影响原来的类