尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Java中父类与子类的成员变量、方法重写与重载

Java中父类与子类的成员变量、方法重写与重载 在Java面向对象编程中继承是实现代码复用的重要机制而父类与子类之间的成员变量、方法关系往往是初学者的难点。本文将介绍父类与子类中成员变量的隐藏特性、成员方法的重写Override与重载Overload规则通过实例帮助理解两者的核心区别。父类与子类Java通过 extends 关键字实现类的继承由此产生父类基类 和子类派生类。父类是被继承的类封装了多个子类的共性属性和方法。子类继承父类的非私有成员属性和方法同时可添加独有的成员。成员变量同名即隐藏与类型无关当子类中定义了与父类同名的成员变量时无论数据类型是否相同子类变量都会隐藏父类变量注意不是覆盖这是与方法的本质区别。隐藏规则只看变量名是否相同与数据类型、访问修饰符无关。访问优先级子类内部直接访问同名变量时默认使用子类自己的变量若需访问父类被隐藏的变量需通过 super.变量名 调用。class Parent { int a 65; // 父类int型变量a } class Child extends Parent { char a A; // 子类char型变量a隐藏父类的int a public void printSelfA() { System.out.println(子类中的a a); // 直接访问子类自己的a } public void printParentA() { System.out.println(父类被隐藏的a super.a); // 通过super访问父类a } }当在main方法中创建对象的时候public class Test { public static void main(String[] args) { Child child new Child(); child.printSelfA(); // 输出子类中的aA child.printParentA(); // 输出父类被隐藏的a65 } }写下 Child child new Child();后在堆区中有简化int a 65;这是父类继承来的char a A;这是子类本身有的在类中直接使用a或者this.a都只能指向子类本身的a。而要访问被隐藏的父类的a则需要用super.a。子类对象的所有成员变量父类继承的 子类新增的都属于 this 指向的对象。但由于隐藏a或者this.a才都只能指向子类本身的a。但通过引用访问变量时编译期根据引用类型决定访问哪个变量而非运行时的实际对象类型。例如javaParent p new Child(); System.out.println(p.a); // 输出10编译期绑定根据引用类型Parent子类父类的无论是否被隐藏都在堆区储存故没有被覆盖。成员方法重写与重载的本质区别方法的行为由方法签名方法名 参数列表决定子类与父类的方法关系分为重写Override 和重载Overload 两种规则截然不同。方法重写Override子类覆盖父类方法重写需满足方法名和参数列表必须完全一致参数个数、类型、顺序均相同。子类方法返回值需与父类相同或为父类返回值的子类。子类方法的访问权限不能比父类更严格。class Animal { String name; public void makeSound() { // 父类方法 System.out.println(name 发出声音); } } class Dog extends Animal { // 重写父类的makeSound方法 public void makeSound() { System.out.println(name 汪汪叫); } } public class Test { public static void main(String[] args) { Animal animal new Dog(); // 父类引用指向子类对象 animal.name 旺财; animal.makeSound(); // 输出旺财汪汪叫执行子类重写的方法 } }方法重载Overload同名不同参的新方法当同一类中或父子类中出现方法名相同、参数列表不同的方法时构成方法重载。需满足方法名必须相同参数列表必须不同参数个数、类型、顺序任一不同。与返回值类型、访问修饰符无关。重载方法是独立的不同方法不涉及覆盖关系。class Parent { public void show(int num) { // 父类方法参数为int System.out.println(整数 num); } } class Child extends Parent { // 重载参数类型不同String public void show(String str) { System.out.println(字符串 str); } // 重载参数个数不同无参 public void show() { System.out.println(无参方法); } } public class Test { public static void main(String[] args) { Child child new Child(); child.show(100); // 调用父类的show(int) child.show(hello); // 调用子类的show(String) child.show(); // 调用子类的show() } }静态方法的继承与隐藏规则静态方法可以被继承子类会继承父类的静态方法。静态方法不能被重写Override即使子类定义了与父类签名相同的静态方法也不会发生动态绑定运行时根据对象类型决定调用哪个方法。静态方法的隐藏Hiding若子类定义了与父类同名且参数列表相同的静态方法子类的方法会隐藏父类的方法而非重写。
返回列表