当前位置:编程学习 > JAVA >>

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面向对象的程序设计思想是什么?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,