java变量和方法的覆盖和隐藏(翻译自Java Tutorials)

隐藏变量

在一个类里,如果一个变量的名字和父类的变量的名字一样,即使他们的类型不一样,那么在子类中,父类的同名变量无法直接通过变量名访问。
但是,父类的同名变量可以通过super访问。一般来说,不推荐隐藏变量,这样会让代码难以阅读

覆盖和隐藏方法

对象实例方法

在一个对象实例方法中,如果子类有一个方法,它的签名(方法名字,方法的参数个数和类型)和返回值都和父类一样,那么就是覆盖父类的方法。
子类覆盖的能力,允许一个类,继承父类的行为,根据需要修改某些行为。覆盖的方法,和父类对应的方法有一样的名字,一样的参数类型和个数,一样的返回类型。另一种覆盖方法可以返回父类的方法的返回类型的子类。这个称之为covariant返回类型。
当覆盖一个方法,你要使用注解@Override,告诉编译器你要覆盖父类的方法。但是,如果该方法不存在父类中,那么编译器会报错。

类方法

如果子类声明了一个与父类相同签名的类方法,子类隐藏了父类的方法。
隐藏和覆盖的区别具有很大的意义。覆盖方法的调用版本就是子类的方法。隐藏方法的调用版本,依赖于它是被父类调用,还是被子类调用。

下面有个例子,演示对象实例方法和类方法的区别,第一个类是Animal

public class Animal {
    public static void testClassMethod() {
        System.out.println("The class" + " method in Animal.");
    }
    public void testInstanceMethod() {
        System.out.println("The instance " + " method in Animal.");
    }
}

第二个类是Cat,它是Animal的子类:

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The class method" + " in Cat.");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method" + " in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

Cat类覆盖了Animal的实例方法,并隐藏了它的类方法。结果输出如下:

The class method in Animal.
The instance method in Cat.

和之前所说的一样,由于是通过父类调用隐藏方法,所以隐藏方法的调用版本是父类。而覆盖方法的调用版本是子类的方法。

修饰符

覆盖的访问修饰符可以允许扩大,但不允许缩小。例如,一个protected对象方法,可以在子类中修改为public,但不能是private。否则代码会在编译时出错。

方法覆盖和隐藏小结

下面的表格总结了在子类声明了一个与父类签名一样的方法的各种情况

  Superclass Instance Method Superclass Static Method
Subclass Instance Method Overrides Generates a compile-time error
Subclass Static Method Generates a compile-time error Hides

时间: 2024-08-04 14:34:32

java变量和方法的覆盖和隐藏(翻译自Java Tutorials)的相关文章

Java类成员(成员变量和方法)的覆盖与隐藏归纳

以前就知道重写override和重载overload的区别,平时也是逮着用就是了,Eclipse报错再说. 最近看一本书里面出现了重写.替换.覆盖.置换.隐藏.重载,简直乱得不行,归纳整理一下. 从全局来看,java只有重写.隐藏.重载3种,具体归纳如下: 基本概念: 方法签名:方法名+参数列表(参数类型.个数.顺序).=================================[重写]================================= 某些书又叫覆盖.替换.置换.本文统一

5.Java继承中方法的覆盖和重载

在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public class D

jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?

在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况,在此将通用的处理方法小结如下: java变量传给js好办,var a=”<%=javaParam%>“;注意要将引号”"加上: js变量给java稍微复杂点,一般是在表单中用一个的隐藏表单元素,然后在脚本中将js变量值赋给它: var jsParamValue=’aaaa’;form1.jsParam.value=jsParamValue; 然后就可以request.getPrameter(“jsP

注入安卓进程,并hook java世界的方法及改进

注入安卓进程,并hook java世界的方法 说明: 安卓系统的可执行对象有两个世界,一个是Linux Native世界,一个是Java世界.两个世界能够通过jvm产生交互,具体来说就是通过jni技术进行互相干涉.但是在正常情况下,只能在Java世界通过jni调用native方法,二native不能在没有任何java上的支持下干涉java世界. 在一些应用中,我们需要对一个app的java世界进行干涉.再说到linux上的进程注入技术,已不用我多讲,但是传统的linux进程注入技术在安卓上只能进

JAVA中方法和变量在继承中的覆盖和隐藏

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题. 隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法 覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问par

方法和变量在继承时的覆盖和隐藏问题

作者:华清远见讲师 最近有个同学问了我一个小问题,觉得很有意思,之前一直没有想到过.他说"java中存在方法覆盖,是否存在变量的覆盖呢?".我们知道,在java中,子类可以继承父类,如果子类声明的方法与父类有重名,这时就发生了方法覆盖.其实,这实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试中还是比较常见的,所以这里来讨论下 首先我们来看几个概念 隐藏 :子类隐藏了父类的变量和方法,那么,子类不能访问父类被隐藏的变量或者方法,但是,将

JAVA中方法和变量在继承中的覆盖和隐藏(一)

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下 首先我们来看几个概念 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例,即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:通过类名访问. 实例方法:对象访问,

方法和变量在继承时的覆盖和隐藏

package com.jdk7.chapter2.converhide; public class Parent { public static String kind = "com.jdk7.chapter2.Parent"; //类变量 public static int age = 100; //类变量 public String name = "Parent"; //实例变量 public static String getKind() { //静态方法

[Java] 继承中,父类被覆盖的成员变量、方法的可访问性

在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. 例子: Super, 父类,拥有一个成员变量 x ,和成员方法 doSomething(). Point,继承 Super, 但覆盖了 Super 的 x 和 doSomething(),拥有自己的同名成员成员 x 和 doSomething(). StaticDemo1, 演示在继承中,在内部,可