解决java中的父类私有成员变量的继承问题

如果父类中属性为私有(private),那么能否被子类继承呢?

答案是不可以。

我们看如下简单代码

class Father {
  private String name;

  public void sayHi() {
    System.out.println("My name is " + this.name);
  }
}
class Son extends Father {}
public class PrivateFieldTest {
  public static void main(String[] args) {
    Father f1 = new Father();
    Son s1 = new Son();
 f1.sayHi();
 s1.sayHi();
  }
}

得到的结果是:

My name is null
My name is null

这里我们使用的都是默认构造函数,子类自动引用父类的默认构造函数。直接构造为null。

这样,Son类继承了Father类的sayHi方法,那么自然,Son的sayHi方法中使用的“name”变量,自然就是Son内部继承自Father的私有变量name了,也就是说私有变量可以被继承?

不是的。

我们再看下一段代码,我们在Son的类中重写一下sayHi方法。

class Father {
  private String name;

  public void sayHi() {
    System.out.println("My name is " + this.name);
  }
}
class Son extends Father {
  public void sayHi() {
    System.out.println("My name is " + this.name);
  }
}
public class PrivateFieldTest {
  public static void main(String[] args) {
    Father f1 = new Father();
    Son s1 = new Son();
    f1.sayHi();
    s1.sayHi();
  }
}

这里,出现了编译错误,即Son类里面并没有继承name.

我们看看错误的原因。

The field Father.name is not visible

可以看见,编译器自动认为,name是属于Father的,Son内并没有继承。

那为什么第一段代码中,可以使用sayHi方法得到数据呢?

实际上,这样解释比较好:

“子类不能继承父类的私有属性,但如果子类中公有的方法影响到了父类的私有属性,那么私有属性是能够被子类使用的。”

这句话听起来很拗口,但是实际情况确实也很拗口。

看如下代码

class Father {
  private String name;

  public void setName(String name) {
    this.name = name;
  }
  public void sayHi() {
    System.out.println("My name is " + name);
  }
}
class Son extends Father {}
public class PrivateFieldTest {
  public static void main(String[] args) {
    Father f1 = new Father();
    Son s1 = new Son();
    f1.sayHi();
    s1.sayHi();
    System.out.println();
    f1.setName("Sam");
    f1.sayHi();
    s1.sayHi();
    System.out.println();
    s1.setName("Tom");
    f1.sayHi();
    s1.sayHi();
  }
}

运行结果是

My name is null
My name is null
My name is Sam
My name is null
My name is Sam
My name is Tom

第一段结果,没有变化。

第二段结果,对应的是我们使用setName方法改变了f1的name,所以f1对应的sayHi结果变成了Sam。

第三段结果,对应的是我们使用setName方法改变了s1的name,所以s1对应的sayHi结果变成了Tom。

由此我们可以看到,虽然子类不能继承父类私有变量,但是还是可以通过公有方法使用私有变量。只是重写函数的时候可能比较麻烦,所以要活用super。

补充:Java子类访问父类的私有成员变量

子类会继承父类所有的属性和方法。

但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量

所以对于重名变量,子类和父类都各有一份。

对于子类和父类中重名的方法,则为重写。即子类重写了父类的方法,用于多态。

同一个类中函数的签名不同,则为方法的重载。函数的签名为函数名+参数列表,与返回值无关。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

时间: 2021-01-12

Java如何给变量取合适的命名

一.变量命名风格 变量命名风格通常会根据不同的变量类型来区分,以Java语言为例,根据变量类型不同有两种命名风格: 1)类成员变量.局部变量 类成员变量.局部变量通常采用驼峰命名风格,如下: String userName; 2)静态成员变量.枚举值.常量 静态成员变量.枚举值.常量通常采用所有字母大写.多个单词以英文下划线连接,如: public static final int MAX_YEARS = 25; ​ // 建议枚举类都以Enum结尾 enum ColorEnum { RED(0

Win10系统下配置java环境变量的全过程

一,配置环境变量步骤 1.右击桌面上的"此电脑"图标,选择属性. 2.选择高级系统设置 3.单击环境变量 4.单击系统变量中的新建 5.在变量名中输入JAVA_HOME 变量值中输入jdk安装路径,系统默认路径为 C:\Program Files\Java\jdk1.8.0_221 6.继续单击系统变量中的新建 7.在变量名中输入CLASSPATH 变量值为 .;%JAVA_HOME%lib;%JAVA_HOME%\lib\tools.jar 注意最前面的"."不能

java创建子类对象设置并调用父类的变量操作

