本帖最后由 苏联兵 于 2013-9-9 14:38 编辑
可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。
class Person
{
Person()
{
System.out.println("抽象类可以继承具体类");
}
}
abstract class Study extends Person
{
abstract void study();
}
class Mike extends Study
{
void study()
{
System.out.println("学习Java");
}
}
class Jock extends Study
{
void study()
{
System.out.println("学习C语言");
}
}
class Parte extends Study
{
void study()
{
System.out.println("学习html");
}
}
class AbstractDemo
{
public static void main(String[] args)
{
Study m = new Mike();
m.study();
Study j = new Jock();
j.study();
Study p = new Parte();
p.study();
}
}
所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个共有无参的构造方法,而你只要自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器,所有的子类构造器都要求在第一行中调用父类构造器,如果不写,系统就默认去调用父类的无参构造器。- class A()
- {
- public A(){}
- }
- //B继承A的时候,则是
- abstract class B extends A
- {
- public B(){
- super();
- }
- }
- //要想知道继承规则的内部情况,在上面加个私有构造器,有无参都行。
- classA{
- private A(){}
- }/*
- 这个时候系统就不再给你默认的无参构造器,B的构造器去调用super(),找不到A的无参构造器
- 所以导致abstract class B extends A{}编译不能通过,(因为A中没有任何无参构造器可供子类调用,其实这个时候A只能够提供内部类继承,)
- */
复制代码 所以现在你应该了解“实体类必须有明确的构造函数”的含义:
1,没写构造器的,那就是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。
2,写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。
3,写了有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。
4,声明为final的以及所有构造器都不再=在子类访问权限之内的类无法继承。
其实只要是在类的继承中无论抽象还是实体,都需要符合这个规定,上面的代码中随时删掉或加上abstract的前提,结果没有变化,个人觉得“实体类必须有明确的构造函数”这一句是在是无法把这个情况表达清楚。 |