java中抽象类和接口的相同和不同点介绍

目录
  • 前言
  • 一、抽象类是什么?
  • 二、接口是什么?
  • 三、抽象类和接口的异同点
  • 总结

前言

本文简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。

一、抽象类是什么?

在 Java 语言中使用 abstract class 来定义抽象类。抽象类是不能被实例化的,即不能用new关键字来实例化对象。包含抽象方法的一定是抽象类,但抽象类不一定包含抽象方法。如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类。抽象类中的抽象方法的修饰符只能为public或者protected。

为什么要在抽象类中定义抽象方法呢?下面我们来看一个代码实例:

package example;

import java.util.Date;

public abstract class GeometricObject {
	private String color="white";
	private boolean filled;
	private java.util.Date dateCreated;
	protected GeometricObject() {
		dateCreated=new java.util.Date();
	}//构建默认的几何对象
	protected GeometricObject(String color,boolean filled) {
		dateCreated=new java.util.Date();
		this.color=color;
		this.filled=filled;
	}
	public String getColor() {
		return color;
	}//返回颜色
	public void setColor(String color) {
		this.color=color;
	}//设置新的颜色
	public boolean getFilled() {
		return filled;
	}
	public void setFilled(boolean filled) {
		this.filled=filled;
	}
	public java.util.Date getDateCreated(){
		return dateCreated;
	}
	public abstract double getArea();//抽象方法定义得到面积
	public abstract double getPerimeter();//抽象方法得到周长
}

我们假设自定义的Circle类和Rectangle类均为GeometricObject的子类,且均有求各自面积的getArea()方法和各自周长的getPerimeter()方法,但这些方法并不能在父类中定义,因为具体的计算方法要取决于几何对象的具体类型。所以采取抽象方法进行定义,这样可以保证父类中的抽象方法可以在子类中被重写。

抽象类只有定义没有实现。

下面是抽象类值得注意的几点:

1.抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。也就是说,在继承自抽象类的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是静态的。

2.抽象类不能使用new操作符来初始化。但仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中进行调用。

3.包含抽象方法的类必须是抽象的。但是是可以定义一个不包含抽象方法的抽象类,这个抽象类用于作为定义新子类的基类。

4.即使子类的父类是具体的,这个子类也可以是抽象的。

5.不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用做一种数据类型。

例如:GeometricObject[] objects=new GeometricObject[10];是正确的,。

6.子类可以重写父类的方法并将它定义为抽象的,这虽然不常见,但很适用于当父类的方法实现在子类中变得无效时的情况。

二、接口是什么?

接口是一种与类很相似的结构,用于为对象定义共同操作,但它的目的是指明相关或者不相关类的对象的共同行为。

Java中接口使用interface关键字修饰。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。

类和接口之间的关系称为接口继承。

下面是简单的代码举例:

package example;

public class TestEdible {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object[] objects= {new Tiger(),new Chicken(),new Apple()};
		//创建由Tiger,Chicken和Apple类型的三个对象构成的数组
		for(int i=0;i<objects.length;i++) {
			if(objects[i] instanceof Edible)
				System.out.println(((Edible)objects[i]).howToEat());
			if(objects[i] instanceof Animal) {
				System.out.println(((Animal)objects[i]).sound());
		}
		}//如果可食用,则调用howToEat方法,如果是动物,则调用sound方法
	}

}
abstract class Animal{
	private double weight;
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight=weight;
	}
	public abstract String sound();//返回动物的声音,是抽象方法,被具体的animal类实现
}
class Chicken extends Animal implements Edible{
	@Override
	public String howToEat() {
		return "Chicken: Fry it";
	}//实现了Edible接口。当一个类实现接口时,该类实现定义在接口中的所有方法。
	@Override
	public String sound() {
		return "Chicken: cock-a-doodle-doo";
	}
}
class Tiger extends Animal{
	@Override
	public String sound() {
		return "Tiger:RROOAARR";
	}
}
abstract class Fruit implements Edible{
}//Fruit类实现了Edible,但没有实现howToEat方法,所以它必须定义为abstract。
class Apple extends Fruit{
		@Override
		public String howToEat() {
			return "Apple:Make apple cider";
	}
}//Fruit的具体子类必须实现howToEat方法,所以Apple类实现了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();
}

尽管public修饰符对于定义在接口中的方法可以省略,但是在子类实现中方法必须定义为public。

三、抽象类和接口的异同点

一个类可以实现多个接口,但是只能继承一个父类。

首先我们先来列举个表格简单讲述一下抽象类和接口之间的异同点:

