JavaSE:抽象类和接口

290 阅读3分钟

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.总结

  • 抽象类是对事物的抽象,而接口是对行为的抽象;
  • 抽象类是对整个类整体进行抽象,包括属性、行为,但是接口是对类局部(行为)进行抽象;
  • 抽象类是一种模板式设计,而接口是一种行为规范;