抽象和接口
overload重载。定义:在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。
override重写。 定义:类型、名字、参数个数、参数类型完全相同。 重写父类的方法,不允许降低方法的访问权限,但可以提高访问权限(private,default,protected,public)。继承来的成员变量或方法的访问权限保持不变。
实现和继承非常相似,但是,继承只能单继承,而接口可以多实现。
抽象类可以有普通方法;而接口只有抽象方法。
一个类实现一个接口,必须重写接口中所有的方法,若没重写或只重写了部分方法,则该类必须是抽象类;
重写抽象类的抽象方法/接口的所有方法,要写上public,是有方法体的所以不是abstract method
向上转型对象调用子类重写/抽象类虽不能new对象,但该对象也可调用子类重写的方法/接口回调(接口是特殊的抽象类)
package com.demo12;
public class LeiRenYuan {
void crySpeak(String s) {
System.out.println(s);
}
}
package com.demo12;
public class People extends LeiRenYuan{
void crySpeak(String s) {
System.out.println("***"+s+"***");
}
void computer(int a,int b) {
int c=a*b;
System.out.println(c);
}
}
package com.demo12;
public class Test {
public static void main(String[] args) {
LeiRenYuan lry=new People();//向上转型
lry.crySpeak("I love this game");//调用子类重写的方法
People p=(People)lry;//把向上转型对象强制转换成子类对象
p.computer(10,10);//computer是子类新增的方法,所以不可以用lry调用
}
}
/*
运行结果为:
***I love this game***
100
*/
接口也可以作参数
如果一个方法的参数类型是double,那么可以向该参数传递byte、int、long、float、double类型的数据。(对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别。)
同理,如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传给该接口参数,那么接口参数就可以回调类实现的接口方法。
package com.demo15;
public interface SpeakHello {
void speakHello();
}
package com.demo15;
public class Chinese implements SpeakHello{
public void speakHello() {
System.out.println("中国人说你好");
}
}
package com.demo15;
public class English implements SpeakHello{
public void speakHello() {
System.out.println("英国人说hello");
}
}
package com.demo15;
public class KindHello {
public void lookHello(SpeakHello hello) { //参数类型是接口
hello.speakHello();//接口回调
}
}
package com.demo15;
public class Test {
public static void main(String[] args) {
KindHello kindHello=new KindHello();
Chinese c=new Chinese();
English e=new English();
kindHello.lookHello(c);
kindHello.lookHello(e);
}
}
/*
运行结果:
中国人说你好
英国人说hello
*/