我发现一个问题,如果有一个抽象类,定义了1个抽象方法,那么它的派生类没有定义抽象方法,这时再创建一个类来创建派生类的对象时,是错的
但是:如果这时我在基类中再定义一个抽象类,并且在派生类中只定义一个抽象方法,此时再创建派生类对象的时候居然可以编译,这是为什么??
但是:如果这时我在基类中再定义一个抽象类,并且在派生类中只定义一个抽象方法,此时再创建派生类对象的时候居然可以编译,这是为什么??
解决方案 »
- 数字转换问题
- 求组合算法
- 有没有SWT的字体设置控件啊?就像QQ或FeiQ聊天窗口里的。
- 用mina2做的消息处理服务端,集群或者分布式问题 标题要长...................................
- 如何设置DatagramSocket.receive()超时,解除阻塞,并不抛出exception
- 如何获得jTree所有节点的名称,并把它放到动态数组里
- 真郁闷这么简单的题都不会,求助!!
- 菜鸟弱弱的问:J2EE J2SE J2ME EJB 之间的区别与关系.不是100分送上!!!~~~~~~~~~~~谢谢~~
- 谁做过21点的?可否送上源码?
- 正则表达式求助
- 为什么会有如下错误呢?
- 求最新版的snap-connectionpool连接池
abstract class a {
public abstract void aa();
public abstract class zz{
}
}class b extends a {
public void aa() {
}
}没有问题吖,子类已经重写了父类的抽像方法了。
你是不是想问为什么子类没有“重写”父类里的那个抽象类,却可以编译通过??
子类只需要重写父类的抽像方法就可以了,zz不是方法,所以根本不能重写。
所以如果你用子类继承了他只需要实现它的抽象方法而并不需要实现它的抽象子类。
第一段:
public abstract class Animal{
public abstract void sound(); //抽象方法
public abstract void speed(); //同上
public Animal(String aType){
type = new String(aType);
}
public String toString(){
return "This is a " + type;
}
private String type;
}
第二段:
public class Dog extends Animal {
public Dog(String aName){
super("Dog");
name = aName;
breed = "Unknown";
}
public Dog(String aName, String aBreed){
super("Dog");
name = aName;
breed = aBreed;
}
public String toString(){
return super.toString() + "\nIt's " + name + " the " + breed;
}
public void sound(){ //我这里定义了基类中的一个抽象方法
System.out.println("Woof Woof");
}
private String name;
private String breed;
}
第三段:
public class TestDerived {
public static void main(String[] args){
Dog aDog = new Dog("Fido","Chihuahua");//生成了Dog对象,但是我Dog对象里只定义了一个抽象方法
Dog starDog = new Dog("Lassie");
System.out.println(aDog);
System.out.println(starDog);
}
}
基类中有2个抽象方法,但是在派生类中只定义了一个抽象方法,而Dog类我并没有声明为 abstract ,但在创建Dog对象时却没问题~~
public void sound(){ //我这里定义了基类中的一个抽象方法
System.out.println("Woof Woof");
} 明明是实现,怎么说是定义!
public abstract void test();
}
public class SubClass extends AbstractSuper {
//Nothing
}抽象类的定义是包含抽象方法的类,因为抽象方法没有方法体,所以不能创建抽象类的实例(否则调用抽象方法该如何执行?)虽然 SubClass 没有定义抽象方法,但它从超类 AbstractSuper 中继承了一个抽象方法 test,所以子类 SubClass 实际是有抽象方法的,当然不能创建 SubClass 的实例,而且如果 SubClass 不用 abstract 修饰它本身就会产生编译错误,而不是在 new 它实例时。
//我来贴代码~~~
//第一段:
abstract class Animal { public abstract void sound(); //抽象方法 public abstract void speed(); //同上 public Animal(String aType) {
this.type = new String(aType);
} public String toString() {
return "This is a " + this.type;
} private String type;}//第二段:
class Dog extends Animal { //此处导致编译失败 The type Dog must implement the inherited abstract method Animal.speed() public Dog(String aName) {
super("Dog");
this.name = aName;
this.breed = "Unknown";
} public Dog(String aName, String aBreed) {
super("Dog");
this.name = aName;
this.breed = aBreed;
} public String toString() {
return super.toString() + "\nIt's " + this.name + " the " + this.breed;
} public void sound() { //我这里定义了基类中的一个抽象方法 //更正:我这里实现了超类中的一个抽象方法
System.out.println("Woof Woof");
} private String name;
private String breed;}//第三段:
public class TestDerived { public static void main(String[] args) {
Dog aDog = new Dog("Fido", "Chihuahua"); //生成了Dog对象,但是我Dog对象里只定义了一个抽象方法
Dog starDog = new Dog("Lassie");
System.out.println(aDog);
System.out.println(starDog);
}}//基类中有2个抽象方法,但是在派生类中只定义了一个抽象方法,而Dog类我并没有声明为 abstract ,但在创建Dog对象时却没问题~~