java中在一个抽象类中不能定义构造方法,Java抽象类/抽象方法定义及其特性详解...

类的继承结构中,越往上的类越具有通用性,也就越抽象。当它抽象到一定程度,就变成概念成框架,不能再产生实例化的对象了。例如“交通工具”,就无法用它来产生一个实例。

对应这一现象,Java中提供了抽象类,它只能作为父类,不能实例化。定义抽象类的作用是将一类对象的共同特点抽象出来,成为代表该类共同特性的抽象概念,其后在描述某一具体对象时,只要添加与其他子类对象的不同之处,而不需要重复类的共同特性。这样就使得程序概念层次分明,开发更高效。与抽象类紧密相连的是抽象方法一它总是用在抽象类或接口中。

一、抽象类的定义

被关键字“abstract”修饰的类,为抽象类。(而且,abstract只能修饰类和方法) abstract class className{

类体;

}

在抽象类中,可以有0个或者多个抽象方法,也可以有普通的实例方法和静态方法,还可以有其他的成员变量和构造方法。如果类中没有任何形式的抽象方法,那么可以由程序员决定是否将类声明成abstract类型,但是只要是下面这些情况之一,那类必定为抽象类,必须加上abstract修饰。类中明确声明有abstract方法的。

类是抽象类继承下来的,而且没有实现父类中全部的抽象方法。

类实现了一个接口,但没有将其中所有的抽象方法实现。

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口。(这点要铭记,有些文章说含有抽象方法的类就是抽象类,这个是不准确的)

那么什么是抽象方法呢?

二、抽象方法的声明

抽象方法:使用abstract关键字定义的方法,抽象方法没有具体的方法体;抽象类必须也要用abstract关键字定义。

抽象方法是一种只有方法声明面没有方法体定义的特殊方法。它的声明部分和一般方法并

没有太大的区别,也有访问权限、返回值类型等,只是需要在前面加上一个关键字“abstract”。通常的形式如下

abstract 访问权限 返回类型 方法名 ([参数列表]);

特持别注意它的最后有一个分号“;”,而没有方法体的括号“{ }”。

例如下面就是一个合法的抽象方法。

abstract protected void eat();

而下面这个,虽然方法体为空,但它不是一个合法的抽象方法。

abstract protected void eat() { }

声明抽象方法时有以下几个限制,具体原理文章后面会讲到构造方法不能声明为 abstract

静态方法不能声明为 abstract

privale方法不能声明为 abstraet

final方法不能声明为 abstract

抽象方法只能出现在抽象类或接口中

三、抽象类的特点

1.抽象类和抽象方法必须用abstract关键字修饰 abstract class 类名 {}

public abstract void 方法名();

2.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口(这点上面讲过,是个易错点)

3.抽象类不能实例化,那么抽象类如何实例化

抽象类如果可以实例化的话,那么就可以调用类中的抽象方法,很明显调用抽象方法是没有意义的,所以抽象类不能实例化,如何非要实例化,那就按照多态的方式,由具体的子类实例化。(其实这也是多态的一种,抽象类多态,不能算抽象类实例化) public class Demo1_Abstract {

public static void main(String[] args) {

//Animal a = new Animal();//错误: Animal是抽象的; 无法实例化

Animal a = new Cat();//父类引用指向子类对象

a.eat();

}

}

abstract class Animal {//抽象类

public abstract void eat();//抽象方法

}

class Cat extends Animal {

public void eat() {

System.out.println("猫吃鱼");

}

}

运行结果:

4.抽象类的子类 要么是抽象类

要么重写抽象类中的所有抽象方法

补充说明

四、抽象类的成员特点

抽象类的成员特点:成员变量:既可以是变量,也可以是常量。(abstract是否可以修饰成员变量?不能修饰成员变量)

构造方法:有,用于子类访问父类数据的初始化。

成员方法:既可以是抽象的,也可以是非抽象的。 abstract class Demo {

int num1 = 10; //定义了变量

final int num2 = 20; //定义了常量

public Demo(){} //构造方法

public void print() {

System.out.println("hello");

}

public abstract void method(); //既有非抽象方法又有抽象方法

}

class Test extends Demo {

public void method() {

System.out.println("world");

}

}

抽象类的成员方法特性:抽象方法:强制要求子类做的事情。

非抽象方法:子类继承的事情,提高代码复用性。

五、抽象类的一些问题解答

1、一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?

可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

2.构造方法为什么不能声明为 abstract?

构造方法不能被继承,一个抽象的构造方法将永远不会被实现,所以它也不能声明为abstract的。

3.abstract不能和哪些关键字共存? 1.abstract和static

被abstract修饰的方法没有方法体

被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的

2.abstract和final

被abstract修饰的方法强制子类重写

被final修饰的不让子类重写,所以他俩是矛盾

3.abstract和private

被abstract修饰的是为了让子类看到并强制重写

被private修饰不让子类访问,所以他俩是矛盾的

测试如下 abstract class Demo {

//public static abstract void print();//错误: 非法的修饰符组合: abstract和static

//public final abstract void print();//错误: 非法的修饰符组合: abstract和final

private abstract void print();//错误: 非法的修饰符组合: abstract和private

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值