/* 定义父类Base类,包含实例属性Book,实例方法Test。 定义子类Sub类,包含实例属性Book,实例方法Test。 在主函数中通过将Sub类实例赋值给Base引用来验证多态。 */ package Class ; class Base { public int Book ; 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(17); 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属性放在构建器里进行初始化,我自己编译是出错的。大神们帮忙看看你们是否也是编译出错的。
我把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的构造器");// 构造器初始化。 }
package Class ; class Base { public int Book ; public Base(int Book) { 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(17); 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) ; } }我那个形参在修改是忘记修改了。应该要加形式参数的,可是问题就是加了形式参数,在构建器中初始化之后无法编译通过。 上面是我加了形参之后在构建器中初始化的代码。大神帮忙试试。 我编译的错误提示是: D:\wfjava\soc>javac -d .. Testpolymorphic.java Testpolymorphic.java:25: 找不到符号 符号: 构造函数 Base() 位置: 类 Class.Base { ^ 1 错误D:\wfjava\soc>
我子类就是只用了无参构建器额哦 public Sub() { System.out.println("Sub里的构造函数") ; }
大神们。我的在Base里增加了一个无参构造函数之后编译通过了,为了验证方便我在无参构建器里初始化了Base的Book属性为45。表现出class3.Book的值是45。 我有如下疑问,大家帮忙看一下 按多态原则,对象属性值运行时总数表现出编译是类型的属性,所以输出45,类型是int,这个和Base的Book是int类型是相对于的,我感觉能解释通。 但是为什么就表现出无参构建器初始化的属性值而不是有参构建器的初始化值呢? 下面是我修改过的代码,我对结果解释不太通 /* 定义父类Base类,包含实例属性Book,实例方法Test。 定义子类Sub类,包含实例属性Book,实例方法Test。 在主函数中通过将Sub类实例赋值给Base引用来验证多态。 */ package Class ; class Base { public int Book ; public Base() { this.Book = 45 ; System.out.println("Base的无参构造器"); } public Base(int Book) { 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() { this.Book = "无参初始化" ; System.out.println("Sub里的无参构造函数") ; } public Sub(String Book) { this.Book = Book ; System.out.println("Sub里的有参构造函数") ; } public void test() { System.out.println("Sub里的Test方法") ; }
} public class Testpolymorphic { public static void main(String[] lly) {
Base class1 = new Base(23); 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,实例方法Test。
定义子类Sub类,包含实例属性Book,实例方法Test。
在主函数中通过将Sub类实例赋值给Base引用来验证多态。
*/
package Class ;
class Base
{
public int Book ;
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(17);
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属性放在构建器里进行初始化,我自己编译是出错的。大神们帮忙看看你们是否也是编译出错的。
用的是有参数的构造方法 而你没有提供有参数的构造方法
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的构造器");// 构造器初始化。
}
还有你的变量命名不规范。
class Base
{
public int Book ;
public Base(int Book)
{
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(17);
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) ;
}
}我那个形参在修改是忘记修改了。应该要加形式参数的,可是问题就是加了形式参数,在构建器中初始化之后无法编译通过。
上面是我加了形参之后在构建器中初始化的代码。大神帮忙试试。
我编译的错误提示是:
D:\wfjava\soc>javac -d .. Testpolymorphic.java
Testpolymorphic.java:25: 找不到符号
符号: 构造函数 Base()
位置: 类 Class.Base
{
^
1 错误D:\wfjava\soc>
public Sub()
{
System.out.println("Sub里的构造函数") ;
}
我有如下疑问,大家帮忙看一下
按多态原则,对象属性值运行时总数表现出编译是类型的属性,所以输出45,类型是int,这个和Base的Book是int类型是相对于的,我感觉能解释通。
但是为什么就表现出无参构建器初始化的属性值而不是有参构建器的初始化值呢?
下面是我修改过的代码,我对结果解释不太通
/*
定义父类Base类,包含实例属性Book,实例方法Test。
定义子类Sub类,包含实例属性Book,实例方法Test。
在主函数中通过将Sub类实例赋值给Base引用来验证多态。
*/
package Class ;
class Base
{
public int Book ;
public Base()
{
this.Book = 45 ;
System.out.println("Base的无参构造器");
}
public Base(int Book)
{
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()
{
this.Book = "无参初始化" ;
System.out.println("Sub里的无参构造函数") ;
}
public Sub(String Book)
{
this.Book = Book ;
System.out.println("Sub里的有参构造函数") ;
}
public void test()
{
System.out.println("Sub里的Test方法") ;
}
} public class Testpolymorphic
{
public static void main(String[] lly)
{
Base class1 = new Base(23);
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) ;
}
}
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类型的那么就会输出:你好啊
而这个隐式创建父类对象时调用的构建器是调用无惨构建器初始化的(就算我们没有显示调用父类构建器)。如果我们在子类中调用父类有参数构建器的话隐式创建的父类就调用有参数构建器。
是这个意思吧?
代码改成如下:
public Sub()
{
super(45);
this.Book = "无参初始化" ;
System.out.println("Sub里的无参构造函数") ;
}
之后运行结果如下:从运行结果看是证明了这个观点的。Base的有参构造器
23
Base类的Test方法
Base的有参构造器
Sub里的无参构造函数
无参初始化
Sub里的Test方法
Base的无参构造器
Sub里的有参构造函数
Sub里的Test方法
45