Java基础却常被忽略:全面讲解this的实战技巧!

大家好,我是小米,一个热爱分享技术的 29 岁程序员。最近,一位朋友跟我诉苦,说他参加了一场 Java 社招面试,面试官问了一个看似简单却让人抓狂的问题——“请讲讲 this 关键字的用法。”

“这不是基础到不能再基础的问题吗?居然问这个!”朋友心里这么想,但冷静下来才发现,虽然每天用 this,但真要系统解释却有点卡壳。于是,我决定整理一篇文章,帮大家理清楚 this 的各种妙用,顺便解答几个常见的面试陷阱。

this 是 Java 中的一个关键字,简单说,它代表当前对象的引用。当我们在类中调用它时,this 指向当前类的实例。它的主要作用包括:

  • 区分类的成员变量和局部变量。
  • 在构造方法中调用其他构造方法。
  • 返回当前对象(链式调用)。
  • 作为参数传递。

来看几个场景化的例子,理解它的用法。

先来看一个场景,小明是个初级开发,刚写完以下代码:

小明很疑惑,为什么他调用 setName(\”小米\”) 后,getName() 返回的还是 null?其实问题出在 name = name; 这行代码。

这里的两个 name 指的是同一个局部变量!如果想赋值给类的成员变量,必须用 this 来指明。

正确代码如下:

这就是 this 的最基础用法之一:区分同名变量。

接下来,假设你要写一个 Person 类,有多个构造方法。面试官可能会问:“如何避免构造方法中代码重复?”

用 this 来调用另一个构造方法就是最佳答案!

来看代码:

上面的代码中,this(name, 0) 调用了第二个构造方法。这样既减少了重复代码,又方便统一管理逻辑。

注意:

  • 构造方法中调用其他构造方法时,this 必须是方法的第一行。
  • 不允许循环调用构造方法,否则会编译错误。

面试中,很多人会提到链式调用。比如我们希望下面的代码可以运行:

实现链式调用的关键就在于方法返回 this。代码如下:

通过返回 this,我们可以在一个语句中完成多个调用,大大提升代码的可读性和优雅度。

有时候,我们希望把当前对象传递给另一个方法或对象,这时候 this 就派上用场了!

比如,有一个 Printer 类,负责打印对象的信息。我们可以这样实现:

调用 person.print() 时,this 会将当前对象传递给 Printerprint 方法,从而实现打印。

1. 静态方法中能不能使用 this?

不能!因为静态方法是属于类的,而 this 是属于实例的。在静态方法中,this 根本不存在。

错误示例:

2. this 可以出现在匿名内部类中吗?

可以!但是要注意 this 的含义。

匿名内部类中,this 指的是匿名类实例,而不是外部类实例。如果需要引用外部类,可以用 外部类名.this 的方式。

示例代码:

通过今天的学习,我们知道了 this 的四种常见用法:

  • 区分成员变量和局部变量。
  • 在构造方法中调用其他构造方法。
  • 实现链式调用。
  • 作为参数传递。

同时,我们也提醒自己:静态方法中不能使用 this,匿名内部类中要注意 this 的指向。

最后,留个小作业给大家:实现一个 Student 类,包含 name 和 score 两个属性,支持以下操作:

  • 使用构造方法初始化对象。
  • 通过链式调用设置 name 和 score。
  • 打印对象信息。

欢迎在评论区留言你的答案,我会第一时间帮你点评!

记住,写代码不在于记住多少,而在于动手实践!加油,我们下期见!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

Java基础学习:webservice实例教程

简单来说,webservice就是远程调用技术,也叫XMLWebServiceWebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,并且是轻量级的、独立的通讯技术。是通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

XML:(ExtensibleMarkupLanguage)扩展型可标记语言,面向短期的临时数据处理、面向万维网络,是Soap的基础。

SOAP:(SimpleObjectAccessProtocol)简单对象存取协议。是XMLWebService的通信协;当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作;SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

WSDL:(WebServicesDescriptionLanguage)WSDL文件是一个XML文档,用于说明一组SOAP消息以及如何交换这些消息,大多数情况下由软件自动生成和使用。

如何发布一个webservice

如何发布一个webservuce呢?下面我们通过一个简单的例子慢慢的告诉大家。

1.创建一个web服务端项目

为了简单明了,我一共创建了三个类,一个接口,一个接口实现类,一个发布类(main方法)。

具体如下:

