A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韩伟 中级黑马   /  2012-7-13 08:48  /  1490 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 韩伟 于 2012-7-13 12:31 编辑

有这个么一个程序:
abstract class Base{
abstract public void myfunc();
public void another(){
System.out.println("Another method");
}
}

public class Abs extends Base{
public static void main(String args[]){
Base a = new Abs();
a. another ();
}
public void myfunc(){
System.out.println("My Func");
}
public void another (){
myfunc();
}
}

我本以为这个程序编译会通不过,但是编译执行都没问题,我想问一下,抽象类不是必须在子类中实现吗?

6 个回复

倒序浏览
abstract class Base{
abstract public void myfunc();
public void another(){
System.out.println("Another method");
}
}
这个类是抽象类,其中有两个方法,一个是抽象方法abstract public void myfunc();
,另外一个是非抽象方法。
子类继承了父类,并且实现了抽象方法public void myfunc(){
System.out.println("My Func");
}
子类就可以实例化对象了。因为父类中只有这一个抽象方法。

主函数中:
Base a = new Abs();
a. another ();
创建了Abs() 对象,调用自己的方法another,而another方法内部调用了myfunc,就是子类复写抽象方法myfunc,打印结果:My Func

回复 使用道具 举报
  1. abstract class Base{
  2. abstract public void myfunc();
  3. public void another(){
  4. System.out.println("Another method");
  5. }
  6. }

  7. public class Abs extends Base{
  8. public static void main(String args[]){
  9. Base a = new Abs();
  10. a. another ();
  11. }
  12. public void myfunc(){
  13. System.out.println("My Func");
  14. } //这里你不是实现了吗?这是对的呀
  15. public void another (){
  16. myfunc();
  17. }
  18. }
复制代码
回复 使用道具 举报
抽象类的实现必须通过子类来完成,说的是接口,你的程序用的是继承和多态。
在多态中成员函数的特点:
在编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败。
在运行时期,参阅对象所属的类中是否有调用的方法。
也就是说,编译的时候会在父类中找相应的调用方法,而执行的时候,是执行子类具体对象的调用方法。
回复 使用道具 举报
如果子类不是抽象类,要实现该类的对象,就必须对抽象类中的抽象方法进行实现,但要是子类还是抽象类,那就不是必须的了
回复 使用道具 举报
  1. abstract class Base{
  2. abstract public void myfunc(); // 抽象方法
  3. public void another(){
  4. System.out.println("Another method");
  5. }
  6. }

  7. public class Abs extends Base{
  8. public static void main(String args[]){
  9. Base a = new Abs();
  10. a. another ();
  11. }
  12. public void myfunc(){  // 子类实现了抽象类中的抽象方法,当然编译没有问题。
  13. System.out.println("My Func");
  14. }
  15. public void another (){ // 这个只是复写父类方法
  16. myfunc();
  17. }
  18. }
复制代码
回复 使用道具 举报
杨康 中级黑马 2012-7-13 14:32:10
7#
abstract class Base
{
        abstract public void myfunc();
        public void another()
        {
                System.out.println("Another method");
        }
}

class Abs extends Base
{
        public static void main(String[] args)
        {
                Base a = new Abs();//运用了对象多态的特点,父类引用指向子类对象
                a.another();//调用自己another()方法,而该方法中对父类的方法进行了复写
        }
        public void myfunc()
        {
                System.out.println("My Func");
        }
        public void another()
        {
                myfunc();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马