复习:面向对象:继承 / protected / 父类装子类 / 类型转换 / 滥用
使用关键字extends表示继承(同C#的冒号:),super表示基类(同C#中的base)
public class OnlineStudent extends Student {
public OnlineStudent(int age) {
super(age);
}
void goLesson() {
//以下super,没有冲突的时候可以不写
System.out.println(super.score);
super.Walk();
}
}
因为:Java类成员默认是package的(C#默认是private的)
所以,protected表示子类和包内都可以访问:(类似于C#的internal protected)
修饰类/方法,表明不能继承/override,(同C#中的sealed)
判断某个对象是不是某个类的实例(同C#中的is,没有as)
Person fg = new Teacher(); System.out.println(fg instanceof Person); System.out.println(fg instanceof Teacher);
只能作用于对象,不能作用于基本类型
Integer i = new Integer("23"); //OK
// int i = new Integer("23"); //会报错
System.out.println(i instanceof Integer);
复习:J&C:面向对象:构造函数 / 禁止继承 / 抽象类 / 接口 / API
通常情况下,你可以在子类中直接的调用接口的默认方法。
但是,一个子类继承多个接口,且多个接口中定义了相同默认方法的时候:
//IMove和IPlay中都有Walk()的default方法
class Student implements IMove, IPlay {
首先,子类必须override接口中的default方法:
然后,如果要调用接口中的默认方法,要采用一种有些奇怪的写法:
class Student implements IMove {
public void Run(int miles) {
IMove.super.Walk();
}
}
为什么要这样做呢?两个同名的default方法,
PS:C#中用显式实现解决这些问题。
前面我们说:接口和抽象类不能实例化。比如这样是会报错的:
//error:Cannot instantiate the type IMove IMove person = new IMove();
但是,如果你在eclipse里按alt+/使用智能提示,就会生成这样的代码:
IMove person = new IMove() {
@Override
public void run() {
}
};
这就是匿名类。
实际上我们不是去new的IMove,而是IMove的一个子类,只是这个子类没有名称,所以叫做匿名类。
匿名类要求在花括号({})中完全实现其接口或抽象类,供以后调用该匿名类对象成员使用。
演示:
void run() {
System.out.println("奔跑吧兄弟!");
}
person.run();
PS:虽然都叫做匿名类,但C#的匿名类和Java的匿名类完全两码事,^_^
多快好省!前端后端,线上线下,名师精讲
更多了解 加: