【保姆级教程】一篇让你学会——JAVA之抽象类和接口异同点

catalogue

Part one.抽象类

Tip1.了解抽象类

Tip2.几点说明

Tip3.试试吧~

Tip4.抽象类的应用

Part two.接口

Tip1.了解接口

Tip2.接口的意义

Tip3.接口的定义

Tip4.接口的实际运用

Part3.比较接口与抽象类


Part one.抽象类

Tip1.了解抽象类

        要点:抽象类不可以用于创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现。

       在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。例如,动物作为一个基类可以派生出猫、狗等子类,但动物类本身生成对象明显不合常理。这样的类称为抽象类在类的头部使用abstract修饰。

例:比较普通方法和抽象类

(在所有的普通方法上面都会有一个“{}”,这个表示方法体,有方法体的方法一定可以被对象直接使用。而抽象方法,是指没有方法体的方法,同时抽象方法还必须使用关键字abstract做修饰。)

abstract class A{//定义一个抽象类
	
	public void fun(){//普通方法
		System.out.println("存在方法体的方法");
	}
	
	public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
	
}

例:抽象方法的声明格式

【抽象方法只有声明没有实现,即没有方法体】

abstract void fun();

Tip2.几点说明

  • 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。抽象方法是非静态的。
  • 抽象类不能使用new操作符来初始化。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用。
  • 子类可以重写父类的方法并将它定义为抽象的。
  • 即使子类的父类是具体的,这个子类也可以是抽象的。
  • 不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
  • 派生类继承抽象类必须实现抽象类中所有的抽象方法,否则派生类也必须定义为抽象类。

Tip3.试试吧~

//单继承
class B extends A{//B类是抽象类的子类,是一个普通类

	@Override
	public void print() {//强制要求覆写

		System.out.println("Hello World !");

	}
	
}
public class TestDemo {

	public static void main(String[] args) {

		A a = new B();//向上转型
		
		a.print();//被子类所覆写的过的方法
	}
}

运行结果:

Hello World !

Tip4.抽象类的应用

参考某博主链接在这里:抽象类理解

例如,现在有两类事物:
(1)人:吃饭,工作,睡觉;
(2)猪:进食,睡觉。
现要求实现一个程序,可以实现两种不同事物的行为。

先定义一个抽象行为类:

public abstract class Action{
	
	public static final int EAT = 1 ;
	public static final int SLEEP = 3 ;
	public static final int WORK = 5 ;
	
	public abstract void eat();
	public abstract void sleep();
	public abstract void work();
	
	public void commond(int flags){
	  switch(flags){
		case EAT:
			this.eat();
			break;
		case SLEEP:
			this.sleep();
			break;
		case WORK:
			this.work();
			break;
		case EAT + SLEEP:
			this.eat();
			this.sleep();
			break;
		case SLEEP + WORK:
			this.sleep();
			this.work();
			break;
		default:
			break;
		}
	}
}

定义一个人的类:

public class Human extends Action{

	@Override
	public void eat() {
		System.out.println("人吃饭");
	}

	@Override
	public void sleep() {
		System.out.println("人睡觉");
	}

	@Override
	public void work() {
		System.out.println("人工作");
	}
}

定义一个猪🐖的类:

public class Pig extends Action{

	@Override
	public void eat() {
		System.out.println("猪进食");	
	}

	@Override
	public void sleep() {
		System.out.println("猪睡觉");	
	}

	@Override
	public void work() {		
		
	}	
}

测试主类:

public class AbstractDemo {

	public static void main(String[] args) {
		
		fun(new Human());	
		fun(new Pig());

	}
	
	public static void fun(Action act){
		act.commond(Action.EAT);
		act.commond(Action.SLEEP);
		act.commond(Action.WORK);
	}
}

运行结果:

人吃饭

人睡觉

人工作

猪进食

猪睡觉


Part two.接口

