内部类
java支持在类中定义另一个类,称为内部类。
内部类的外嵌类的成员变量在内部类中仍然有效,外嵌类的类体可以使用内部类声明的对象,作为成员。
内部类的类体不可以声明变量和类方法,外嵌类的类体可以使用内部类声明的对象,作为成员。
内部类仅供它的外嵌类使用,其它类不可以使用。
基础代码:
public class Test {
public static void main(String[] args) {
RedCowForm form = new RedCowForm("红牛农场");
form.showCowMess();
form.cow.Speak();
}
}
class RedCowForm {
static String formName;
RedCow cow; //内部类声明对象
RedCowForm() {
}
RedCowForm(String s) {
cow = new RedCow(150, 112, 5000);
formName = s;
}
public void showCowMess() {
cow.Speak();
}
class RedCow { //内部类
String cowName = "红牛";
int height, weight, price;
RedCow(int h, int w, int p) {
height = h;
weight = w;
price = p;
}
void Speak() {
System.out.println("偶是" + cowName + ",身高:" + height + "cm 体重" + weight + "kg,生活在" + formName);
}
}
}
内部类可以被修饰为static类,如果把class RedCow 用static修饰那么内部类就是外嵌类中的一种静态数据类型,这样一来,程序就可以在其它类中使用static内部类来创建对象,但是staticn内部类不能操作外嵌类中的实例成员变量。
匿名类
java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类对象的构造方法外还有类体,此类体被称为时=是一个类去掉类声明后的类体。
匿名类的特点:
匿名类可以继承父类的方法也可以重写父类的方法。
使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类。
匿名类可以访问外嵌内的成员变量和方法,匿名类的类体中不可以声明static成员变量和方法。
由于匿名类是一个子类,但没有类名,所以再用匿名类创建对象时,要直接使用父类的构造方法。
尽管匿名类创建的对象没有经过类声明步骤,但匿名对象的引用可以传递给一个匹配的参数。
基础代码:
public class Test {
public static void main(String[] args) {
ShowBoard board=new ShowBoard();
board.ShowMEss(new OutputEnglish());
board.ShowMEss(new OutputAlphabet() {
@Override
public void Output() {
for (char c='α';c<'ω';c++)
System.out.printf("%3c",c);
}
});
}
}
abstract class OutputAlphabet {
public abstract void Output();
}
class OutputEnglish extends OutputAlphabet{
public void Output(){
for(char c='a';c<='z';c++)
System.out.printf("%3c",c);
}
}
class ShowBoard{
void ShowMEss(OutputAlphabet show){
show.Output();
}
}
和接口有关的匿名类
如果某个方法的参数类型是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须重写接口中的全部方法。
理解代码:
public class Test {
public static void main(String[] args) {
HelloMachine machine = new HelloMachine();
machine.turnOn(new SpeakHello() {
@Override
public void Speak() {
System.out.print("你好,欢迎光临!\n");
}
});
machine.turnOn(new SpeakHello() {
@Override
public void Speak() {
System.out.print("Hello,you are welcome!");
}
});
}
}
interface SpeakHello {
void Speak();
}
class HelloMachine {
public void turnOn(SpeakHello hello) {
hello.Speak();
}
}