比较点 抽象类 接口
关键字 abstract class interface
字段 无限制 变量必须是public static final
方法 既可以含普通方法,又可以含抽象方法,无限制 只能含抽象方法,且必须是public的
继承/实现 只能被类或抽象类继承 既可以被接口继承,也能被类或抽象类实现
多重继承 不支持 可以继承多个父接口

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

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

利用extends,接口可以继承其他接口,这样的接口被称为子接口。例如:下面的代码中,NewInterface是Interface1,...,InterfaceN的子接口。

public interface NewInterface extends Interface1,...,InterfaceN{
}

一个实现NewInterface的类必须实现在NewInterface,Interface1,...,InterfaceN中定义的抽象方法。接口可以继承其他接口但不能继承类。一个类可以继承它的父类同时实现多个接口。

所有的类都有一个共同的根类Object,但是接口并没有共同的根。与类相似,接口同样也可以定义一种类型。一个接口类型的变量可以引用任何实现该接口的类的实例。如果一个类实现了一个接口,那么这个接口就类似于该类的一个父类。可以将接口当作一种数据类型使用,将接口类型的变量转换为它的子类,反过来同样可以。

通常情况下,使用接口的频率更高,因为接口比类更加灵活,不用使所有东西都属于同一个类型的类。

下面进行一个简单的代码举例:

abstract class Animal{
    public  abstract String howToEat();
}//在Animal中定义howToEat方法
//Animal的两个子类定义如下
class Chicken extends Animal{
	@Override
	public String howToEat() {
		return "Chicken: Fry it";
    }
}
class Duck extends Animal{
	@Override
	public String howToEat() {
		return "Roast it";
    }
}
public static void main(String[] args) {
    Animal animal = new Chicken();
    eat(animal);

    Animal animal = new Duck();
    eat(animal);
}
public static void eat(Animal animal){
    System.out.println(animal.howToEat());
}

假设给定这个继承结构,java在调用方法时可以根据对象动态地决定调用具体的howToEat方法。但有一个限制条件,即该子类必须是另一种动物才可以。如果一种动物不可食用,那么此刻再继承Animal类就并不合适了。

限制条件这个问题在接口中可以被解决,例如:

public class Demo{
public static void main(String[] args) {
    Edible stuff = new Chicken();
    eat(stuff);

    Edible stuff = new Broccoli();
    eat(stuff);
  }
public static void eat(Edible stuff){
    System.out.println(stuff.howToEat());
  }
}
interface Edible{
    public String howToEat();
}
class Chicken implements Edible{
	@Override
	public String howToEat() {
		return "Chicken: Fry it";
	}
}
class Broccoli implements Edible{
	@Override
	public String howToEat() {
		return "Broccoli: Stir-fty it";
	}
}

定义表示可食用对象的一个类,只须让该类实现Edible接口即可。任何Edible对象都可以被传递以调用HowToEat方法。

总结

