java-关于JAVA的this关键字

问题描述

关于JAVA的this关键字

网上对this的描述很朦胧,有的说this表示的是当前对象自己,有的说this是当前对象的引用。
可是自己写了如下的测试代码,产生了几个问题:

 1 public class T3AboutThis {
 2
 3     public static void main(String[] args) {
 4         new SubT3().func();
 5         SuperT3 s = new SuperT3();
 6         System.out.println(s instanceof SubT3);//false
 7     }
 8 }
 9
10 class SuperT3 {
11     protected String name = "Jack";
12
13     protected void func() {
14         System.out.println(this.name);//Jack
15         System.out.println(this instanceof SuperT3);//true
16         System.out.println(this instanceof SubT3);//true
17     }
18 }
19 class SubT3 extends SuperT3 {
20     protected String name = "Peter";
21 }

1.this表示的是指向一个实例吗。如果不是指向一个实例,那么为什么this可以参与instanceof运算或当作引用参数传进方法里,super为什么不能?
2.如果this表示当前对象,那么我在第4行new的SubT3的实例,在第14行为什么没有打印出peter呢。
3.如果在第14行时,this只表示SuperT3的引用(我也不知道到底引用什么),那为什么第16行没有打印出与第6行相同的结果呢?
我真的是有点绕晕了。

解决方案

1.this表示的是指向一个实例吗。如果不是指向一个实例,那么为什么this可以参与instanceof运算或当作引用参数传进方法里,super为什么不能?
-- this表示的是指向一个实例。 System.out.println(s instanceof SubT3);//false 这个地方之所以返回false 是因为 s的类型是 SuperT3 所以 “s instanceof SubT3” 是返回false

2.如果this表示当前对象,那么我在第4行new的SubT3的实例,在第14行为什么没有打印出peter呢。
--首先说this的类型是SubT3 这是确定的,所以this instanceof SuperT3 和 this instanceof SubT3都是true. 第14行打印出Jack是正确的。要从内存结构看,子类是无法覆盖父类的成员变量的,所以对于SubT3 来说里面有两个 name, 一个是Jack 一个是peter。那么究竟是调用哪个name呢?是调用基类的name,因为成员变量是不能重载的,也就是说 调用成员变量的函数在基类中 则使用基类的成员变量 调用成员变量的函数在子类中则使用子类中的成员变量。 如果想要 输出peter,只需要在SubT3 重载func 也就是将func的代码复制在SubT3中 就会输出peter. 记住:成员变量是不会被重载的 只有 函数会被重载。

3.如果在第14行时,this只表示SuperT3的引用(我也不知道到底引用什么),那为什么第16行没有打印出与第6行相同的结果呢?
--看第2条的回答 this不是superT3 是 subT3 只是因为成员变量是无法重载的 依赖于调用它的函数所在类。

另外说明一下,如果基类的成员变量可以被同名的子类中成员变量替换,那会产生灾难的后果。比如基类中有个数组 里面存储了一些 标识 比如 0 1 2 而在子类中 声明了同样一个名字的数组 里面是 3 4 5 那么基类运行到基类的方法的时候 本来处理 0 1 2 现在却处理 3 4 5 会产生不可预知的结果。如果想改变基类的行为 重载他的函数 重新定义新的行为。

希望能帮到你

解决方案二:

我也在学JAVA 这两天做课设 做的头都大了啊

解决方案三:

this的确确表示指向自身的一个实例。为什么this可以参与instanceof运算或当作引用参数传进方法里,super为什么不能?因为this是一个instance(实例),所以可以参与instanceof运算或当作引用参数传进方法里。super在java里面只是一个关键字。具体用法:1.用户构造方法中。2.super.成员变量,super.成员方法。
new SubT3().func();这行代码,生成SubT3实例,func()方法是SubT3从其父类继承而来,执行时func()方法中的this指的是SubT3的实例。为什么没有打印出peter呢?我觉得是因为父类中this.name在编译时就确定是Jack了。至于你问题的第三点,this指的是subT3,这下第6行,16行的结果你明白了吧。

