黑马程序员技术交流社区

标题: 子类继承抽象类父类问题 [打印本页]

作者: zhaojiajun    时间: 2014-12-24 15:29
标题: 子类继承抽象类父类问题
abstract class A
{
public A()
{
   this.print();
}
public abstract void print();
}
class B extends A
{
private int temp=30;
public B(int temp){
   this.temp=temp;
}
public void print(){
  System.out.println("temp="+this.temp);
}
}

问题是这样的:子类在继承父类的时候会先调用父类的构造函数,那上面的子类复写的方法里面的参数不就无法获取到了,是不是父类中被调用的抽象方法在复写不不能有参数啊?或者怎么解决这个问题啊?或者有关扩展都请指教,多谢!!

作者: zhengyk    时间: 2014-12-24 15:29
  1. package com.study;
  2. abstract class A {
  3.         A() {
  4.                 this.show();//this指的是new的对象,b的初始值为0;
  5.                 this.show(null);//字符串的初始值为null;
  6.         }
  7.         public abstract void show(String b); //抽象方法不能有方法体
  8.         public abstract void show();
  9.        
  10. }

  11. class B extends A {
  12.         int b=1;
  13.        
  14.         //必须无参数构造,否则不能够直接new B();
  15.         B() {
  16.                 //super
  17.                 System.out.println("B");
  18.         }
  19.         B(int a) {
  20.                 //super
  21.                 System.out.println("我是带参构造B");
  22.         }
  23.         public  void show(){
  24.                 System.out.println("我是空参数子类"+"---"+b);
  25.         }
  26.         public  void show(String b){
  27.                 System.out.println("我是字符串参数子类"+"---"+b);
  28.         }

  29. }
  30. class Test2{
  31.         public static void main(String[] args) {
  32.                 new B();
  33.                 System.out.println("----------------");
  34.                 new B().show();
  35.                 System.out.println("----------------");
  36.                 new B().show("随便给");
  37.                 System.out.println("----------------");
  38.                 new B(111111);
  39.                
  40.                
  41.         }
  42. }
复制代码
结果:我是空参数子类---0
我是字符串参数子类---null
B
----------------
我是空参数子类---0
我是字符串参数子类---null
B
我是空参数子类---1
----------------
我是空参数子类---0
我是字符串参数子类---null
B
我是字符串参数子类---随便给
----------------
我是空参数子类---0
我是字符串参数子类---null
带参构造B



作者: 寻觅    时间: 2014-12-24 18:51
对于抽象,你要注意:只抽取功能定义,不抽取功能主体!
作者: 小徐_y8nUx    时间: 2014-12-25 09:38
学习了!!
作者: 唯爱小七    时间: 2014-12-25 13:18
可以有参数啊,子类只要复写父类的方法就行了。
作者: zhaojiajun    时间: 2014-12-25 14:40
唯爱小七 发表于 2014-12-25 13:18
可以有参数啊,子类只要复写父类的方法就行了。

子类在继承父类的时候会先调用父类的构造函数,那子类复写的方法里面的参数不就无法获取到了,你看上面的代码如果newB(10)会输出多少啊,如果可以有参数的话,你可以讲的详细一点。
作者: 盛世FPA    时间: 2014-12-25 15:55
是的,可以有参数,你自己可以再自己研究下。
作者: 任我行_2014    时间: 2014-12-27 23:54
你还是再看看方法重写定义吧,方法重写要求子类中重写方法声明部分要与父类被重写方法声明部分完全一致 ,因此只要父类抽象方法带参,子类重写也必然带参
作者: zhaozigeng    时间: 2014-12-28 10:17
是的,可以有参数
作者: 陈旭刚520    时间: 2014-12-28 19:36
来学习学习
作者: 阿毛逗你玩    时间: 2014-12-29 14:28
子类在继承父类的时候会先调用父类的构造函数,那上面的子类复写的方法里面的参数不就无法获取到了,是不是父类中被调用的抽象方法在复写不不能有参数啊?或者怎么解决这个问题啊?
构造函数是特殊的方法,子类如果没有显示申明构造函数,默认的就继承父类的方法,如果有构造函数则会用自己的构造函数?
作者: 邓士林    时间: 2015-1-2 14:59
对于父类是不是父类中被调用的抽象方法在复写不不能有参数啊,是可以有参数的,子类只需要实现即可。由于你定义的父类是个抽象类,它是无法实例化对象的,所以只需要实现即可。同时对于子类实现抽象方法的参数,它是一个形式参数,由调用该方法的对象所提供。
作者: lpf870826    时间: 2015-1-2 23:30
类的初始化顺序是:从上面的这个过程来看,父类的构造器在执行时,调用子类的print()方法,此时子类的变量temp还没有进行初始化,则默认值为0,所以在创建子类对象时,无论构造器参数传的什么值,则默认都打印“temp=0”。



