Java程序员面试宝典--this
面试例题1:下面程序的结果是什么?[Trend公司面试题]
class Tester
{
int var;
Tester(double var)
{
this.var = (int)var;
}
Tester(int var)
{
this("hello");
}
Tester(String s)
{
this();
System.out.println(s);
}
Tester()
{
System.out.println("good-bye");
}
public static void main(String[] args)
{
Tester t = new Tester(5);
}
}
答案:
good-bye
hello
扩展知识(变量的内存分配情况)
在Java中有两个非常特殊的变量:this和super,这两个变量在使用前都是不需要声明的。this变量使用在一个成员函数的内部,指向当前 对象,当前对象指的是调用当前正在执行方法的那个对象。super变量是直接指向超类的构造函数,用来引用超类中的变量和方法。因此它们都是非常有用的变 量。下面介绍一下this的使用方法。
先看下面的一段代码。
class PersonInformation
{
String name,gender,nationality,address;
int age;
void PersonInformation(String p_name,String p_gender,String
p_nationality,String p_address,int p_age)
{
name=p_name;
gender=p_gender;
nationality=p_nationality;
address=p_address;
age=p_age;
}
}
在PersonInformation()函数中这个对象的方法提示可以直接访问对象的成员变量,而且在同一个范围中,定义两个相同的名字的局部变 量是不允许的。如果确实想使类的成员变量与方法的参数或方法自己定义的局部变量同名的话,就需要想一种方法使成员变量与跟它同名的方法参数或局部变量区分 开来,这就要使用到this变量。下面改写一下上面的代码,使PersonInformation类的构造函数的每个参数都有与对象成员变量相同的名字, 而成员变量的初值由参数给出。
class PersonInformation
{
String name,gender,nationality,address;
int age;
void PersonInformation(String name,String gender,String
nationality,String address,int age)
{
this.name=name;
this.gender=gender;
this.nationality=nationality;
this.address=address;
this.age=age;
}
}
从上例中可以看出,该构造函数中必须使用this。this在方法体中用来指向引用当前正在执行方法的那个对象实例。this变量的类型总是为包含 前执行方法的类。在上例中,我们要区别参数name和成员变量name,写成name=name显然是不允许的。在参数或局部变量名与类成员变量名相同的 时候,由于参数或局部变量的优先级高,这样在方法体中参数名或局部变量名将隐藏同名的成员变量,因此,为了指明成员变量,必须使用this显式地指明当前 对象。
有时候会遇到这种情况,全面地访问当前对象,而不是访问某一个个别的实例对象,此时也可以使用this,并利用Java中的toString()方 法(它能够返回一个描述这个对象的字符串)。如果把任何一个对象传递到System.out.println方法中,这个方法调用这个对象的 toString方法,并打印出结果字符串,所以,可以用System.out.println(this)方法来打印出固有参数的当前状态。
this还有一个用法,就是构造函数的第一个语句,它的形式是this(参数表),这个构造函数就会调用同一个类的另一个相对的构造函数。请看下面的例子。
class UserInfo
{
public UserInfo(String name)
{
this(name,aNewSerialNumber);
}
public Userinfo(String name,int number)
{
userName=name;
userNumber=number;
}
}
如果调用UserInfor newinfotable = new UserInfo("Wayne Zheng"),就会自动调用UserInfo(String name,int number)构造函数。
可见,熟练掌握this在Java程序设计过程中是非常重要的。
面试例题2:以下代码的运行结果是 。[Advantech公司2005年12月面试题]
class Base{
int i;
Base(){
add(1);
System.out.println(i);
}
void add(int v){
i+=v;
System.out.println(i);
}
void print(){
System.out.println(i);
}
}
class MyBase extends Base{
MyBase(){
add(2);
}
void add(int v){
i+=v*2;
System.out.println(i);
}
}
public class TestClu {
public static void main(String[] args) {
go(new MyBase());
//System.out.println();
}
static void go(Base b){
b.add(8);
//b.print();
}
}
A.12 B.11 C.22 D.21
解析:
程序流程是这样的:在主函数中,首先执行new MyBase(),在这个过程中,子类会首先调用父类的构造函数;在父类的构造函数Base()中执行add()方法。这里需要注意,这个add方法由于 是在新建MyBase对象时调用的,将会首先查找MyBase类中是否有此方法。所以,Base()函数中的add(1)实际上是:
void add(int v)
{
i+=v*2;
System.out.println(i);
}
此时i的值即为2。在打印两个2之后,父类构造函数执行完毕,执行子类的构造函数,即MyBase(),这里的add(2)当然也是子类的。i的值就变为了6。
最后执行go函数,i即为22。
答案:C
转载于:https://www.cnblogs.com/homezzm/archive/2009/11/25/1610021.html
Java程序员面试宝典--this相关推荐
- 金九银十北漂记第2篇:《Java程序员面试宝典》读书笔记
尽信书,则不如无书.-–孟子 谈一谈这本书 <Java程序员面试宝典>是我接触的第一本讲解面试相关的书籍在看到这本书之前我就经常逛csdn的bbs,已经接触面试之类的知识.不过这本书还是 ...
- Java程序员面试宝典笔记记录(1~3章概括)
文章目录 导言 求职前重要的两点 求职者注意的几个方面: 挑选offer考虑5点 后台开发人员面试需要补充和阅览的书籍 需备技能方面 需要阅读的书籍(针对Java) 结语 导言 本博文是对于何昊出 ...
- Java程序员面试宝典
第1部分 求职过程 古人云:凡事预则立,不预则废.机会都是垂青有准备的人的.为了得到一份满意的工作,大家一定要对整个求职过程有清醒的了解.把能够预见的.必须做的事情早一些做完,这样在大规模招聘开始的 ...
- JAVA程序员面试宝典 (2011版)
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...
- JAVA程序员面试宝典C收藏
37,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 会执行,在return前执行. 38,编程题 ...
- JAVA程序员面试宝典3
37,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 会执行,在return前执行. 38,编程题 ...
- 12 Java程序员面试宝典视频课程之面向对象
一.简述面向对象和面向过程的区别和联系? 答: 两者都是软件开发思想,先有面向过程,后有面向对象.在大型项目中,针对面向过程的不足推出了面向对象开发思想 区别 编程思路不同: 面向过程以实现功能的函数 ...
- 02 Java程序员面试宝典视频课程之异常
一.Java 中,处理异常的两大步是? 答 捕获异常 声明异常 二.如果 catch 两个异常,一个是父类,一个是子类.这两个异常的 catch 顺序如何确定? 答 子类异常在前父类异常在后 三.fi ...
- java程序员面试宝典(刘磊版)笔记
1:JDK与JRE JDK:JAVA Development Kit, java开发工具包; 包括各种类库和工具,当然也包括JRE JRE:JAVA Runtime Environment,java程 ...
- 真牛皮!java程序员面试宝典怎么样
前言 爱因斯坦说过"耐心和恒心总会得到报酬的",我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在"我"身上实现了. 每一个程序员都拥有一座大厂梦,我也不 ...
最新文章
- final关键字的几大特征
- 所有人问「贴吧之父」俞军
- 如何解决Binder泄漏问题
- Dubbo的设计理念原来就藏在这三张图中
- 科学计算机clr,科学计算器按键功能汇总
- 黑客攻防技术宝典Web实战篇第2版—第5章 避开客户端控件
- JDK 8的一些新特性
- php比较两个数组的键名统计有交集的数量,php比较两个数组的键名并返回交集的函数array_intersect_key()...
- 2012年云计算领域将发生6件大事
- android studio | openGL es 3.0增强现实(AR)开发 (3) OpenGL es3.0基本知识介绍
- 基于Java GUI的资产管理系统的设计与实现
- 后台网站首页设计过程
- 华三交换机升级的ipe文件_H3C S5830V2[S5820V2]系列以太网交换机 配置指导-Release 2108-6W101...
- win7 网络不显示电脑连接到服务器,Win7在网上邻居上看不到别的电脑怎么办?
- Win10系统更新显卡驱动无限蓝屏重启-驱动人生解决方案
- 「2020总结文章」一起回顾 2020,展望 2021(JesksonUI-UniApp)
- 信息学奥赛一本通 1296:开餐馆 | OpenJudge NOI 2.6 6045:开餐馆
- linux轻量级进程,linux轻量级进程LWP
- [禅悟人生]有一种禅心叫认真
- 一份写给极客的智能家居指南
热门文章
- flowable画图教程_flowable画图教程_Flowable 学习笔记
- 029_Loading加载
- 018_Jedis的Hash数据类型
- 004_淡入淡出效果
- 黑马28期Android全套视频无加密完整版
- linux 编译文件mm,Linux编译C++文件,说没有找到头文件,怎么啊?新手,不太会用...
- 切割机插件_这些激光切割机的故障,看看你都遇到过吗?
- android mvvm livedata_再谈Android应用架构——Jetpack VS 生命周期
- firefox如何不让网站登录失效_Firefox Preview 4开放下载:引入登录管理、热门网站等功能...
- nerdctl命令tab键补齐方法