java类的继承问题
class AET{
void func1(){
System.out.println("AET class's function func1 is calling.");
}
void func2(){
func1();
}
private void func8(){
System.out.println("AET'S func8 is called.");
}
static void test(AET a){
a.func8();
}
public static void main(String[] args){
BET b=new BET();
<span style="color:red;"> <strong> test(b);</strong></span>
}
}
class BET extends AET{
void func1(){
System.out.println("BET class's function func1 is calling.");
}
void func3(){
System.out.println("BET class's function func3 is calling.");
}
}
加粗的test(b)为什么能执行,对象b中应该没有func8()这个方法。
补充:func8()是private的额。
父类的private不能被子类继承。
如果在子类BET中创建BET的对象b,用这个对象访问func8方法b.func8();编译会出错。这说明,BET不会继承AET的private方法,既不会在BET中声明个方法名为func8的private方法。
但这里怎么却能用BET的对象调用func8方法,难道是类型转换。但是类型转换不会改变对象在内存中的数据,只会增加说明。b类型转换后还是BET的对象啊
测试了一晚上,原因是:
在创建类的对象时,JVM在对类的成员变量和成员方法的内存分配上不一样。方法由类加载器加载,与堆中的对象内存无关,堆中会创建2份内存空间,先创建一块内存空间存放父类成员变量,再创建一块内存空间存放子类成员变量,在把父类的成员变量值赋值给子类对象成员变量,然后再执行子类成员变量的显示赋值,再调用子类的构造函数。在对对象的成员变量的访问时严格按照对象类型来访问的,即子类对象不能直接访问父类的堆内存空间。而成员方法的访问不是严格按对象类型来限定的。因为堆中没有存储方法的详细信息,存储的是对方法的引用(这点子类和父类都是一样的)。而方法对调用方法的环境进行权限检查(不管子类还是父类)。
答案:多态new的对象,调用的方法是父类中一定存在的,否则编译不通过.如果调用的方法不是私有的,则会先去到子类中,查找该方法有没有被子类覆盖,如有,执行子类方法;如无,执行父类方法
其他:因为他继承了AET类 那个类中有func8的方法 继承是继承父类的所有属性和方法,不需要在子类中声明,所以说b有func8()这个方法,是父类AET中声明的,可以拿来就用。
test方法接收的AET类型的,同样他可以接收AET的子类。 因为AET类中有func8(),BET继承了AET类,所以有含有此方法了。跟踪调试一下你就明白了。 送多点分给我吧,已很详细的了!
public class SchoolPeople {
protected int id;
protected String name;
protected byte age;
protected boolean 易做图;
protected String phone;
// id 编号
protected int getId() {
return id;
}
// name
protected String getName() {
return name;
}
// 年龄
protected int getAge() {
return age;
}
// 性别
protected boolean getSex() {
return 易做图;
}
// 电话
protected String getPhone() {
return phone;
}
// 总属性
void setProperties(int id, String name, byte age, boolean 易做图, String phone) {
this.id = id;
this.name = name;
this.age = age;
this.易做图 = 易做图;
this.phone = phone;
}
// 打印属性要用到的方法
void printProperties() {
System.out.println("ID号: " + id);
System.out.println("名字: " + name);
System.out.println("年龄: " + age);
if (易做图 == true)
System.out.println("姓别: " + "男");
else
System.out.println("姓别: " + "女");
}
// 主函数
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student = new Student();
Teacher teacher = new Teacher();
// 一个学生的信息输入
student.setProperties(10, "张三", (byte) 9, true, "12345678910",
"20080808");
// 一个老师的信息输入
teacher.setProperties(01, "李四", (byte) 39, false, "98765432109",
"19990909");
System.out.println();
student.printProperties();
System.out.println();
teacher.printProperties();
}
}
class Student extends SchoolPeople {
// 学号
String student_id;
// 返回学生信息
String getStudent_id() {
return student_id;
}
// 设置学生的属性
void setProperties(int id, String name, byte age, boolean 易做图,
String phone, String student_id) {
super.setProperties(id, name, age, 易做图, phone);
this.student_id = student_id;
}
// 打印学生属性
void printProperties() {
super.printProperties();
System.out.println("证号: " + student_id);
}
}
class Teacher extends SchoolPeople {
// 教师编号
String teacher_number;
String getStudent_id() {
return teacher_number;
}
// 设置教师属性
void setProperties(int id, String name, byte age, boolean 易做图,
String phone, String teacher_number) {
super.setProperties(id, name, age, 易做图, phone);
this.teacher_number = teacher_number;
}
// 打印教师属性
void printProperties() {
super.printProperties();
System.out.println("证号: " + teacher_number);
}
}
上一个:诚心招一名JAVA师傅。本人不笨,理解能力还好,有一定的编程基础。诚心找师傅帮助我。QQ252548305 可回信
下一个:Java面向对象的程序设计思想是什么?