复习:面向对象:继承 / 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的匿名类完全两码事,^_^
多快好省!前端后端,线上线下,名师精讲
更多了解 加: