【Java关键字】abstract抽象

抽象类就是为了继承(重写)而存在的。如果定义了一个抽象类却不继承,那是没有任何用处的。当然,在继承之后,之类必须对父类中所有没有实现的方法进行实现,否则是不被允许的(除非是抽象类继承的抽象类,此时可以不实现)。

abstract类

有抽象方法的类,必须是抽象类。抽象类和普通的类一样,可以没有抽象方法,可以拥有成员变量和普通的成员方法。
因为抽象类中含有无具体实现的方法,所以不能用抽象类创建实例对象!
可以有静态方法的,在被子类继承后可以通过子类的实例化对象调用;也可以直接通过抽象类和子类的类名来调用,就像其他的静态方法一样。同样的静态变量也可以使用相同的方法访问。
当然可能一个类,只用abstract修饰,但是却没有抽象方法,这也属于抽象类,是不可以实例化的。如果要是没有抽象方法的话为什么还要设计成抽象类呢?

AbstractStringBuilder.class(jdk1.8)

//有抽象方法的类,必须是抽象类。public abstract String toString()
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    int count;
    AbstractStringBuilder() {
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }
    //一个类,只用abstract修饰,但是却没有抽象方法,这也属于抽象类,是不可以实例化的
	public AbstractStringBuilder append(char[] str) {
	        int len = str.length;
	        ensureCapacityInternal(count + len);
	        System.arraycopy(str, 0, value, count, len);
	        count += len;
	        return this;
	    }
	@Override
    public AbstractStringBuilder append(char c) {
        ensureCapacityInternal(count + 1);
        value[count++] = c;
        return this;
    }
	@Override
	public abstract String toString();//因为抽象类中含有无具体实现的方法,所以不能用抽象类创建实例对象!
}

abstract方法

Java抽象类中不能有静态的抽象方法。
抽象类是不能实例化的,即不能被分配内存;而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以抽象类中不能有静态的抽象方法。
另外,定义抽象方法的目的是重写此方法,但如果定义成静态方法就不能被重写。

抽象类和接口比较

语法层面上的区别

接口只能有public abstract 方法,抽象类的方法类型更多,可以有普通方法;
接口中的成员变量只能是public static final类型的,抽象类的变量类型更多,可以有普通变量;
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
一个类只能继承一个抽象类,而一个类却可以实现多个接口。

设计层面上的区别

  1. 抽象类是对事物的抽象(类的抽象),接口是对行为的抽象。
    比如定义Bird是一个抽象类,实现它的有各种鸟类。定义一个接口是fly,各种鸟类可以实现这个接口。通俗来说:继承是一个 “是不是”的关系,而 接口 实现则是 “有没有”的关系。鸟类继承了Bird,那就注定它的种类,而至于是否实现fly接口,只是觉得它是否拥有这项特点(行为)。

  2. 抽象类是一种模板式设计,接口是一种行为规范,一种辐射式设计。
    比如对于同一个方法,通过抽象类模板式设计后,当修改该方法时,只需要在模板中修改,所有子类均可得到更新;通过接口辐射式设计后,当修改该方法时,需要在所有实现类中进行修改,才可以得到更新,相互独立的。

两者使用上的联系

  1. 接口若继承,则必须继承接口。不能实现。不能继承抽象类

  2. 抽象类 可以实现接口,可以继承抽象类,不能继承接口

参考:https://www.i3geek.com/archives/1230

发布了99 篇原创文章 · 获赞 106 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/lglglgl/article/details/105042886
今日推荐