课时64:属性覆盖

简介: 今天我分享的是Java中属性覆盖及super与this的区别。主要分为以三下部分。1. 属性覆盖示例2. 封装对属性覆盖的影响3. super与this的区别

课时64:属性覆盖

摘要:今天我分享的是Java中属性覆盖及super与this的区别。主要分为以下部分。

1. 属性覆盖示例

2. 封装对属性覆盖的影响

3. super与this的区别

   

01. 属性覆盖示例

 

我们来聊聊属性覆盖,打个比方,现在有这样一个程序。先不考虑封装的事儿,我们定义一个变量  info  ,比如写成  m23  这样,接着定义一个  String  类型Info  ,赋值为 Hello world 。到这儿能明白吧?此时我们定义了两个同名的  Info  。然后如果我们用 System.out.print 输出  this.info  ,访问的应该就是Hello world 我们把代码编译一下,再执行看看, m23 的结果出来了,这就算是属性覆盖了。

class Channel {
string info= "www.mldn.cn" ;
}
class DatabaseChannel extends Channel { //要进行数据库连接
string info= "HelloMLDN"; // 名称相同
public void fun() {
System.out.println(this.infol);
}
}
public class JavaDemo {
public static void main(String args[]){
DatabaseChannel channel = new DatabaseChannel();
channel.fun() ;
}
}

image.png

image.png

 

02. 封装对属性覆盖的影响

 

那要是我想访问父类的那个 info  呢?很简单,加个  super  就行。编译运行一下,这个过程不难理解吧。不过我想问大家一个很直接的问题,在做属性覆盖的时候,有个前提是没有封装。那要是属性封装了会怎么样呢?一旦属性被封装,  super  就不能用了这时候我们再编译、执行代码,得到的就只能是子类的  hello world  。


再深入分析一下,假如我们在这儿写一个  GetInfo  方法,直接返回  This.info  。这个时候,如果通过  Super.getInfo  来获取,那得到的是父类的 Info 还是子类的 Info 呢?我们编译执行看看,结果得到的是父类的 Info 。

Class Channel {
private string info = "www.mldn.cn" ;
public string getInfo() {
return this.info ;
}
}
class DatabaseChannel extends Channel { //要进行数据库连接
String info="HelloMLDN" ; // 名称相同
public void fun() {
System.out.println(this.info);
System.out.println(super.getInfo()) ;
}
public class JavaDemo {
public static void main(String args[]) {
DatabaseChannel channel = new DatabaseChannel();
channel.fun () ;
}

image.png

image.png

为什么呢?这是个就近取用的过程。大家回想一下之前的程序,当属性被  Private  封装时,是不能被复写的。实际上,子类和父类的私有属性没什么关系,就算名称一样,也相当于子类定义了一个新属性。所以从本质上讲,属性覆盖没太大实际意义,因为属性一旦封装,覆盖就没意义了。

 

03. super与this的区别


不过,这里引出了一道面试题:请解释 Super  和  This  的区别。解释的时候要清楚这几点:

在程序里,使用 This  时,会先在本类查找需要的属性或方法。要是本类没有,就查找父类定义。而使用  Super  ,则是不查找本类,直接查找父类。


 This  和  Super  都能调用属性,也都能调用构造方法。但 this 调用的是本类构造, Super  是由子类调用父类构造。并且这两个语句都必须放在构造方法的第一行,所以不能同时出现。


 this 可以表示当前对象,而  Super  没有这种概念,从来没有父类当前对象的说法,只有本类当前对象。

相关文章
|
SQL 缓存 AliSQL
AliSQL
阿里云在MySQL和PostgreSQL社区版的基础上,对内核进行了深度定制
1113 0
|
Web App开发 Ubuntu
解决Ubuntu14.04安装Chrome浏览器打不开的问题
解决Ubuntu14.04安装Chrome浏览器打不开的问题
976 0
|
机器学习/深度学习 人工智能 网络架构
Transformer原理解析——一种Open AI和DeepMind都在用的神经网络架构
Transformer模型是一种日益流行的神经网络结构。它最近被OpenAI用于他们的语言模型中。与此同时,近期也被DeepMind用于它们的程序“星际争霸”中击败了一名顶级职业星际玩家。 Transformer模型的开发是为了解决序列转换及神经机器翻译问题。
9302 0
|
9月前
|
Java
课时18:Java运算符(逻辑运算符)
课时18介绍了Java中的逻辑运算符(与、或、非)。通过范例详细讲解了非操作的使用,展示了如何正确应用逻辑非(!)。接着分别探讨了与操作(& 和 &&)及或操作(| 和 ||),强调了短路运算符(&& 和 ||)在性能和安全性上的优势。课程通过具体代码示例演示了不同逻辑运算符的效果及其应用场景。
244 5
|
9月前
|
Java 测试技术 Android开发
课时148:junit测试工具
课时148介绍了JUnit测试工具的使用,包括定义、配置和编写测试程序。JUnit是流行的用例测试工具,用于确保代码稳定性。
193 0
|
算法 Serverless 计算机视觉
YoloX | SimOTA标签匹配策略
YoloX | SimOTA标签匹配策略
1198 0
YoloX | SimOTA标签匹配策略
|
存储 缓存 监控
一文看懂分布式链路监控系统
本文通过阿里的Eagleeye(鹰眼)和开源的Skywalking,从数据模型、数据埋点以及数据存储三个方面介绍分布式链路监控系统的实现细节,其中将重点介绍Skywalking字节码增强的实现方案。
929 1
|
弹性计算 虚拟化 异构计算
阿里云服务器GPU租用费用多少钱一月?显卡服务器贵吗?
阿里云服务器GPU租用费用多少钱一月?显卡服务器贵吗?阿里云GPU服务器租用价格表包括包年包月价格、一个小时收费以及学生GPU服务器租用费用,阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器租用价格表、GPU一个小时多少钱以及学生GPU服务器收费价格表
1028 0
|
Prometheus Kubernetes 监控
(三)Prometheus获取指标的tls认证机制
阿里云ACK专有集群的master组件基本都是https监听,那么prometheus server是如何鉴权获取到htts监听的metrics指标呢?Tls认证环节无关operator, 主要是prometheus server的认证处理 ,属于prometheus 监控体系通用的理论。先从prometheus最常见场景- pod (apiserver/scheduler/kcm)的tls认证场景开始介绍,然后单独介绍etcd和kubelet的tls认证 。本文通过curl模拟prometheus server获取https metrics 指标,便于对认证机制的理解。
2139 0
(三)Prometheus获取指标的tls认证机制
|
Web App开发 分布式计算 数据可视化
【实验】阿里云大数据助理工程师认证(ACA)- QuickBI数据分析(上)
【实验】阿里云大数据助理工程师认证(ACA)- QuickBI数据分析
794 0
【实验】阿里云大数据助理工程师认证(ACA)- QuickBI数据分析(上)

热门文章

最新文章