时间: 2025-01-01 14:02:41

java-关于JAVA的this关键字的相关文章

java中匿名类有关键字new 实例化一个对象有关键字new

问题描述 java中匿名类有关键字new 实例化一个对象有关键字new java中匿名类有关键字new 实例化一个对象有关键字new 那么如何区分匿名类和实例化一个对象 解决方案 不用区分.其实两者是一回事. 你可以认为对匿名类new是一个特例,它产生一个这个类型,然后产生一个这个类型的对象. 本质上这里new还是实例化对象. 解决方案二: 在程序运行中,以及调用者看来,一个匿名类的对象和一个一般的对象是一回事. 解决方案三: 转化的中间代码两个是一回事儿 解决方案四: C++中关键字newne

转 Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java  5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vol

java并发 多线程-关于java线程中的volatile关键字

问题描述 关于java线程中的volatile关键字 下面的代码中flag具有原子性,加上volatile修饰后具有可视性,能够保证setFlag和getFlag方法的同步,但是不明白与其他持有当前对象锁的同步方法是否能保持同步(就是otherMethod这样的方法) public class volatileTest { private volatile boolean flag; public void setFlag(boolean falg){ this.flag = flag;} pu

求助,java多线程的问题,synchronized关键字不起作用

问题描述 求助,java多线程的问题,synchronized关键字不起作用 public class VoTest { private int num=1; private void increase(){ ** synchronized (this){ this.num++; }** } private int read(){ return this.num; } public static void main(String[] args) { final VoTest test=new V

java方法重写和super关键字

//java方法重写和super关键字 //在继承中,其实就是子类定义了和父类同名的方法 //就是方法,属性都是相通的 //重写限制: //被子类重写的方法不能拥有比父类方法更加严格的权限 //super:强行调用父类方法的执行 /*重载和重写的区别? * 重载是发生在一个类中 对权限没有要求 而且重载的方法参数可以不同 * 重写发生在继承汇总 被子类重写的方法不能拥有比父类方法更加严格的权限,重写的方法中参数名字完全相同 * */ class A{ public void tell(){ Sy

java多线程编程之Synchronized关键字详解_java

本文介绍JAVA多线程中的synchronized关键字作为对象锁的一些知识点. 所谓对象锁,就是就是synchronized 给某个对象 加锁.关于 对象锁 可参考:这篇文章  一.分析 synchronized可以修饰实例方法,如下形式: public class MyObject { synchronized public void methodA() { //do something.... } 这里,synchronized 关键字锁住的是当前对象.这也是称为对象锁的原因. 为啥锁住当

Java多线程编程中synchronized关键字的基础用法讲解_java

多线程编程中,最关键.最关心的问题应该就是同步问题,这是一个难点,也是核心. 从jdk最早的版本的synchronized.volatile,到jdk 1.5中提供的java.util.concurrent.locks包中的Lock接口(实现有ReadLock,WriteLock,ReentrantLock),多线程的实现也是一步步走向成熟化.   同步,它是通过什么机制来控制的呢?第一反应就是锁,这个在学习操作系统与数据库的时候,应该都已经接触到了.在Java的多线程程序中,当多个程序竞争同一

Java并发编程:volatile关键字详细解析_java

volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用vola

Java并发编程之volatile关键字解析

原文出处海子 一内存模型的相关概念 二并发编程中的三个概念 三Java内存模型 四深入剖析volatile关键字 五使用volatile关键字的场景 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,

Java、Java Applet与 &#106avascript间的通信

摘 要:本文着重阐述了网页开发中,通过灵活使用从JavaScript语言中访问Java的方法.从JavaScript中访问JavaScript小程序的方法与变量,以及在Java Applet小程序中使用JavaScript等技术,实现这几种网页开发语言的互相补充,以开发更完美的Web应用程序. JavaScript是用于HTML环境的开发语言,提供了能够响应Web页面事件的脚本,可以完全访问浏览器窗口的各个方面,善于合并HTML.Java Applet小程序.插入件.服务器方程序和其他Web组件