java面对对象 关键字this super
this:this是指向对象本身的一个指针,成员函数内部指向当前类的对象
其实this主要要三种用法:
1、表示对当前对象的引用!
2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!
package test;
public class ThisTest {
private int i=0;
//第一个构造器:有一个int型形参
ThisTest(int i){
this.i=i+1;//此时this表示引用成员变量i,而非函数参数i
System.out.println("Int constructor i——this.i: "+i+"——"+this.i);
System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));
//从两个输出结果充分证明了i和this.i是不一样的!
}
// 第二个构造器:有一个String型形参
ThisTest(String s){
System.out.println("String constructor: "+s);
}
// 第三个构造器:有一个int型形参和一个String型形参
ThisTest(int i,String s){
this(s);//this调用第二个构造器
//this(i);
this.i=i++;//this以引用该类的成员变量
System.out.println("Int constructor: "+i+"/n"+"String constructor: "+s);
}
public ThisTest increment(){
this.i++;
return this;//返回的是当前的对象,该对象属于(ThisTest)
}
public static void main(String[] args){
ThisTest tt0=new ThisTest(10);
ThisTest tt1=new ThisTest("ok");
ThisTest tt2=new ThisTest(20,"ok again!");
System.out.println(tt0.increment().increment().increment().i);
//tt0.increment()返回一个在tt0基础上i++的ThisTest对象,
//接着又返回在上面返回的对象基础上i++的ThisTest对象!
}
}
运行结果:
Int constructor i——this.i: 10——11
String constructor: ok
String constructor: ok again!
Int constructor: 21
String constructor: ok again!
14
说明在什么情况下需要用到this:
第一、通过this调用另一个构造方法,用发是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。
第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。
第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。
super:
在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。
1.1.super关键字测试
1 package cn.galc.test;2 3 /**4 * 父类5 * @author gacl6 *7 */8 class FatherClass {9 public int value; 10 public void f() { 11 value=100; 12 System.out.println("父类的value属性值="+value); 13 } 14 } 15 16 /** 17 * 子类ChildClass从父类FatherClass继承 18 * @author gacl 19 * 20 */ 21 class ChildClass extends FatherClass { 22 /** 23 * 子类除了继承父类所具有的valu属性外,自己又另外声明了一个value属性, 24 * 也就是说,此时的子类拥有两个value属性。 25 */ 26 public int value; 27 /** 28 * 在子类ChildClass里面重写了从父类继承下来的f()方法里面的实现,即重写了f()方法的方法体。 29 */ 30 public void f() { 31 super.f();//使用super作为父类对象的引用对象来调用父类对象里面的f()方法 32 value=200;//这个value是子类自己定义的那个valu,不是从父类继承下来的那个value 33 System.out.println("子类的value属性值="+value); 34 System.out.println(value);//打印出来的是子类自定义的那个value的值,这个值是200 35 /** 36 * 打印出来的是父类里面的value值,由于子类在重写从父类继承下来的f()方法时, 37 * 第一句话“super.f();”是让父类对象的引用对象调用父类对象的f()方法, 38 * 即相当于是这个父类对象自己调用f()方法去改变自己的value属性的值,由0变了100。 39 * 所以这里打印出来的value值是100。 40 */ 41 System.out.println(super.value); 42 } 43 } 44 45 /** 46 * 测试类 47 * @author gacl 48 * 49 */ 50 public class TestInherit { 51 public static void main(String[] args) { 52 ChildClass cc = new ChildClass(); 53 cc.f(); 54 } 55 }
运行结果:
1.2. 画内存分析图了解程序执行的整个过程
分析任何程序都是从main方法的第一句开始分析的,所以首先分析main方法里面的第一句话:
ChlidClass cc = new ChlidClass();
程序执行到这里时,首先在栈空间里面会产生一个变量cc,cc里面的值是什么这不好说,总而言之,通过这个值我们可以找到new出来的ChlidClass对象。由于子类ChlidClass是从父类FatherClass继承下来的,所以当我们new一个子类对象的时候,这个子类对象里面会包含有一个父类对象,而这个父类对象拥有他自身的属性value。这个value成员变量在FatherClass类里面声明的时候并没有对他进行初始化,所以系统默认给它初始化为0,成员变量(在类里面声明)在声明时可以不给它初始化,编译器会自动给这个成员变量初始化,但局部变量(在方法里面声明)在声明时一定要给它初始化,因为编译器不会自动给局部变量初始化,任何变量在使用之前必须对它进行初始化。
子类在继承父类value属性的同时,自己也单独定义了一个value属性,所以当我们new出一个子类对象的时候,这个对象会有两个value属性,一个是从父类继承下来的value,另一个是自己的value。在子类里定义的成员变量value在声明时也没有给它初始化,所以编译器默认给它初始化为0。因此,执行完第一句话以后,系统内存的布局如下图所示:
接下来执行第二句话:
1 cc.f();
当new一个对象出来的时候,这个对象会产生一个this的引用,这个this引用指向对象自身。如果new出来的对象是一个子类对象的话,那么这个子类对象里面还会有一个super引用,这个super指向当前对象里面的父对象。所以相当于程序里面有一个this,this指向对象自己,还有一个super,super指向当前对象里面的父对象。
这里调用重写之后的f()方法,方法体内的第一句话:“super.f();”是让这个子类对象里面的父对象自己调用自己的f()方法去改变自己value属性的值,父对象通过指向他的引用super来调用自己的f()方法,所以执行完这一句以后,父对象里面的value的值变成了100。接着执行“value=200;”这里的vaule是子类对象自己声明的value,不是从父类继承下来的那个value。所以这句话执行完毕后,子类对象自己本身的value值变成了200。此时的内存布局如下图所示:
方法体内的最后三句话都是执行打印value值的命令,前两句打印出来的是子类对象自己的那个value值,因此打印出来的结果为200,最后一句话打印的是这个子类对象里面的父类对象自己的value值,打印出来的结果为100。
到此,整个内存分析就结束了,最终内存显示的结果如上面所示。
转载于:https://www.cnblogs.com/lls002-1435/p/5197018.html
java面对对象 关键字this super相关推荐
- Java面对对象(多态)
Java面对对象(多态) 一,object类和toString Object 类|老祖宗类 是java 中所有类的父类 在java中的所有类都会直接或者间接的继承自Object类 to ...
- java俄罗斯方块视频_[VIP视频]【A0233】java面对对象编程-俄罗斯方块视频教程 高清视频 百度云 百度网...
Java视频教程名称:java面对对象编程-俄罗斯方块视频教程 俄罗斯方块视频教程 $ X0 X1 Z: W4 P3 T e. m3 q百度网盘下载链接: . M% x- I- V5 p( J 游 ...
- Java面对对象概念,什么是面向对象
我们都知道Java是一门面向对象的语言.什么是面向对象,它有什么特性呢,今天我们就来说一下这个"面向对象"到底是什么意思. 面向对象简称 OO(Object Oriented),2 ...
- java面对对象编程
因为这直接关系到你阅读设计模式的速度和理解质量. 接下来我将简单介绍java中面对对象编程的一些基础知识. 1,类和修饰符 public class ClassTest{public ClassTes ...
- Java面对对象的核心是啥_Java面向对象核心技能
1.封装 封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问. 封装的好处:隐藏类的实现细节:让使用者只能通过程序规 ...
- Java面对对象(基础)
方法的可变参数 一个方法只能定义一个可变参数 一个方法中其他参数只能放可变参数的前面 可变参数传值时可传入数组 可变参数使用时当成数组使用 方法的可变参数使用 在方法中定义可变参数后,我们可以像操作数 ...
- 基于java面对对象编程范式笔记
https://www.icourse163.org/learn/NJU-1002246017?tid=1002791118#/learn/content 科学思维&工程思维 科学思维:限制条 ...
- Java中this关键字和super关键字用法
构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过 ...
- Java面对对象程序设计——面对对象
重点掌握 1.类是对一类事物描述,是抽象的.概念上的定义:对象是实际存在的该类事物的每个个体,因而也称为实例 2.创建对象的格式是:类名 对象名称 = new 类名 (); 3.方法的声明格式是:[& ...
最新文章
- MATLAB中文件的读写和数据的导入导出
- No valid host was found. There are not enough hosts available
- 翟树卿:如何让数据挖掘助力精准化营销
- 计算机视觉中的自监督表示学习近期进展
- sv_labs学习笔记 专栏说明博文目录
- webgl存本地文件_20万存款该怎么存?银行员工:这样存,每年利息近万元!
- Android 垃圾回收机制★★★
- 毕业论文速成指南来了!
- python不知道吃什么_一个人不知道吃什么?找出我做的一个人的食物
- 虚幻引擎(UE4)场景漫游交互项目制作
- Bro脚本语法4-声明和语句(Declarations and Statements)
- 利用sqlmap注入获取网址管理员账号密码
- 用Python爬取微信好友头像,才知道好友都是这样的人
- 配置MAWEN环境变量,总是出错
- 机器学习笔记 - 行列式
- 爬取笔趣阁小说网站上的所有小说(二)
- FireFox 必备插件(四)
- 期货开户手续费的秘密成了透明
- 火狐浏览器点击下载按钮没反应
- 什么是JPA?Java持续性介绍
热门文章
- python展示全部好友_python爬所有好友头像
- opencv-4.5.3 + opencv_contrib-4.5.3 + vtk-9.0.3编译(全流程)
- 数据预处理 | 机器学习之特征工程
- python计算iris数据集的均值_K均值(K-Means)
- linux 进程wait,linux 进程等待 wait 、 waitpid(示例代码)
- shell mysql awk_shell mysql 处理数据小结
- Inception-v4,Inception-ResNet论文笔记
- mysql 时间 between查询 索引吗_Mysql: mysql between 日期索引 索引问题-日期索引使用...
- phpcms attachment.class.php路径,解决phpcms上传不了图片的方法
- 牛客OI周赛2-提高组