Java:面向对象:继承 / 多态 / 接口难题 / 匿名类

更多
2021年07月07日 10点23分 作者:叶飞 修改

继承

复习:面向对象:继承 / protected / 父类装子类 / 类型转换 / 滥用

extends和super

使用关键字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();
	}
}

protected和package

因为:Java类成员默认是package的(C#默认是private的)

所以,protected表示子类和包内都可以访问:(类似于C#的internal protected)

  • 子类可以跨包(package)的访问父类的protected成员
  • 外部不能跨包(package)的访问protected成员

final

修饰类/方法,表明不能继承/override,(同C#中的sealed)

instanceof

判断某个对象是不是某个类的实例(同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方法,

  • 如果实现类不override的话,外部调用Student对象的Walk()方法时,不知道调用哪一个;
  • 同样的,实现类调用接口的default Walk()方法,你也得指定具体调用的是哪一个

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的一个子类,只是这个子类没有名称,所以叫做匿名类。

匿名类要求在花括号({})中完全实现其接口或抽象类,供以后调用该匿名类对象成员使用。

演示:

  • 在run()中添加:
    void run() {
    	System.out.println("奔跑吧兄弟!");
    }
  • person调用run()
    person.run(); 

PS:虽然都叫做匿名类,但C#的匿名类和Java的匿名类完全两码事,^_^


作业

  1. 如何用最简单/优雅的方法,让所有Entity对象生成时,就能获得一个随机生成的id?
  2. 一起帮还可以在好友间发私信,所有又有了IChat接口,其中也有一个Send()方法声明。假设User类同时继承了ISendMessage和IChat,如何处理?
  3. 声明一个实现IChat的匿名类,调用其Send()方法
Java 面向对象 继承 多态
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

后台开发


其他:WebForm和WebApi

其他ASP.NET框架,如WebForm、WebApi……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

分层架构和综合实战

J&C

Java和C#共有的语法

全部
关键字



帮助

反馈