通过子类调用父类的变量,有两种方法: 1.把父类的变量设置成public: package triangle.opengl.wlz.stu.childusefathervariable; import android.util.Log; public class BasePublicVariable { private String TAG = getClass().getName(); public int data; public void ptData(){ Log.d(TAG, "ptD

java 利用反射获取内部类静态成员变量的值操作

昨晚,一同事问到我,怎么利用java反射解析内部类静态成员变量的值,于是顺手写下了. 废话不多说,直接上代码! 待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class apple{ public static String version = "iphone6s[是手机不是吃的苹果]"; public static String date =

Java tomcat环境变量及idea配置解析

一.下载Tomcat 1.进入官网http://tomcat.apache.org/,选择download,下载所需Tomcat版本. 二,我们解压后到指定目录,然后配置环境变量 1>CATALINA_BASE和CATALINA_HOME,值都是tomact地址目录 2>CLASSPATH,在值后面添加;%CATALINA_HOME%\lib\servlet-api.jar;(PS::这个符号是有的) 3>添加Path值,%CATALINA_HOME%\bin和%CATALINA_HOM

Tomcat环境变量如何配置

本文以文字的形式为大家叙述Tomcat环境变量的配置过程,以及验证配置是否成功的方法,具体内容如下 JDK环境变量配置:  如果你的JDK安装在C盘里,如:C:\Program Files\Java\jdk1.6.0_05,那么就在系统变量里(当然也可以在用户变量里)点新建:       变量名:JAVA_HOME       变量值:C:\Program Files\Java\jdk1.6.0_05;       再次点新建:       变量名:classpath       变量值:.;%

tomcat环境变量详细配置步骤

本文实例为大家分享了tomcat环境变量的配置教程,供大家参考,具体内容如下 1.===> 进入bin目录下,双击startup.bat看是否报错.一般肯定会报. 2.===> 右键我的电脑===>高级===>环境变量   新建一个 变量名为 JAVA_HOME 然后变量值是 你的JDK的bin目录的上一层. 再新建一个 变量名为CATALINA_HOME 变量值是你的Tomcat的bin的目录的上一层. 3.===> 进入Tomcat bin目录下  双击shutdown.

tomcat以及tomcat环境变量安装配置方法教程

我们下载安装了tomcat,那么tomcat环境变量配置怎么配置?下面小编就和大家分享下tomcat环境变量的配置. tomcat安装版本 1.JDK:版本为jdk-7-windows-i586.exe    下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.tomcat:版本为apache-tomcat-7.0.33-windows-x86.zip    下载地址http://tomcat.apac

centos7下安装java及环境变量配置技巧

现在我们常见的一些关于Linux的系统很多,但是使用的更多的一般都是CentOS和Ubuntu,今天我就来记录一下关于centos下java的安装和环境变量的配置. 首先使用xshell连接到centos7,我使用的是centos7 *64位,所以一切的配置安装都按照的是centos7来进行的,当然其他版本的centos的操作也类似,如果有需要的,请自行百度哈. 本次安装环境: centos7 64位 jdk1.8 64位 xshell免费版 win10*64位 一.首先进来,需要检查自带的op

Java +Tomcat + SpringMVC实现页面访问示例解析

window7下Java环境安装记录:  一.安装Tomcat 1.下载tomcat 7.0,解压,无需安装,放置到目录:D:\apache-tomcat-7.0.90. 2.配置系统环境变量,CATALINA_BASE=D:\apache-tomcat-7.0.90,CATALINA_HOME=D:\apache-tomcat-7.0.90,在Path中新增"%CATALINA_HOME%\lib;%CATALINA_HOME%\bin"的环境变量. 3.进入D:\apache-to

Java+Tomcat 环境部署及安装过程图解

下面在Centos7进行安装Java+Tomcat,网上的很多文章,我在部署中都有些问题,下面是我自己总结的一个安装过程! 安装Java环境 首先,我们先到Java官网下载JDK 这里我下载jdk1.8版本的 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 点击 Accept License Agreement 选择好版本进行下载,需要注册Oracle账户登陆下载! 将下载的

详解Java获取环境变量及系统属性的方法

环境变量这个概念不陌生, 就是操作系统的环境变量. 系统变量就是java本身维护的变量. 通过 System.getProperty 的方式获取. 对于不同的操作系统来说, 环境变量的处理可能会有一些不统一的地方, 比如说: 不区分大小写 等等. Java 获取环境变量 Java 获取环境变量的方式很简单: System.getEnv()  得到所有的环境变量 System.getEnv(key) 得到某个环境变量的值 Map map = System.getenv(); Iterator it

vue-cli3.0 环境变量与模式配置方法

vue-cli3.0移除了配置文件目录: config和build文件夹.可以说是非常的精简了,那移除了配置文件目录后如何自定义配置环境变量和模式呢? 为什么需要配置环境变量和模式呢? 所有方法肯定是来源于现实的需求.在一个产品的前端开发过程中,一般来说会经历本地开发.测试脚本.开发自测.测试环境.预上线环境,然后才能正式的发布.对应每一个环境可能都会有所差异,比如说服务器地址.接口地址.websorket地址-- 等等.在各个环境切换的时候,就需要不同的配置参数,所以就可以用环境变量和模式,来

MAC配置java+jmeter环境变量过程解析

打开ITerm终端 进入命令输入,sudo su,输入密码 创建.bash_profile文件touch .bash_profile 打开.bash_profile文件open .bash_profile 弹出文本编辑 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HO

详解Java的环境变量和Tomcat服务器配置

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求.实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的. 目前Tomcat最新版本为