1.抽象类
应用场景:在上一篇中的父类Animal,只是规定了一部分子类的属性和方法,但是并不需要创建Animal类型的对象,这时候可以用abstract来修饰该类,避免创建Animal类型的对象。
2.抽象方法
抽象方法不需要有方法体,比如 public abstract eat(); 子类中必须对该方法进行重写(如果不重写则子类也需要改为抽象类)。
应用场景:当父类规定一些子类必须要有的方法时,就将该方法写为抽象方法。
3.接口
对于两个类,不能继承自同一父类,但是拥有相同的方法,这时候需要用到接口。比如,手机和相机都能进行拍照,我们创建两个类,并定义一个拍照的接口来实现上述逻辑。
//接口
package com.liuermeng.photo;
public interface IPhoto {
public void photo();
//接口中可以包含常量,默认public static final
int TEMP=20;
//default:默认方法 可以带方法体 jdk1.8后新增
//可以在实现类
}
//static:静态方法 可以带方法体 jdk1.8后新增
//不可以在实现类中重写,可以同接口名调用
static void stop(){
System.out.println("我是接口中的静态方法");
}
}
//手机类
package com.liuermeng.photo;
public class Phone implements IPhoto {
@Override
public void photo() {
System.out.println("手机能拍照");
@Override
public void connection() {
// TODO Auto-generated method stub
System.out.println("我是Phone中的connection");
}
}
}
//相机类
package com.liuermeng.photo;
public class Camera implements IPhoto{
@Override
public void photo() {
System.out.println("相机能拍照");
}
}
//测试类
package com.liuermeng.test;
import com.liuermeng.photo.IPhoto;
import com.liuermeng.photo.Phone;
public class PhotoTest {
public static void main(String[] args) {
IPhoto ip=new Phone();
ip.photo();
}
}
输出
手机能拍照
/*接口中抽象方法可以不写abstract关键字
/*访问修饰符默认public
* 当类实现接口时,需要去实现接口中的所有抽象方法,否则需要将该类设置为抽象类
*/
//接口中可以包含常量,默认public static final
3.之前在讲多态时说过,向上造型之后,通过父类的引用只能访问子类重写的父类方法和父类原有的方法。在接口中,并不适用。
package com.liuermeng.photo;
public interface IPhoto {
public void photo();
//接口中可以包含常量,默认public static final
int TEMP=20;
default void connection() {
System.out.println("这是IPhoto的connection");
}
}
package com.liuermeng.photo;
public class Phone extends PhoneFather implements IPhoto {
public static final int TEMP=30;
@Override
public void photo() {
System.out.println("手机能拍照");
}
@Override
public void connection() {
System.out.println("这是手机的connection");
}
}
package com.liuermeng.test;
import com.liuermeng.photo.IPhoto;
import com.liuermeng.photo.Phone;
public class PhotoTest {
public static void main(String[] args) {
IPhoto ip=new Phone();
ip.photo();
System.out.println(IPhoto.TEMP);
ip.connection();
}
}
输出
手机能拍照
20
这是手机的connection
4.当用一个接口的引用指向一个类的实例时,当这个类实现多个接口,而多个接口中含有同一方法时,该实现类会报错,解决办法是在实现类中重写一下该方法,在调用时调用该类重写的方法。另外,当一个类继承自父类并且实现多个接口时,父类和接口中含有同一方法时,实现类会实现父类的方法。再者,上面的情况不能推广到类中的属性,也就是说当父类、接口中存在相同的属性时,实现类就无法区分会报错。
5.接口可以多继承