001.抽象类和抽象方法
0011.特点:
- 抽象类不能直接实例化,只能被继承,但通过向上转型完成对象实例化;
- 抽象方法只有声明,没有具体实现(如:abstract int age(); )
- 抽象方法不可用static和private修饰;
- 抽象类中可以有构造方法;
- 抽象类可以有普通属性和方法、静态属性和方法;
- 包含抽象方法的类是抽象类,但抽象类中可以没有抽象方法;
- 抽象类中的抽象方法,其子类必须实现;如果子类不实现父类抽象方法,那子类需定义为抽象类;
0012.为什么:
- 为什么final和abstract不能同时修饰类?
因为final修饰符会使该类不可继承,而abstract修饰的类如果不可以继承将没有任何意义(两者放在一起,报错提示两者不可共存)
0014.代码
//抽象类
public abstract class AbstractUse {
//抽象方法,没有方法体{}
public abstract String sayHi();
//静态属性
public static final int MIN_AGE = 18;
//成员属性
public String name;
// public abstract static int setAge(); 不能static修饰
// private abstract int setAge(); 不能private修饰
//成员方法
public void methodA(){
}
//构造方法
public AbstractUse(){
}
public static void main(String[] args) {
// AbstractUse a = new AbstractUse(); 不能被实例化
}
}
//子类
public class MinAbstract extends AbstractUse{
//子类继承抽象父类时,需实现抽象父类的抽象方法,否则子类也是抽象类
@Override
public String sayHi() {
return null;
}
}
002.接口
- 接口是什么?
- 接口是对行为的抽象,它是抽象方法的集合;
- 接口不能被实例化;
- 接口内定义的方法,其继承的子类需全部实现,否则继承的子类需定义为抽象类;
- 一个类只能继承一个类,但可以继承多个接口;
0022.代码一:类继承接口
/**
* 接口中只包含常量和抽象方法(jdk1.8后有静态方法、默认方法)
*/
//接口访问修饰符:public 默认
public interface Order {
//接口的方法默认是public abstract
public abstract int save(int Id);
//常量 默认修饰 public static final
public static final int AGE = 18;
//静态方法
public static void stop(){
System.out.println("我是接口中的静态方法");
}
//默认方法
default void getAge(){
System.out.println("我是接口中的默认方法");
}
}
-------------------------------------------------------
/**
* 对接口方法的实现(实现接口的抽象方法,除非该类是抽象类)
*/
public class OrderImpl implements Order{
public static final int AGE = 28;
//实现类需重写父类的抽象方法
@Override
public int save(int Id) {
return 0;
}
//实现类可以重写接口Order的default方法,并可通过接口的引用调用
@Override
public void getAge() {
// TODO Auto-generated method stub
Order.super.getAge();
}
}
-------------------------------------------------------
//测试类
public class Test {
public static void main(String[] args) {
Order ord = new OrderImpl();
System.out.println(ord.AGE); //18
Order.stop(); //我是接口中的静态方法
OrderImpl oi = new OrderImpl();
System.out.println(oi.AGE); //28
}
}
0022.代码一:多接口中重名默认方法处理
//IFather
public interface IFather {
public abstract void say();
default void walk(){
System.out.println("IFather的walk方法");
};
}
//IFather1
public interface IFather1 {
public abstract void fly();
default void walk(){
System.out.println("IFather1的walk方法");
};
}
//ISon
//接口实现继承多个接口
public interface ISon extends IFather,IFather1{
public abstract void play();
//此时报错,ISon不懂继承IFather还是IFather1的walk方法
//只好自己重写walk方法
default void walk(){
System.out.println("ISon的walk方法");
}
}
//Demo类
public class Demo implements ISon{
@Override
public void play() {
}
@Override
public void say() {
}
@Override
public void fly() {
}
}
003.总结
- 抽象类是对事物的抽象,而接口是对行为的抽象;
- 抽象类是对整个类整体进行抽象,包括属性、行为,但是接口是对类局部(行为)进行抽象;
- 抽象类是一种模板式设计,而接口是一种行为规范;