上面图中是一个WebService接口,其中定义了一个sayHello(Stringname)的方法

记住一定要在类上加上@WebService注解

@WebMethod注解声明了这个方法是要发布出去的方法

上面这个类是WebService接口的实现类,具体实现sayHello(Stringname)方法的方法体

最后我们在服务器端运行WebServicePublish类中的main方法

控制台打印出发布webservice成功!

见下图:

在浏览器中输入我们在WebServicePublish类中定义的address?wsdl(注意一定要加wsdl),浏览器显示如下,那么我们这个WebService就发布成功了。

见下图:

下面,我们来看一下客户端怎么调用(这也是网上版本最多最杂的一步,大多数人前面都很明白,但是到了这里就直接懵圈了)

2.创建一个客户端项目

首先我们先创建一个client11客户端的项目,然后我们通过Win+R组合键调出cmd,在cmd中输入wsimport-s我们这个项目的src路径-keep我们发布的webservice地址

例如:

然后去eclipse中刷新我们的项目,就会发现系统自动帮我们生成了许多类。

当然WSclient是我在系统生成之后自己写的一个客户端的测试类

我们就来重点看一下这个测试类是怎么写的:

运行过后控制台输出如下:

现在我们可以看到的“hahahaha”就是服务器中写的,到此我们这个极其简单的webservice服务器客户端就完成了。

彻夜怒肝!熬夜整理13个Java基础实例,程序员的辛苦钱建议不要赚

今日分享开始啦,请大家多多指教~

Java代码实现是比较基础的内容,今天给大家介绍几个题目训练,自己可以动手操作实现一下哦!

题目内容:根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)

Java代码实现

编译效果:

我们输入一个数值的大小,程序会打印出对应的年龄段.

题目内容:打印1-100之间存在的素数

Java代码实现

编译效果:

注意点:打印出1-100之间的素数,我们用的是较为简单的做法,还可以更加方便地求解,比如i++ –> i+=2,偶数不可能是素数。还可以将j的范围缩小到 i/2 或者 i开平方.

题目内容:输入一个数字判断是否是素数

Java代码实现:

编译效果:

注意点:同上

题目内容:输出 1000 – 2000 之间所有的闰年

Java代码实现:

编译效果:

题目内容:输出9*9乘法口诀表

Java代码实现:

编译效果:

注意点:格式化输出,我们可以采用C语言中printf函数的格式.

题目内容:输入两个正整数,输出他们的最大公约数

Java代码实现:

编译效果:

注意点:我们做题时用到了辗转相除法

题目内容:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 – 1/100 的值。

Java代码实现:

编译效果:

注意点: sum += ( flag ) * ( 1.0 / i) ;这里一定要明确 是1.0 / i ,不是1 / i.另外sum要定义成double类型.

题目内容:编写程序数一下 1到 100 的所有整数中出现多少个数字9

编译效果:

注意点:99中9出现了两次,所以我们用两个if语句,分别对含有9的数字中9的个数进行计数.

题目内容:

求出0~999之间的所有“水仙花数”并输出。

水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如:153=1+5+3?,则153是一个“水仙花数.

Java代码实现:

编译效果:

思考步骤:

1.算出该数字有多少位

2.将该数字的每一位数字得到,算出每一位数字的次方的和

3.比较结果与原数字是否相等

题目内容:

最多能输入三次密码,密码正确,提示“登录成功”,密码错误可以重新输入.

最多输入三次。三次均错,则提示退出程序

Java代码实现:

编译效果:

注意点:equals() 比较字符串的功能.

题目内容:写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1Java代码实现:

编译效果:

注意点: 明确位操作符& 的作用,二进制的每一位 &1,都可以得到这一位上的数字

题目内容:获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。

Java实现代码:

编译效果:

注意点:这是练习十二的拓展,我们根据二进制数列的奇偶位进行取位.

题目内容:我们实现简单的猜数字游戏,由电脑随机生成100以内的数字,我们进行猜测,直到猜对为止,程序退出。

Java代码实现:

编译效果:

好了,我们Java基础题目的分享就到这里结束了,希望大家多多练习。

小结:

其实我想说,Java基础真心很重要,巩固核心基础是重点也是核心,万丈高楼平地起,没有稳定的地基,修高楼最后结果也是会倒塌的,所以工作之余多多提升下技术,研究下基础技术设计的思想和初衷,别在埋头苦干做一个名“实干家了”!

今日份分享已结束,请大家多多包涵和指点!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。