黑马程序员技术交流社区
标题:
初学继承问题
[打印本页]
作者:
孙飞
时间:
2012-6-22 20:05
标题:
初学继承问题
本帖最后由 feigecal 于 2012-6-23 22:26 编辑
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay)
{
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();
}
class Manager extends Employee
{
private int jiangJin;
Manager(String name,String id,double pay,int jiangJin)
{
super(name,id,pay);
this.jiangJin=jiangJin;
}
public void work()
{
System.out.println("ok");
}
}
class Test
{
public static void main(String[] args)
{
Manager m= new Manager();//提示找不到符号,怎么回事啊?
m.work();
System.out.println("Hello World!");
}
}
作者:
丁二跃
时间:
2012-6-22 20:13
因为 Manager 类中没有 Manager() 这个无参数的构造方法。
本来java 默认的有 无参构造方法,但是你在程序中重新定义了构造方法Manager(String name,String id,double pay,int jiangJin)
那么原来的无参构造方法就被覆盖了,要想使用需重新定义…………
作者:
张文强
时间:
2012-6-22 20:16
本帖最后由 张文强 于 2012-6-22 20:40 编辑
public class Test
{
public static void main(String[] args)
{ // Manager m= new Manager();//它在找空参数的构造函数初始化,如果类中没有,就是说没有与之对应的初始化方式。会提示找不到符号
Manager m= new Manager("zhangsan","sss",3443,32);
m.work();
System.out.println("Hello World!");
}
复制代码
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。
作者:
孙飞
时间:
2012-6-22 20:24
那在子类 里加了空参的构造函数还是不行啊?
作者:
王涛
时间:
2012-6-22 20:56
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee() //在父类中写一个空参数的Employee()方法。
{
}
Employee(String name,String id,double pay)
{
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();
}
class Manager extends Employee
{
private int jiangJin;
Manager(String name,String id,double pay,int jiangJin)
{
super(name,id,pay);
this.jiangJin=jiangJin;
}
Manager()
{
}
public void work()
{
System.out.println("ok");
}
}
class Test
{
public static void main(String[] args)
{
//Manager m= new Manager("wt","13",23,1000); //提示找不到符号,怎么回事啊?
Manager m= new Manager();
m.work();
System.out.println("Hello World!");
}
}
你在父类中写一个空参数的,用子类去继承,然后才可以再子类中调用空参数的Manager()
看下代码吧。
作者:
范家鹏
时间:
2012-6-22 20:57
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee(){};
Employee(String name,String id,double pay)
{
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();
}
class Manager extends Employee
{
Manager(){};
private int jiangJin;
Manager(String name,String id,double pay,int jiangJin)
{
super(name,id,pay);
this.jiangJin=jiangJin;
}
public void work()
{
System.out.println("ok");
}
}
class Test
{
public static void main(String[] args)
{
Manager m= new Manager();//提示找不到符号,怎么回事啊?
m.work();
System.out.println("Hello World!");
}
}
复制代码
这样就行了,
这句话Manager m= new Manager();在创建Manager对象时,
会调用Manager的空参数的构造函数;在类中得添加一个空参数的构造函数Manager(){};
又因为Manager继承了Employee
Manager的空参数构造中有一句隐式的父类空参数构造,也就是Employee的空参数构造,
你在上面写了一个Employee的带参构造,原来默认的无参构造就被覆盖了,
所以在Employee类中必须要手动添加一个Employee(){}才行
作者:
黄连兵
时间:
2012-6-22 20:58
Manager m= new Manager();//提示找不到符号,怎么回事啊?
子类所有的构造函数中隐式地会调用父类无参构造函数,也就是在构造函数的第一句默认的是:super();而你的父类Employee中没有定义这个空参构造函数,所以编译器会找不到。
作者:
张文强
时间:
2012-6-22 21:19
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee()
{
System.out.println("Employee中空参数构造函数");
}
Employee(String name,String id,double pay)
{
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();
}
class Manager extends Employee
{
private int jiangJin;
Manager()
{
System.out.println("Manager空参数构造函数");
}
Manager(String name,String id,double pay,int jiangJin)
{
super(name,id,pay);
this.jiangJin=jiangJin;
}
public void work()
{
System.out.println("ok");
}
}
class Test
{
public static void main(String[] args)
{
Manager m= new Manager();//它在找空参数的构造函数初始化,找到了之后在对象初始化时,要先访问一下父类中对应的构造函数。
//而当在类中自定义了构造函数后,默认的构造函数就没有了。所以父类中也要手动加空参构造函数。
m.work();
System.out.println("Hello World!");
}
}
复制代码
{:soso_e127:}这下了解了吧
作者:
谭立文
时间:
2012-6-22 22:27
如果你在类体里没有定义任何构造方法,系统默认给你的是一个无参数的构造方法,一旦你自己定义了构造方法,系统将不提供任何构造方法,所以你 Manager m= new Manager();会提示找不到符号,因为你定义了Manager(String name,String id,double pay,int jiangJin)构造方法,系统就不再为你提供默认的构造方法了。
作者:
李文龙
时间:
2012-6-22 22:35
java程序中,每个class类都会有构造函数,分为无参构造函数和有参构造函数,当你没有定义构造函数的时候,系统会提供一个无参构造函数,但是,当你定义了构造函数,无论是无参构造函数还是有参构造函数,系统都将不再提供无参构造函数了,所以你的Manager m= new Manager(); 这里是调用无参构造函数初始化 m 对象,而你的程序中已经有了一个有参构造函数,并没有定义无参构造函数,系统当然就提示报错了。改正的方法是 你在类里边定义一个无参构造函数,或者调用有参构造函数为 m 对象赋值。
作者:
游洪波
时间:
2012-6-23 19:36
abstract class Employee
{
private String name;
private String id;
private double pay;
Employee(String name,String id,double pay)
{
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();
}
class Manager extends Employee
{
private int jiangJin;
Manager(String name,String id,double pay,int jiangJin)//看到你的构造方法没有,这个里边是需要参数的。
{
super(name,id,pay);
this.jiangJin=jiangJin;
}
//如果你想你下边的那个实例化不报错的话不防试试java中的方法的重载
Manager(){//这样下边在实例化的时候就不会报错了,你可以好好看看java中方法重载和重写这块。
}
public void work()
{
System.out.println("ok");
}
}
class Test
{
public static void main(String[] args)
{
Manager m= new Manager();//而你这边在为Manager 实例化的时候却没有传入对应的参数
m.work();
System.out.println("Hello World!");
}
}
作者:
常佳杰
时间:
2012-6-23 21:14
楼上的都是正解,
调用基类方法或属性时,会沿着继承链逐级往上寻找,以最近为原则,找到就调用,找不到就报错
添加一句抽象类中的方法必须全都被重写..
你对子类实例化时,调用了基类的属性但没找到基类的属性值,所以报错..
作者:
刘天骆
时间:
2012-6-23 22:56
要在类中加入无参的构造函数
manager()
{}
作者:
陈洋洋
时间:
2012-6-23 23:52
需要在子类中加上空参的构造函数,因为你在子类中定义了一个有参的构造函数,JVM就不会再默认生成一个无参的构造函数,所以需要你显示定义一个无参的构造函数才能建立无参的构造函数,然而子类的构造函数都是默认要先寻找父类的空参构造函数,而你父类的构造函数也定义了有参的.所以一样不会再默认生成一个无参的了.所以你需要在子类的空参构造函数的第一行,显示指定父类的构造函数,或者在父类中也加上一个空参的构造函数.这样就可以创建Manager m= new Manager();这个对象了.. ..你试试..
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2