抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
在java语言中使用abstract class
来定义抽象类
public abstract class MyAbsClasss {
private int age;
public MyAbsClasss(){
this.age = 10;
}
public abstract void m2();
//其他包的子类可以访问,相对比较安全
protected abstract void m1();
//如果不加修饰符的话,其他包的类如果想要继承这个类的话就不能成功,
//因为子类必须实现抽象方法,但是default的实现又无法访问
abstract void m3();
//private abstract m4(); //编译无法通过,抽象方法必须被继承
}
抽象类的作用是:抽象类是用来捕捉子类的通用特性的,是被用来创建继承层级里子类的模板
综述,抽象类有如下限制 :
-
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
接口
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口里面只是包含方法和静态常量:
public interface MyInterface {
//public static final 可以省略
int A = 10;
//public 可省略
void getA();
//接口中不能使用protected,因为接口设计的目的就是对所有类公开
//protected getB();
}
一道面试题
抽象类和接口的区别是什么?
-
接口支持多继承,类只是支持单继承
-
从属性和方法两个角度来回答:
-
接口只能声明常量,抽象类可以声明类变量,成员变量,常量
public abstract class MyAbsClasss { private int age; protected static String name; public static final String gender = "qqq"; } public interface MyInterface { //public static final 可以省略 int A = 10; }
-
接口只能声明抽象方法(1.8之前,1.8之后可以声明静态方法和default方法),抽象类可以声明所有类型的方法
public interface A { void m(); default void m1(){ System.out.println("A"); } static void m2(){ } } public abstract class AbstractClass { public void m1(){ } private void m3(){ } private static void m4() { } protected void m5(){ } public static void m2(){ } }
-
接口的多实现:
如果接口只有抽象方法的话可以完全不必考虑子类的多继承,但是从jdk1.8之后添加了static和default方法,静态方法无需担心子类的问题,因为静态方法不能被重写,但是default方法却出现了一个小矛盾。试想:如果我们现在有两个接口A和B,里面都实现了**m1()**方法,那么子类C同时继承接口A和B会不会出现什么问题呢?
public interface A {
default void m1(){
System.out.println("A");
}
}
public interface B {
default void m1(){
System.out.println("B");
}
}
//如果不重写m1方法的话,是无法编译通过的
public class C implements A,B {
@Override
public void m1() {
A.super.m1();//使用这个方法告诉调用子类和调用父接口的哪一个默认方法
}
}
接口为什么多继承,类为什么单继承?
- 接口的定义里面只有抽象方法,里面没有方法的具体实现,所以继承多个接口的话只要自己重写方法就可以了,不用考虑相同实现的方法的方法体之间的矛盾
- 类之间如果允许多继承的话,两个类中有相同的属性和方法该怎么办? 如果不要父类的属性或者方法不就不叫继承了嘛!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202496.html