到此这篇关于java中抽象类和接口的相同和不同点介绍的文章就介绍到这了,更多相关java中抽象类和接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入浅析Java 抽象类和接口

    目录 一.抽象类 1.抽象类 1.1抽象类的定义 1.2抽象方法的定义方式 1.3抽象类的定义方式 2.抽象类和实例类的区别 3.抽象类示例 4.抽象类的特征 二.接口 1.接口 1.1接口的定义 1.1定义一个接口 1.2 接口的使用 1.3接口的注意事项 2.接口示例 3.接口的特征 三.抽象类和接口的区别 一.抽象类 1.抽象类 1.1抽象类的定义 在Java面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类没有包含足够多的信息来描述一个具体的对

  • Java面向对象基础知识之抽象类和接口

    抽象类(abstract): 抽象类不能创建实例,它只能作为父类被继承.抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性. (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基

  • Java语法之 Java 的多态、抽象类和接口

    目录 一.多态 1. 向上转型 2. 动态绑定 3. 方法重写 4. 向下转型 5. 关键字 super 6. 在构造方法中调用重写方法(坑) 7. 理解多态 8. 小结 二.抽象类 1. 概念 2. 注意事项 3. 抽象类的意义 3. 抽象类的作用 三.接口 1. 语法规则 2. 实现多个接口 3. 接口的继承 4. Comparable 接口 4. Comparator 接口 5. Cloneable 接口和深拷贝 上一篇文章:Java 基础语法之解析 Java 的包和继承 今天这章主要介绍

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java抽象类和接口的区别详情

    1.抽象类 vs 接口  方法类型: 接口只能有抽象方法.抽象类可以有抽象和非抽象方法.从 Java 8 开始,它也可以有默认和静态方法. 最终变量: 在 Java 接口中声明的变量默认是最终的.抽象类可能包含非最终变量. 变量类型: 抽象类可以有final.non-final.静态和非静态变量.接口只有静态和最终变量. 实现: 抽象类可以提供接口的实现.接口不能提供抽象类的实现. 继承 vs 抽象:  Java 接口可以使用关键字"implements"来实现,抽象类可以使用关键字&

  • java中抽象类和接口的相同和不同点介绍

    目录 前言 一.抽象类是什么? 二.接口是什么? 三.抽象类和接口的异同点 总结 前言 本文简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例. 一.抽象类是什么? 在 Java 语言中使用 abstract class 来定义抽象类.抽象类是不能被实例化的,即不能用new关键字来实例化对象.包含抽象方法的一定是抽象类,但抽象类不一定包含抽象方法.如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类.抽象类中的抽象方法的修饰符只能为public或者pr

  • Java中抽象类和接口的区别_动力节点Java学院整理

    接口 1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口. 2 接口里面的成员变量默认都是public static final类型的.必须被显示的初始化. 3 接口里面的方法默认都是public abstract类型的.隐式声明. 4 接口没有构造方法,不能被实例化. 5 接口不能实现另一个接口,但可以继承多个接口. 6 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类. 抽象类 1 如果将一个类

  • Java中抽象类和接口介绍

    目录 1.抽象类 1.1 什么是抽象类? 1.2 抽象类属于什么类型? 1.3 抽象类怎么定义? 1.4 抽象方法 2.接口 2.1 关于接口 2.2 接口怎么定义? 2.3 接口基础语法 总结 1.抽象类 1.1 什么是抽象类? 1.1.1 对抽象类的理解 1.1.2 关于抽象类 类与类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类: 类本身是不存在的,属于抽象类无法创建对象[无法实例化]: 抽象类是用来被子类继承的: finial关键字和abstract关键字不能同时出现: 抽象

  • 详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解.对于设计意图的理解是否正确.合理

  • PHP中抽象类、接口的区别与选择分析

    本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过关键字extends继承. 2.接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量.抽象类中可以声明各种类型成员变量,实现数据的封装.(另JAVA接口中的成员变量都要声明为public static final类型) <?php abstract class Father { funct

  • PHP中抽象类,接口功能、定义方法示例

    本文实例讲述了PHP中抽象类,接口功能.定义方法.分享给大家供大家参考,具体如下: 这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看文字一样.栗子举的不好. 代码测试环境:php5.3.29 接口(interface): 接口就是为抽象而生的,相当于一个约定或规范,方便框架搭建,代码分工. 它里面指定了抽象方法的名称和参数和成员常量,但不能包含任

  • Java多态性抽象类与接口细致详解

    目录 1.多态性 1.1 向上转型 1.2 向下转型 2.抽象类 2.1 抽象类的基本概念 3.接口 3.1 接口的基本概念 3.2 接口的使用限制 3.3 使用接口定义标准 3.4 抽象类与接口的区别 1.多态性 多态性是面向对象的最后一个特征,它本身主要分为两个方面: ​ 方法的多态性:重载与覆写 ​ 1 重载:同一个方法名称,根据参数类型以及个数完成不同功能: ​ 2 覆写:通一个方法,根据操作的子类不同,所完成的功能也不同. ​ 对象的多态性:父子类对象的转换. ​ 1 向上转型:子类对

  • 详解JavaSE中抽象类与接口的定义及使用

    目录 一.抽象类 1.抽象类定义 2.抽象方法 二.接口 1.接口定义 2.类实现接口 3.接口与多态联合 4.extends和implements 5.接口在开发当中的作用 6.is has like 7.抽象类与接口 一.抽象类 1.抽象类定义 1.什么是抽象类? 类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类. 类到对象是实例化,对象到类是抽象. 抽象类无法实例化,无法创建对象.抽象类是类和类之间有共同特征,将这些具有共同特征的类再进一步抽象,就形成了抽象类.由于类本身是

  • java中的interface接口实例详解

     java中的interface接口实例详解 接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在private成员 3.java接口中不能出现方法的具体实现. 4.实现某个接口就必须要实现里面定义的所有方法. 接下来看一个实现接口的案例: package hello;   interface competer{ //定义接口 void set_comp

  • java中实现Comparable接口实现自定义排序的示例

    实例如下所示: class Student implements Comparable{ String name; int gpa; @Override public int compareTo(Object arg0) { // TODO Auto-generated method stub Student s = (Student)arg0; if(gpa == s.gpa) return name.compareTo(s.name); else if(gpa < s.gpa) return

随机推荐