一个Java类编译不通过,不知道什么原因原理。

时间:2021-03-08 18:11:33
class Base{
public String name;
public int age;
public Base(String name,int age)
{
 this.name=name;
 this.age=age;
}
public void setAge(int newage)
{
 this.age=newage;
  }
public void print()
{
 System.out.println("Basename:"+name+" Baseage:"+age);
}
}

public class Sub extends Base{
private double grade;
public Sub(int age,String name,double grade)
{
 this.name=name;
 this.age=age;
 this.grade=grade;
}
public static void main(String[] args)
{
 Sub s=new Sub(23,"zpc",90);
 s.setAge(25);
 s.print();//输出子类对象的属性值
 System.out.println("s.grade:"+s.grade);//90
 //System.out.println("s.age:"+s.age);//25
 //System.out.println("s.name:"+s.name);//zpc
}

}

21 个解决方案

#1


通得过就怪了吧?

public Sub(int age,String name,double grade)
{ // 由于父类没有缺省构造函数,所以第一句话必须是super(xxoo);
this.name=name; // 子类根本没有父类name属性的访问权利,父类是private

#2


引用 1 楼 ldh911 的回复:
通得过就怪了吧?

public Sub(int age,String name,double grade)
{ // 由于父类没有缺省构造函数,所以第一句话必须是super(xxoo);
this.name=name; // 子类根本没有父类name属性的访问权利 ,父类是private


老师,我都是写的public的。

#3


缺省的构造函数不是隐式的吗,还要写出来吗?

#4


顺便问一下 ,您有了多少年的Java开发经验了?什么职位目前。

#5


集成的时候子类会默认调用父类的无参构造器,但是你的Base由于有了个public Base(String name,int age)的构造函数,所有Base需要自己去写一个无参数的构造函数。或者你可以把子类的构造函数写成这样:
public Sub(int age, String name, double grade) {
super(name, age); this.name = name;
this.age = age;
this.grade = grade;
}

#6


当类没有构造器的时候是默认有个无参数的构造器,但是一旦增加了带参数的之后,就不存在了

#7


如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊

#8


public Sub(int age, String name, double grade) {
super(name, age);
this.grade = grade;
引用 5 楼 abstruct 的回复:
集成的时候子类会默认调用父类的无参构造器,但是你的Base由于有了个public Base(String name,int age)的构造函数,所有Base需要自己去写一个无参数的构造函数。或者你可以把子类的构造函数写成这样:
public Sub(int age, String name, double grade) {
super(name, age); this.name = nam……

#9


public Sub(int age,String name,double grade)
{
super(name,age) ;  //加上这一行
this.name=name;
this.age=age;
this.grade=grade;
}

super(name,age) ;  //加上这一行
或者 在 Base类中增加 
public Base(){
}

#10


引用 2 楼 zpcandzhj 的回复:
老师,我都是写的public的。


悲剧,我还以为是你另一个帖子里面的定义。。。没注意你这个已经修改为public了。

另外那个super构造的问题别的楼层解释的比较清楚了。

其实没开发多少年,现在基本转行在写文档了,惭愧惭愧。

#11


方法实例化的时候会先调用父类的构造器,不写的时候默认调用父类的无惨构造器(父类没有写的,会自动生成一个,要是有构造器的话就不会再生成无惨的了),就是构造器上面。

#12


两个解决办法:
1 在Base 类里加上:public Base(){};
  子类不动。
2 Base类里不动,修改子类构造函数。即将:
public Sub(int age,String name,double grade)
{
this.name=name;
this.age=age;
this.grade=grade;
}
该为:
public Sub(int age,String name,double grade)
{
super(name.age);
this.grade=grade;
}

#13


super (name,age); 不是点。

#14


java的类,如果没有定义构造器,会有一个默认的构造器。但是,如果你定义了自己的构造器,就需要显示的声明默认构造器了~~~

#15


引用 10 楼 ldh911 的回复:
引用 2 楼 zpcandzhj 的回复:
老师,我都是写的public的。


悲剧,我还以为是你另一个帖子里面的定义。。。没注意你这个已经修改为public了。

另外那个super构造的问题别的楼层解释的比较清楚了。

其实没开发多少年,现在基本转行在写文档了,惭愧惭愧。

厉害,写文档的就是定义接口的人啦!

#16


引用 3 楼 zpcandzhj 的回复:
缺省的构造函数不是隐式的吗,还要写出来吗?

你写了有参的构造方法那么无参的构造方法就不存在了!

#17


引用 7 楼 cai5 的回复:
如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊


请问当一个子类对象被创建时系统会不会默认创建其父类的一个对象?

#18


引用 17 楼 zpcandzhj 的回复:
引用 7 楼 cai5 的回复:
如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊


请问当一个子类对象被创建时系统会不会默认创建其父类的一个对象?

会的。调用父类构造函数时会创建父类对象。

#19


引用 18 楼 quhuafeng521 的回复:
引用 17 楼 zpcandzhj 的回复:
引用 7 楼 cai5 的回复:
如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊


请问当一个子类对象被创建时系统会不会默认创建其父类的一个对象?

会的。调用父类构造函数时会创建父类对象。


初始化和实例化不是同一个概念吧,构造函数只是初始化的功能。饿,其实我也不清楚。也没有什么全面一点的好Java学习书。我是初学者,不想被烂书误导。

#20


Thinking In Java 这本书其实非常好。

#21


如果显示的写了参数不为空的构造方法,则就没有了参数为空的构造方法

#1


通得过就怪了吧?

public Sub(int age,String name,double grade)
{ // 由于父类没有缺省构造函数,所以第一句话必须是super(xxoo);
this.name=name; // 子类根本没有父类name属性的访问权利,父类是private

#2


引用 1 楼 ldh911 的回复:
通得过就怪了吧?

public Sub(int age,String name,double grade)
{ // 由于父类没有缺省构造函数,所以第一句话必须是super(xxoo);
this.name=name; // 子类根本没有父类name属性的访问权利 ,父类是private


老师,我都是写的public的。

#3


缺省的构造函数不是隐式的吗,还要写出来吗?

#4


顺便问一下 ,您有了多少年的Java开发经验了?什么职位目前。

#5


集成的时候子类会默认调用父类的无参构造器,但是你的Base由于有了个public Base(String name,int age)的构造函数,所有Base需要自己去写一个无参数的构造函数。或者你可以把子类的构造函数写成这样:
public Sub(int age, String name, double grade) {
super(name, age); this.name = name;
this.age = age;
this.grade = grade;
}

#6


当类没有构造器的时候是默认有个无参数的构造器,但是一旦增加了带参数的之后,就不存在了

#7


如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊

#8


public Sub(int age, String name, double grade) {
super(name, age);
this.grade = grade;
引用 5 楼 abstruct 的回复:
集成的时候子类会默认调用父类的无参构造器,但是你的Base由于有了个public Base(String name,int age)的构造函数,所有Base需要自己去写一个无参数的构造函数。或者你可以把子类的构造函数写成这样:
public Sub(int age, String name, double grade) {
super(name, age); this.name = nam……

#9


public Sub(int age,String name,double grade)
{
super(name,age) ;  //加上这一行
this.name=name;
this.age=age;
this.grade=grade;
}

super(name,age) ;  //加上这一行
或者 在 Base类中增加 
public Base(){
}

#10


引用 2 楼 zpcandzhj 的回复:
老师,我都是写的public的。


悲剧,我还以为是你另一个帖子里面的定义。。。没注意你这个已经修改为public了。

另外那个super构造的问题别的楼层解释的比较清楚了。

其实没开发多少年,现在基本转行在写文档了,惭愧惭愧。

#11


方法实例化的时候会先调用父类的构造器,不写的时候默认调用父类的无惨构造器(父类没有写的,会自动生成一个,要是有构造器的话就不会再生成无惨的了),就是构造器上面。

#12


两个解决办法:
1 在Base 类里加上:public Base(){};
  子类不动。
2 Base类里不动,修改子类构造函数。即将:
public Sub(int age,String name,double grade)
{
this.name=name;
this.age=age;
this.grade=grade;
}
该为:
public Sub(int age,String name,double grade)
{
super(name.age);
this.grade=grade;
}

#13


super (name,age); 不是点。

#14


java的类,如果没有定义构造器,会有一个默认的构造器。但是,如果你定义了自己的构造器,就需要显示的声明默认构造器了~~~

#15


引用 10 楼 ldh911 的回复:
引用 2 楼 zpcandzhj 的回复:
老师,我都是写的public的。


悲剧,我还以为是你另一个帖子里面的定义。。。没注意你这个已经修改为public了。

另外那个super构造的问题别的楼层解释的比较清楚了。

其实没开发多少年,现在基本转行在写文档了,惭愧惭愧。

厉害,写文档的就是定义接口的人啦!

#16


引用 3 楼 zpcandzhj 的回复:
缺省的构造函数不是隐式的吗,还要写出来吗?

你写了有参的构造方法那么无参的构造方法就不存在了!

#17


引用 7 楼 cai5 的回复:
如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊


请问当一个子类对象被创建时系统会不会默认创建其父类的一个对象?

#18


引用 17 楼 zpcandzhj 的回复:
引用 7 楼 cai5 的回复:
如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊


请问当一个子类对象被创建时系统会不会默认创建其父类的一个对象?

会的。调用父类构造函数时会创建父类对象。

#19


引用 18 楼 quhuafeng521 的回复:
引用 17 楼 zpcandzhj 的回复:
引用 7 楼 cai5 的回复:
如果存在 构造函数 ,会把默认的构造函数给屏蔽掉啊


请问当一个子类对象被创建时系统会不会默认创建其父类的一个对象?

会的。调用父类构造函数时会创建父类对象。


初始化和实例化不是同一个概念吧,构造函数只是初始化的功能。饿,其实我也不清楚。也没有什么全面一点的好Java学习书。我是初学者,不想被烂书误导。

#20


Thinking In Java 这本书其实非常好。

#21


如果显示的写了参数不为空的构造方法,则就没有了参数为空的构造方法