/*
定义父类Base类,包含实例属性Book,实例方法Test。
定义子类Sub类,包含实例属性Book,实例方法Test。
在主函数中通过将Sub类实例赋值给Base引用来验证多态。
*/
package Class ;
class Base
{
public int Book = 120;
public Base()
{
//this.Book = Book ;
System.out.println("Base的构造器");//构造器初始化。
}
public void test()
{
System.out.println("Base类的Test方法");
}
}
class Sub extends Base
{
public String Book = "Sub里的Book属性";
public Sub()
{
System.out.println("Sub里的构造函数") ;
}
public void test()
{
System.out.println("Sub里的Test方法") ;
}
}
class Testpolymorphic
{
public static void main(String[] lly)
{
Base class1 = new Base();
System.out.println(class1.Book) ;
class1.test() ;
Sub class2 = new Sub();
System.out.println(class2.Book) ;
class2.test() ;
Base class3 = new Sub();
class3.test() ;
System.out.println(class3.Book) ;
}
}
大神们帮我看哈上面这个程序,Base类里的Book属性如果我直接初始化赋值,这个java文件能编译通过。
如果我是在构造函数里去初始化这个Book属性的话编译会提示我的Base构造函数找不到符号的错误提示。
我的构造函数看上去没什么问题,不知道看是哪儿出问题了。请大神们帮忙看看。
------解决方案--------------------
如果把Book放到构造函数例里,对象能使用BookM吗
------解决方案--------------------
如果我是在构造函数里去初始化这个Book属性的话
这句话是关键呢;
你的无参构造函数没有问题;
------解决方案--------------------
我测试了一下没有任何问题啊
------解决方案--------------------
我把Base类的Book属性放在构建器里初始化了 没有任何问题
------解决方案--------------------
访问属性是根据你以哪个类的名义访问的,访问方法是根据对象的实际类型.
------解决方案--------------------
你这在Base class1 = new Base(17);
用的是有参数的构造方法 而你没有提供有参数的构造方法
------解决方案--------------------
顶楼上!!!
------解决方案--------------------
你的问题:
Base class1 = new Base(17);
这一行在编译时报错:The constructor Base(int) is undefined,也就是构造器Base(int)未定义
解决方法:
要如此生成一个Base对象,你需要提供一个带参数的构造器
比如你在你的Base类里增加一个构造器
public Base(int Book){
this.Book = Book;
System.out.println("带int参数的Base的构造器");// 构造器初始化。
}
------解决方案--------------------
这位兄弟指出了你的问题所在,如果你在构造函数离给book赋值的话,得传入参数。
还有你的变量命名不规范。
------解决方案--------------------
你这个程序中没有public 类啊??你让程序从什么地方开始执行
------解决方案--------------------
你需要给子类提供一个无参构造函数,不然子类无法使用无参构造函数,这也就是编程时习惯给每个类写上无参构造函数
------解决方案--------------------
仔细,多态是java的一种特性,慢慢学吧
------解决方案--------------------
这里我说两点吧:一:Base class3 = new Sub("你好啊"); 当你new class3对象的时候调用了
public Sub(String Book) {
super();
this.Book = Book;
System.out.println("Sub里的有参构造函数");
}
这个super();创建对象的时候默认调用的就是父类无参数的构造方法。输出就会是:Base的无参构造器 Sub里的有参构造函数 class3.test(); 因为重写输出为:Sub里的Test方法
二 :至于你说的为什么是输出45 解释如下:Base class3 = new Sub("你好啊"); class3 是Base类型的 所以输出结果是45 如果class3是Sub类型的那么就会输出:你好啊
------解决方案--------------------
是的 默认会调用父类的无参构造器