java基础之抽象类和接口的理解以及之间的区别

一、抽象类
什么是抽象类
包含抽象方法的类叫做抽象类。如果一个类中含有一个或多个抽象方法,该类必须限定为抽象的。抽象类必须由 abstract关键字来限定这个类。
定义一个抽象类
public abstract class Animal{
   public abstract void bark();
}
抽象类和普通类的区别
  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;
   }

}

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();    //子类调用已经实现过的方法
  }
}

注:

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

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

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

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

注意接口有关的关键点
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,[....]{
}

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

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();//调用接口方法
    }
}

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

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值