具体代码如下:


  1. abstract class A {
  2.     public A() {
  3.         this.print();
  4.     }
  5.     public abstract void print();
  6. }

  7. class B extends A {
  8.     private int temp = 30;
  9.    
  10.     public B(int temp) {
  11.         this.temp = temp;
  12.     }
  13.    
  14.     public void print() {
  15.         System.out.println("temp=" + this.temp);
  16.     }
  17. }

  18. public class TestExtends {
  19.     public static void main (String[] args) {
  20.             B c = new B(3);
  21.     }
  22. }
复制代码
打印结果如下:
temp=0








作者: 励志Java_鸿政    时间: 2015-1-4 00:49
如果是抽象类需重写抽象方法,也可以有多态,父类中的引用指向子类堆中的对象。
作者: 自信流云    时间: 2015-1-11 22:07
重写:子类的方法名、参数列表、返回值类型必须与父类一样;子类中重写后的方法 访问权限要大于等于 父类中被重写的方法。
作者: outsider1020    时间: 2015-1-12 17:58


  1. abstract class A
  2. {
  3.         public A()
  4.         {
  5.                 System.out.println("调用父类的构造方法。。。");
  6.                 this.print();
  7.         }
  8.         public abstract void print();
  9. }

  10. class B extends A
  11. {
  12.         private int temp=30;
  13.         public B(int temp){
  14.                 this.temp=temp;
  15.         }
  16.         public void print(){
  17.                 System.out.println("temp="+this.temp);
  18.                
  19.         }
  20. }

  21. public class test1 {
  22.         public static void main(String[] args) {
  23.                
  24.                         new B(20).print();
  25.         }

  26. }

复制代码


运行结果为:
调用父类的无参构造方法。。。
temp=0
temp=20

这是因为在示例化子类对象时,会先 调用父类的构造方法。由于此时父类并没有提供带参构造器,所以默认调用父类的无参构造方法。temp此时是其默认值0.之后调用子类的带参构造器,为temp赋值,所以打印出来的temp的值为20.


将以上程序稍加改动:


  1. abstract class A
  2. {
  3.         public A()
  4.         {
  5.                 System.out.println("调用父类的构造方法。。。");
  6.                 this.print();
  7.         }
  8.         public abstract void print();
  9. }

  10. class B extends A
  11. {
  12.         private int temp=30;
  13.         public B(){}
  14.         public B(int temp){
  15.                 this.temp=temp;
  16.         }
  17.         public void print(){
  18.                 System.out.println("temp="+this.temp);
  19.                
  20.         }
  21. }

  22. public class test1 {
  23.         public static void main(String[] args) {
  24.                
  25.                         new B().print();
  26.         }

  27. }

复制代码


运行结果为:
调用父类的构造方法。。。
temp=0
temp=30

此时是因为子类 调用的是其无参构造器,this.temp的值就是其成员变量的值。
作者: 万合天宜    时间: 2015-1-13 21:24
子类重写父类方法时要一致
作者: 浅木头    时间: 2015-1-19 12:14
能否不用继承,而用装饰类?我也是初学,刚有这个思路,发上来给楼主,抛砖引玉,见笑了~
作者: zhengyk    时间: 2015-1-19 17:50
1.你的子类里必须要写一个无参的构造函数,否则new B()的时候会报错误。
作者: O(∩_∩)O~wen    时间: 2015-2-4 17:14
你子类里写的那个和父类中的方法名称一样的方法,因为有了参数,已经不是父类中的那个方法了,也就不是方法重写了。方法的重写要求,方法名和方法的参数以及参数类型必须一致。
作者: zhaojiajun    时间: 2015-2-6 09:13
zhengyk 发表于 2014-12-24 15:29
结果:我是空参数子类---0
我是字符串参数子类---null
B

还有一个问题想问一下,写博客的时候,正文代码怎么插入,就像你上面写的那种格式?
作者: zhengyk    时间: 2015-2-6 12:08
[img]C:\Documents and Settings\Administrator\桌面C:\Documents and Settings\Administrator\桌面[/img]




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2