package com.abstracttest;abstract class A {
public abstract void doSomething();
}class B extends A {
public void doSomething() {
System.out.println("do B");
}
}class C extends A {
public void doSomething() {
System.out.println("do C");
}
}public class TestAbstract {
public static void main(String[] args) {
A a1 = new B();
A a2 = new C();
B b = new B();
C c = new C();
doSomething(a1); //这里
doSomething(a2); //这里
doSomething(b); //这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?
doSomething(c); //这里
} public static void doSomething(A a) {//这里,用抽象类,为什么,LZ自己思考
a.doSomething();
}
}将上面的抽象类A改成这样,也能实现同样的功能,求这两个之间的区别?那个更好class A{
public void doSumthing(){}
}
如果你改了以后,那就重写 子类与父类有同样的方法那叫重写。。麻烦楼主,自己多看下书把面向对象,反反复复的看上10遍。。所有的例子都敲一下。
下边那个只能当做父类,直接继承可以,可以不实现!我也是新手,就我的理解来看,比较重要的地方是,一个类只能继承一个父类,所以,如果你写的某个类已经继承了非OBJ的另外一个类,就不能继承你自己写的这个类。但是作为一个接口话,implements 实现
只是新手,探讨一下
abstract class A
{
public void doSumthing(){}
}
楼猪,如果用上面的方式, 加了abstract 表示这个方法是抽象方法, 他自己里面是不能有方法体只是一个“空壳子” 具体的实现由他的子类去实际,就是你的B,C 你会发现,只要继承至A,就一定要实现他的doSomething()
如果你改了以后,那就重写 子类与父类有同样的方法那叫重写。。麻烦楼主,自己多看下书把面向对象,反反复复的看上10遍。。所有的例子都敲一下……
[顶
上面的静态方法表现出多态性,当增加D、E等其他子类时不需要修改原有代码,可维护性更好。
下面的A只有一种行为,也即doSumthing();当A的行为需要被B、C类等与之有同样的doSumthing()行为的类取代时需要修改代码;//这里,如果下面的方法不是用抽象类作参数,比如用C c做参数,这里会有什么问题?doSomething(A a)向其中传递A子类对象参数时不会出现问题,但如果是C等子类签名,那么传递参数对象时应该是C或其子类,这里需了解向上转型和向下转型的区别和面向对象设计里面的可替换原则;
doSomething(a2);
doSomething(b);
doSomething(c);
我初学者,请教可以这样写吗?doSomething是一个方法,定义时没有形参,可以将对象作为参数传给doSomething吗
TestAbstract类里面有个静态的 doSomething(A a)
调用的是这个方法