---恢复内容开始---
为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!
public class ExplorationJDKSource
{
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(new A());
}
}
class A{};
运行结果:
[email protected]
为啥会产生这样的结果??!!
原因分析:
main方法实际上调用的是: public void println(Object x),这一方法内部调用了String类的valueOf方法。
valueOf方法内部又调用Object.toString方法:
现在有三个类: class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{} 针对每个类定义三个变量并进行初始化 Mammal m=null ; Dog d=new Dog(); Cat c=new Cat();
下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;
我认为第一句不出错,可以用子类给父类赋值,因为子类里有父类里所有的变量;第二句会出错,不能用父类变量来给子类赋值,父类里面不一定包含不全子类里所有的变量;第三句不会出错若要用子类给父类赋值必须强转;第四句出错,这两个变量间没有直接关系;第五句对同第三句。
public class ParentChildTest {
public static void main(String[] args) {
Parent parent=new Parent();
parent.printValue();
Child child=new Child();
child.printValue();
parent=child;
parent.printValue();
parent.myValue++;
parent.printValue();
((Child)parent).myValue++;
parent.printValue();
}
}
class Parent{
public int myValue=100;
public void printValue() {
System.out.println("Parent.printValue(),myValue="+myValue);
}
}
class Child extends Parent{
public int myValue=200;
public void printValue() {
System.out.println("Child.printValue(),myValue="+myValue);
}
}
第二句错误显示为:类型不匹配:不能从 Mammal 转换为 Dog
第三句错误显示为:类型不匹配:不能从 Cat 转换为 Dog
public class ParentChildTest {
public static void main(String[] args) {
Parent parent=new Parent();
parent.printValue();
Child child=new Child();
child.printValue();
parent=child;
parent.printValue();
parent.myValue++;
parent.printValue();
((Child)parent).myValue++;
parent.printValue();
}
}
class Parent{
public int myValue=100;
public void printValue() {
System.out.println("Parent.printValue(),myValue="+myValue);
}
}
class Child extends Parent{
public int myValue=200;
public void printValue() {
System.out.println("Child.printValue(),myValue="+myValue);
}
}
先定义了一个父类对象以及子类变量,输出就显示出来第一二句,然后用children对象给parent对象赋值,parent对象的myValue变为200;parent函数printvalue也被覆盖,于是就有了第三句,value++是先输出再加一,于是输出第四句,然后强转输出,这是value已经是201,先输出在加一有了第五句
---恢复内容结束---