当前位置:   article > 正文

java基础之抽象类和接口的理解以及之间的区别_谈谈你对抽象类和接口的理解及他们的区别。

谈谈你对抽象类和接口的理解及他们的区别。
一、抽象类
什么是抽象类
包含抽象方法的类叫做抽象类。如果一个类中含有一个或多个抽象方法,该类必须限定为抽象的。抽象类必须由 abstract关键字来限定这个类。
定义一个抽象类
public abstract class Animal{
   public abstract void bark();
}
  • 1
  • 2
  • 3
抽象类和普通类的区别
  1. 抽象类并不是只能包含象方抽法,他也可以包含普通的成员方法和成员变量。
  2. 抽象类中的抽象方法只能用public或protected修饰。因为,抽象方法来到世间就是为了让子类继承重写的,而private的方法不能被子类继承,显然矛盾。
  3. 抽象类不能创建对象,即不能实例化。因为,抽象类中包含没有实现的抽象方法,是不完整的,所以不能用来创建对象。(有一种特殊情况,就是一个类中并没有抽象方法,但是类class有abstract修饰,被声明为抽象类,那么这个类也是抽象类,也不能实例化。)
class TestOne {
   public static void main(String[] args) {
   	// 这里会报错,无法实例化类型Demo1
   	Demo1 demo1 = new Demo1(34);//报错
   }
}

abstract class Demo1 {
   private int age;
   public Demo1(int age) {
   	this.age = age;
   }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

4 如果一个类继承于一个抽象类,那么子类必须实现父类的抽象方法。否则,子类继承的方法还是抽象方法,子类也变成了抽象类,要用abstract修饰。
在其他方面,抽象类和普通类并无区别。


public abstract class Animal {  //抽象类中可以有非抽象方法,也可以有成员变量
  private int a = 10;
   
  public abstract void bark();  
    //如果没有此抽象方法,但是class前有absract修饰,也是抽象类,也不能实例化
  public void say() {            //普通成员方法
    System.out.println("我是抽象类中的非抽象方法,此抽象类中的私有成员变量a= " + a);
  }
 
  public int getA() {
    return a;
  }
  public void setA(int a) {
    this.a = a;
  }
}

public class Dog extends Animal{
  public void bark() {        //子类实现Animal的抽象方法
    System.out.println("汪汪~汪汪~");  
    System.out.println("我是子类,不能直接调用父类的私有变量a  :(");  
    System.out.println("我是子类,只有通过super.getA()调用父类的私有变量a:" + super.getA());  
  }
}
public class Test {
  public static void main(String[] args) {
    Dog dog = new Dog();
    dog.say();    //子类继承调用Animal的普通成员方法
    dog.bark();    //子类调用已经实现过的方法
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

注:

抽象类方法
JDK 1.8以前,抽象类的方法默认访问权限为protected(可以是public和protected)
JDK 1.8时,抽象类的方法默认访问权限变为default(可以是public和protected或者不写)

二、接口
什么是接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,但基本没什么意义,在我的开发经验里还没有在实际项目中在接口声明变量的应用。

接口的实现语法
[public] interface InterfaceName {
 	public void method(); //抽象方法,默认就是abstract,所以直接这样写就好了
}

  • 1
  • 2
  • 3
  • 4
注意接口有关的关键点
1、接口方法 JDK 1.8以前,接口中的方法默认,也必须是public的(只能用public) JDK 1.8时,接口中的方法默认public的,也可以是default的(可以是public和default) JDK 1.9时,接口中的方法可以是private的(可以是public和default和private) 属性的访问控制修饰符 2、要让一个类遵循某组特定的接口需要使用implements关键字,具体格式如下:

class ClassName implements Interface1,Interface2,[....]{
}
  • 1
  • 2
  • 3

可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的
所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

public class Test {
    public static void main(String[] args) {
        Computer c = new Computer();
        c.plugin(new Phone());
        c.plugin(new Print());
    }
}
interface Usb{//定义接口
    public void install();
    public void work();
}
class Phone implements Usb{//实现usb接口
    public void install() {
        System.out.println("安装手机驱动程序。");
    }
    public void work() {
        System.out.println("从电脑拷贝数据到手机上。");
    }
}
class Print implements Usb{//实现usb接口
    public void install() {
        System.out.println("安装打印机驱动程序。");
    }
    public void work() {
        System.out.println("打印一份文件。");
    }
}
class Computer{//在电脑上应用Usb接口
    public void plugin(Usb usb) {//接收usb接口实例
        usb.install();//调用接口方法
        usb.work();//调用接口方法
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

以下内容转自:https://blog.csdn.net/chengqiuming/article/details/70139323

三、接口和抽象类的相似性

1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

四、接口和抽象类的区别
1 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。

2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。

3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

4 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。

5 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/180505?site
推荐阅读
相关标签
  

闽ICP备14008679号