class fu
{
String name = "李四";
int age = 45;
fu()
{ int a=4;
// System.out.println(a);
}
}
class zi extends fu
{
String name = "李五";
int age = 20;
zi()
{
//在建立对象的时候,子类会调用父类的构造方法来帮助其初始化,
//调用了fu类的构造方法,所以先打印了4,然后有自己打印了自己的a=5,
int a=5;
// System.out.println(a);
}
}
class name
{
public static void main(String[] args)
{
zi x=new zi();
fu f = new fu();
System.out.println(x.name+"***"+x.age);
System.out.println(f.name+"***"+f.age);
/*运行结果,
李五***20
李四***45
请按任意键继续. .
必须没有被改变啊*/
}
}
}
//问题一、子类覆盖父类的对象值之后,父类的值会改变吗??
// 能不能用一个小代码说明一下。
//首先说一下,构造方法的中的变量是不会被改变的,而且也不可能被复写,
//它是用来初始化对象的,怎么可能被子类改变父类的
//构造方法呢?
问题一:
我拿一个具体的例子来给你说明
class fu
{
int a=1;
int b=5;
public void method()
{
System.out.println(a); //在父类中查看a的值
}
}
class zi extends fu
{
int a=2;
public void method()
{
System.out.println(a); //在子类中查看a的值
}
public void supermethod()
{
System.out.println(super.a); //在子类中查看父类的a的值。
}
public void bmethod()
{
System.out.println(b); //在子类中访问在父类中定义,但在子类中没有定义的变量b
}
}
class DemoTest
{
public static void main(String[] args)
{
fu f = new fu();
zi z = new zi();
问题二:
在创建子类的对象时,子类的构造函数会默认调用父类的无参数的构造函数。即代码实际上为以下形式:
class fu
{
fu()
{ int a=4;
System.out.println(a);
}
}
class zi extends fu
{
zi()
{
super(); //此处是系统隐式添加的,调用父类的无参数的构造函数。此处打印4
int a=5;
System.out.println(a); //此处打印5
}
}
class name
{
public static void main(String[] args)
{
对于问题一:你说的对象值应该是指成员变量,子类的成员变量可以覆盖父类的成员变量,但是不能改变父类的成员变量,实质是Java继承中,成员变量(包括静态变量,实例变量,常量)没有覆盖(override)一说,应该叫隐藏(hidden),子类的同名变量只是隐藏(hidden)了父类的同名变量。子类可以通过super来实现对父类成员变量的访问。这里我也说一下继承的机制,帮助你理解:JVM把父类源代码编译成字节代码时,对直接继承和覆盖重写的成员,操作是不同的!对于直接继承的成员,并不把其代码加到子类的代码中,但会保留一个类似引用的对象(我不知道,我自己的理解和设想),起到了隐藏的作用,用来指向父类中相应的成员;而对于被覆盖重写过的成员方法和同名成员变量来说,则像对待子类中的其他自有成员一样,在分配空间是给他们分配自己的空间,也就是说,在编译后的子类字节代码中会有这些成员的代码。这里覆盖后的成员变量有不同于父类成员变量的空间,所以不会修改父类的成员变量。同时也举个简单的例子:
class fu
{
int a=4;
fu()
{
System.out.println(a);
}
}
class zi extends fu
{
int a=5;
zi()
{
System.out.println(a);
}
}
class name
{
public static void main(String[] args)
{