一接口实现的多态
在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interfac中提到了接口的实现存在多态性,那么
这一篇主要就要分析接口实现的多态。
实例一
Test.java源文件代码:
public class Test{
public static void main(String[] args){
//实现接口Singer
Singer s1 = new Student('Amy');
s1.sing();
s1.sleep();
s1.study();//编译出错
//实现接口Singer
Singer s2 = new Teacher('Jack');
s2.sing();
s2.sleep();
s2.paint();//编译出错
s2.eat();//编译出错
s2.teach();//编译出错
//实现接口Painter
Painter p1 = (Painter)s2;
p1.paint();
p1.eat();
p1.teach();//编译出错
p1.sing();//编译出错
p1.sleep();//编译出错
}
}
//接口Singer
interface Singer{
//抽象方法
public void sing();
public void sleep();
}
//接口Painter
interface Painter {
//抽象方法
public void paint();
public void eat();
}
//学生类Student,继承一个Singer接口
class Student implements Singer{
//私有成员变量
private String name;
//构造方法
Student(String name){
this.name = name;
}
public String getName(){
return name;
}
//学生类独有的study()方法
public void study(){
System.out.println('student is studying');
}
//重写接口Singer中的sing()方法
public void sing(){
System.out.println('student is singing');
}
//重写接口Singer中的sleep()方法
public void sleep(){
System.out.println('student is sleeping');
}
}
//教师类Teacher,继承两个接口Singer和接口Painter
class Teacher implements Singer,Painter{
//私有成员变量
private String name;
//构造函数
Teacher(String name){
this.name = name;
}
public String getName(){
return name;
}
//Teacher类独有的teach()方法
public void teach(){
System.out.println('teacher is teaching');
}
//重写接口Singer的sing()方法
public void sing(){
System.out.println('teacher is singing');
}
//重写接口Singer的sleep()方法
public void sleep(){
System.out.println('teacher is sleeping');
}
//重写接口Painter的paint()方法
public void paint(){
System.out.println('teacher is painting');
}
//重写接口Painter的eat()方法
public void eat(){
System.out.println('teacher is eating');
}
}
编译过程报错:
从上面报错的信息可以看出:在前面的叙述面向对象多态的时候就说过,引用多态和方法多态,以及多态中的引
用类型转换,这些同样在接口中都能实现,但是有区别的是,接口不能实例化,但是可以接口的引用可以指向继承它
入门学习1Java面向对象之多态。
上面的编译过程报错的行数是111222这些报错的类型都是找不到符号,这是因为引用类
型不一样的原因,比如Singer接口的引用指向子类Student的对象s这个对象引用只能包含子类Student中重写接口
Singer的两个抽象方法,不能包含其它重写Painter接口中的抽象方法以及子类Student本身独有的方法,其它的类
似。为了避免这种编译出错,我们可以创建子类Student的对象和子类Teacher的对象。
实例二
改写Test类中的代码:
public class Test{
public static void main(String[] args){
//创建Student类的对象,实现接口Singer
Student s1 = new Student('Amy');
s1.sing();
s1.sleep();
s1.study();
//创建Teacher类的对象,实现接口Singer和接口Painter
Teacher t1 = new Teacher('Jack');
t1.sing();
t1.sleep();
t1.paint();
t1.eat();
t1.teach();
}
}
编译运行结果:
二接口的用法(实际参考)
精简程序结构,免除重复定义
比如,有两个及上的的类拥有相同的方法,但是实现功能不一样,就可以定义一个接口,将这个方法提炼出来,
在需要使用该方法的类中去实现,就免除了多个类定义系统方法的麻烦。
举例:鸟类和昆虫类都具有飞行的功能,这个功能是相同的,但是其它功能是不同的,在程序实现的过程中,就
可以定义一个接口,专门描述飞行。
下是分别定义鸟类和昆虫类,其都有飞行的方法,类为:
下定义了接口,其类如下:
具体的代码实现:
//接口FlyAnimal
interface FlyAnimal{
//抽象方法fly()
void fly();
}
//昆虫类
class Insect{
int legnum = 6;
void oviposition(){};
}
//鸟类
class Bird {
int legnum = 2;
void egg(){};
}
//蚂蚁类
class Ant extends Insect implements FlyAnimal{
public void fly(){
System.out.println('Ant can fly');
}
public void oviposition(){
System.out.println('Ant can spawn');
}
}
//鸽子类
class Pigeon extends Bird implements FlyAnimal{
public void fly(){
System.out.println('pigeon can fly');
}
public void egg(){
System.out.println('pigeon can lay eggs ');
}
}
public class Test{
public static void main(String args[]){
Ant a=new Ant();
a.fly();
a.oviposition();
System.out.println('Ant's legs are '+ a.legnum);
System.out.println('
');
Pigeon p= new Pigeon();
p.fly();
p.egg();
System.out.println('Pigeon's legs are '+ p.legnum);
}
}
编译运行结果:
拓展程序功能,应对需求变化
假设一个学校接待方面的程序,招待不同身份的人的食宿问题,其对应规则如下:
理论上,当然可以对每个不同身份的人各定义一个对应的类,并实现各自的方法,但是观察这写类,可以归纳出
其有一个共同的模板,即“人”的“食、宿”问题。这时候,就可以发挥接口的功能了。
具体实现代码如下:
interface Person{
void eat();
void sleep();
}
class Student implements Person{
public void eat(){
System.out.println('学生去食堂吃饭!');
}
public void sleep(){
System.out.println('学生回寝室睡觉!');
}
}
class Teacher implements Person{
public void eat(){
System.out.println('教师去教工餐厅吃饭!');
}
public void sleep(){
System.out.println('教师回学校公寓睡觉!');
}
}
class Parents implements Person{
public void eat(){
System.out.println('家长去招待所饭馆吃饭!');
}
public void sleep(){
System.out.println('家长回招待所睡觉!');
}
}
public class Test{
public static void main(String[] args){
Person p1 = new Student();
p.eat();
p.sleep();
Person p2 = new Teacher();
p.eat();
p.sleep();
Person p3 = new Parents();
p.eat();
p.sleep();
}
}
运行结果:
现在需要添加一些功能,即现在需要添加“外宾、上级领导”两类角色,并且以后工具需要还要添加相应的身份角
色的人进来,此时,只需要根据需要添加“外宾”类、“领导”类,而主类仍然可以拿来就用,无需进行更多的修改。此
时就可以显示出接口的作用了。
我们列表现在更新为:
在上面的程序中添加如下两个类即可:
class Foreign implements Person{
public void eat(){
System.out.println('外宾去酒店吃饭!');
}
public void sleep(){
System.out.println('外宾回酒店睡觉!');
}
}
class Leader implements Person{
public void eat(){
System.out.println('领导去宾馆吃饭!');
}
public void sleep(){
System.out.println('领导回宾馆睡觉!');
}
}
我们在主方法中添加的代码为:
Person p4 = new Foreign();
p4.eat();
p4.sleep();
Person p5 = new Leader();
p5.eat();
p5.sleep();
运行结果:
总结
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点
水滴2023-02-12
人多地方不要去这个分析很有意思。这个现象背后会不会是这样:以人多中格力平安举例,他们一开始也是人少的,但随着股价持续上涨,人越来越多了,最终就是,在“人少”低位买入的,哪怕平安格力距离高点腰斩,这波人仍然是盈利的;而在“人多”高位买入的,这波人就开始站岗了……同样的,一只股票“人少”表示要么养在深闺人未识,要么是已经经过一轮爆炒后被抛弃了,要么是公司遇到巨大困境被打到地板上了,这时候挖掘难度很大,但也可能是一个从“人少”到“人多”的新一轮的起点,所谓现在少即是未来的多,现在多即是未来的少,多多少少,少少多多,循环……