Java成员变量的隐藏(实例讲解)

一、如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子:

public class A {
  public int x=10;
}

public class B extends A {
  public int x=20;
}

public class C {
  public static void main(String[] args) {
    A a=new B();
    System.out.println(a.x);  //1
    B b=new B();
    System.out.println(b.x);  //2

    System.out.println(((A)b).x);  //3
  }
}

运行C类的main方法的结果为:

10
20
10

通过结果我们可以看出子类是不会覆盖父类的成员变量,我们eclipse的调试工具也能很清晰的看出在对像a中同时存在两个x的成员变量(其中一个是父类的),如下图示:

通过第1个和第3个的结果,可以得出对像对于成员的直接访问是静态邦定的 ,官方解释如下:

在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。

在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,

因为这样会使代码变得难以阅读。

对于静态方法与成员变量类似,如下:

public class A {
  public static void print() {
    System.out.println("A Static ");
  }
}

public class B extends A {
  public static void print() {
    System.out.println("B Static ");
  }

}

public class C {
  public static void main(String[] args) {
    A a=new B();
    a.print();

    B b=new B();
    b.print();
    ((A)b).print();

  }
}

结果如下:

A Static
B Static
A Static

以上这篇Java成员变量的隐藏(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于Java反射机制 你需要知道的事情

    大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载.Java类如果不被Java虚拟机加载,是不能正常运行的.现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了. Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载.探知.自审.使用在编译期并不知道的类.这样的特点就是反射. 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态

  • java 中设计模式(值对象)的实例详解

    java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设计模式 值对象的本质是"封装数据 具体步骤:  1. 所写的类必须实现序列化Serializable(序列化是为了防止数据读取的时候数据丢失). 同时主要这个类的命名规范.值对象的命名规范: XxxValueObject, XxxVO, XxxModel. 2. 必须要写一个成员变量Id作为主键.(

  • Node调用Java的示例代码

    Java 端作为服务提供者,基于Dubbo实现服务并通过 Dubbo Hessian 扩展暴露服务:Node 端作为服务消费者,通过node-hessian 调用 Java 端的服务. Java 端 服务接口 package com.yuanxin.paas.ssb; public interface TestService { /** * 测试:无参,无返回值. */ void test(); /** * 测试:原生类型参数与返回值. * * @param i * @return */ Str

  • 详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象

  • Java开发者推荐的10种常用工具

    以下是Java程序员在日常生活中最常用的10种工具.如果你正在使用Java,本文介绍将会对你有所帮助,如果你还不熟悉这些工具,在这里你可以对它们进行更加系统的了解. 1) IDE:Eclipse和NetBeans IDE是Java开发人员最为重要的工具.IDE不仅提供了集成的开发环境,还能够帮助导航.调试和记录代码.Eclipse作为行业领导者,有一半的Java开发人员都在使用它.而在编写测试程序.测试和调试Java web开发的新事物方面,我更推崇Netbeans,这是因为在web开发方面Ne

  • java中设计模式(多例)的实例详解

    java中设计模式(多例)的实例详解 多例:单例设计模式的变形,可以看成是一个缓存池的单例,而缓存池里面可以存多个数据 实例代码: //单例+缓存---没有控制池大小 public class A { //1创建一个单例的池 (private即把池封装成单例了) private static Map<String, A> pool = new HashMap<String, A>(); //池--集合: Map:key-value public synchronized stati

  • Java中如何动态创建接口的实现方法

    有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务框架,消费者只需要引入接口就可以调用远程的实现,分析源代码,其实在消费端产生了接口的代理实现,再由代理调用远程接口. 3.spring aop 这是最典型的动态代理了. 创建接口的动态实现,有二种最常用的方式:JDK动态代理和CGLIB动态代理. 代理模式是一种常用的设计模式,其目的就是为其他对象提

  • Java成员变量的隐藏(实例讲解)

    一.如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子: public class A { public int x=10; } public class B extends A { public int x=20; } public class C { public static void main(String[] args) { A a=new B(); System.out.println(a.x); //1 B b=new B();

  • Java中方法的重写与成员变量的隐藏

    这篇文章讨论了Java面向对象概念中一个基本的概念–Field Hiding(隐藏成员变量) 在讨论这个问题之前,我们看一段特别特别简单的代码,请问一下方法的数据结果是什么? /** * @author Hollis 17/9/27. */ public class FieldOverriding { public static void main(String[] args) { Sub c1 = new Sub(); System.out.println(" c1.s : " +

  • java中调用super的实例讲解

    在java中类之间也是有着继承关系的,就我们之前有提到不少父类与子类的一些问题. 讲的以子类的调用为主,那么有小伙伴知道父类的调用方法吗?这里我们需要借助关键字super来实现.下面我们就来讲讲super的概念.调用方法.应用范围,帮助大家找到使用supei调用父类的方法. 1.概念 super关键字用于引用使用该关键字的类的超类. 作为独立语句出现的 super 表示调用超类的构造方法. 2.调用超类方法 super.<methodName>() 只有在如下情况中才需要采用这种用法:要调用在

  • java对象类型转换和多态性(实例讲解)

    对象类型转换 分为向上转型和向下转型(强制对象转型). 向上转型是子对象向父对象转型的过程,例如猫类转换为动物类:向下转型是强制转型实现的,是父对象强制转换为子对象. 这和基础数据类型的转换是类似的,byte在需要时会自动转换为int(向上转型),int可以强制转型为byte(向下转型). 对于对象转型来说, 向上转型后子对象独有的成员将不可访问 . 意思是,在需要一只动物时,可以把猫当作一只动物传递,因为猫继承自动物,猫具有动物的所有属性.但向上转型后,猫不再是猫,而是被当作动物看待,它自己独

  • Java成员变量与局部变量(动力节点Java学院整理)

    成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中,最基本的单位是类,类就是用来体现事物的. 用类class来描述事物也是如此: 属性:对应类中的成员变量    行为:对应类中的成员函数 定义类其实就是在定义类中的成员(成员变量和成员函数) 拓展:类是一个抽象的概念,而对象就是类的具体的存在,体现.例如:生活中的汽车,可以看做一个类,我们称之为汽车类,每一台车都有颜色和轮胎数(可以定义为属性,即成员变量),每一台车

  • js中变量的连续赋值(实例讲解)

    今天遇到了一个连续赋值的经典案例,网友们给出的答案也是五花八门,看起来有些繁琐,我也来说说自己的看法. 下面就是这个经典案例: var a = {n: 1}: var b = a; a.x = a = {n: 2}: console.log(a); console.log(b); console.log(a.x); console.log(b.x): 我们先来看一下普通连续赋值,即:变量赋值的类型是数据类型值 var a=3; var b=a=5; console.log(a); console

  • angular $watch 一个变量的变化(实例讲解)

    废话不多说,直接上代码 $scope.$watch('custArea', function(newValue, oldValue) { angular.forEach(newValue, function(item, key) { if($scope.custArea.indexOf("000000") > -1){ // $scope.toastWarn("已选择中国大陆所有省市,其他值不可选"); $scope.custArea =["0000

  • java发送email一般步骤(实例讲解)

    java发送email一般步骤 一.引入javamail的jar包: 二.创建一个测试类,实现将要发送的邮件内容写入到计算机本地,查看是否能够将内容写入: public static void main(String[] args) throws Exception { // 1. 创建一封邮件 Properties props = new Properties(); // 用于连接邮件服务器的参数配置(发送邮件时才需要用到) Session session= Session.getDefaul

  • java 动态生成SQL的实例讲解

    代码如下: /** * 动态生成SQ及SQL参数L * @param ve 接收到的消息的CHGLIST * @param paramList MQ消息中的SQL参数 * @param t 泛型对象 * @param table 数据表 * @param list 可执行SQL语句集合 * @return */ public <T> String updateSqlAndParamList(Vector<String> ve,List<String> paramList

  • JAVA超级简单的爬虫实例讲解

    爬取整个页面的数据,并进行有效的提取信息,注释都有就不废话了: public class Reptile { public static void main(String[] args) { String url1=""; //传入你所要爬取的页面地址 InputStream is=null; //创建输入流用于读取流 BufferedReader br=null; //包装流,加快读取速度 StringBuffer html=new StringBuffer(); //用来保存读取页

随机推荐