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 会将当前对象传递给 Printer 的 print 方法,从而实现打印。
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
文章为作者独立观点不代本网立场,未经允许不得转载。