Tip1.了解接口

       要点:接口是一种与类相似的结构,用于为对象定义共同的操作。其目的是指明相关或者不想管类的对象的共同行为。  

       Java中的接口是一系列方法的声明,可以看做是特殊的抽象类,包含常量和方法的声明,而没有变量和方法的实现。即只有方法标识符,而没有方法体)。

为了区分接口和类,采用下面的语法来定义接口:

modifier interface InterfaceName{
  /** Constant declarations */
  /** Abstract method signatures */
}

下面是一个接口的例子:

public interface Edible {
  /** Describe how to eat */
  public abstract String howToEat();
}

注:由于接口中所有的数据域都是public static final而且所有的方法都是public abstract,所以Java允许忽略这些修饰符。因此,下面的接口定义是等价的:

public interface T{

    public static final int k=1;

    public abstract void p();

}

||等价于

public interface T{

    int K=1;

    void p();

}

Tip2.接口的意义

  • 弥补Java中单继承机制的不足。
  • 接口只有方法的定义没有方法的实现,即都是抽象方法,这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。

Tip3.接口的定义

interface 接口名称 {
               常量
               抽象方法
}

interface A{//定义一个接口

    public static final String MSG = "hello";//全局常量
    public abstract void print();//抽象方法
}

类可以通过实现接口的方式来具有接口中定义的功能,基本语法:

class 类名 implements 接口名 {


}

  • 一个类可以同时实现多个接口。
  • 一个接口可以被多个无关的类实现。
  • 一个类实现接口必须实现接口中所有的抽象方法,否则必须定义为抽象类。

Tip4.接口的实际运用

参考某博主链接放这里接口详解

现在假设每一个USB设备只有两个功能:安装驱动程序、工作。

定义一个USB的标准:

interface USB {   // 操作标准       
    public void install() ;
    public void work() ;
}

在电脑上应用此接口:

class Computer {
   public void plugin(USB usb) {
          usb.install() ;
          usb.work() ;
   }
}

定义USB设备——手机:

class Phone implements USB {
     public void install() {
           System.out.println("安装手机驱动程序。") ;
     }
     public void work() {
           System.out.println("手机与电脑进行工作。") ;
     }
}

定义USB设备——MP3:

class MP3 implements USB {
      public void install() {
           System.out.println("安装MP3驱动程序。") ;
      }
      public void work() {
           System.out.println("进行MP3拷贝。") ;
      }
}

测试主类:

public class TestDemo {
    public static void main(String args[]) {
        Computer c = new Computer() ;
        c.plugin(new Phone()) ;
        c.plugin(new MP3());
    }
}

测试结果:

安装手机驱动程序。

手机与电脑进行工作。

安装MP3驱动程序。

进行MP3拷贝。


Part3.比较接口与抽象类

变量构造方法方法
抽象类无限制子类通过构造方法链调用构造方法,抽象类不能用new操作符实例化无限制
接口所有的变量必须是public static final没有构造方法。接口不能用new操作符实例化可以包含public的抽象实例方法、public的默认方法以及public的静态方法

       接口与抽象类

区别

Java只允许为类的继承做单一继承,但是允许使用接口做多重继承。例如:

public class NewClass extends BaseClass
    implements Interface1,...,InterfaceN {
...
}

利用关键字extends,接口可以继承其他接口。这样的接口称为子接口(subinterface)。例如,以下代码,NewInterface是I内特容法测,...,InterfaceN的子接口。

public interface NewInterface extends Interface1,...,InterfaceN {
  //constants and abstract methods
}

       通常,推荐使用接口而非抽象类,因为接口可以为不相关类定义共同的父类型。接口比类更加灵活。然而接口不能包含数据域。

       所以,在开发之中,抽象类和接口实际上都是可以使用的,并且使用那一个都没有明确的限制,可是抽象类有一个最大的缺点 : 一个子类只能够继承一个抽象类,存在单继承的局限。所以当遇到抽象类和接口都可以使用的情况下,优先考虑接口,避免单继承局限

酱酱!!以上是我的接口和抽象类的全部学习内容~

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值