本文发表于本人博客

今天我来说说关于静态变量初始化、数组、==与equals的问题,看下面代码:

public class Test{
private final int age; private String name; public Test(){
age = 30;
} public Test(String name){
this.name = name;
}
}

我想上面的代码好多人都知道了会编译报错的,原因是在代餐构造函数中未对age进行复制操作。

对于终态变量final程序中是可以再2个地方赋值的,一是申明后赋值,二是构造函数中赋值,上面的代码带参构造修改成如下:

    public Test(String name){
age = 30;
this.name = name;
}

这样编译就没问题可以通过了。那现在我们把这个age变量的修饰符增加static,看代码:

public class Test{
private static final int age; private String name; public Test(){
age = 30;
} public Test(String name){
age = 30;
this.name = name;
}
}

说说这样编译能通过吗!这样也是不行的,分析下当这个age变量变味static时它已经不属于任何对象了是属于类Test的了,那么如果在构造对象的时候还去赋值修改原有的值那肯定不行了,它只有在申明时候赋值,代码修改如下:

public class Test{
private static final int age = 30; private String name; public Test(){
} public Test(String name){
this.name = name;
}
}

继续看下面代码,看看这个能编译吗?

public class Test{
public static final StringBuffer sb = new StringBuffer();
public static void main(String[] args){
sb.append("www.luoliang.me");
}
}

这个比较简单,竟然sb为类常量,那么由于是类,它的引用地址是不能再修改了,但是这个指向的地址的内容是可以被修改的。

继续看下面代码,试问编译通过吗?如果不通过,哪里有问题?

interface I{}
public class demo{
public static void main(String[] args){
I[] iArray = new I[2];
I i = new I();
}
}

上面的代码大家看了就知道,接口interface是不能实例化的,那么new I()肯定是不行的。至于这个new来实例化I的数组,这个可以吗,先解析下,由于数组里面的元素是对象,那么对象是可以为null的,这样的话new I[2]表示长度为2的I对象数组,至于数组的元素一定是要继承接口I了,比如:

class Test implements I{
}
iArray[0] = new Test();

现在我们来看看这个==与equals的问题,在网上也好多了,现在自己再复习下,看下面代码:

public class Test{
public static void main(String[] args){
String str1 = new String("luoliang.me");
String str2 = new String("luoliang.me");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
}
}

试问输出什么?这个倒是简单很多人都知道了,如果是基本类型==比较的是其值,如果是引用类型比较的是其地址。那equals这个方法呢,所有对象都是Object的子类,那我们查看下jdk源码中的Object,可以看到:

    public boolean equals(Object obj) {
return (this == obj);
}

他们是直接比较的地址啊,是==。那字符串呢,先不说我们看看String类的equals方法:

    public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

可以看到起源码是先比较是否是同一个字符串,如果是的话返回true,如果不是的话继续比较他们各次的字符。那现在我们就知道答案了,输出如下:

false
true

接下来我们来看如下代码:

class Person{
public String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}

现在如果2个Person对象进行比较,如果是名称name相同则判断是同一个人,怎么做?先分析一下:判断是否同一个人,这个对象是继承基类Object的,本身有equals方法,那按照String类的方法重写Override一下应该就可以解决了,看下面:

class Person{
public String name;
public Person(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof Person) {
Person person = (Person)anObject;
if(person.name.equals(this.name)){
return true;
}
}
return false;
}
}

调用如下:

        Person p1 = new Person("luoliang");
Person p2 = new Person("luoliang");
System.out.println(p1 == p2);
System.out.println(p1.equals(p2));

输出结果:

false
true

这次先到这里。坚持记录点点滴滴!

Java基础知识陷阱(五)的更多相关文章

  1. Java基础知识陷阱系列

    Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...

  2. Java基础知识陷阱(九)

    本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一 ...

  3. Java基础知识陷阱(十)

    本文发表于本人博客. 上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序 ...

  4. java基础知识(五)java类

    类是java的核心和本质,是java语言的基础. 一.java中的类 1.类class 一个类可以包含局部变量.实例变量.类变量(静态变量) 一个类至少有一个构造方法,如果没有,系统会默认给出一个无参 ...

  5. Java基础知识陷阱(二)

    本文发表于本人博客. 上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参.先看下面代码: public void changeInt(int a){ a = ; } ...

  6. Java基础知识陷阱(七)

    本文发表于本人博客. 上次说了下HashSet和HashMap之间的关系,其中HashMap这个内部有这么一句: static final float DEFAULT_LOAD_FACTOR = 0. ...

  7. Java基础知识陷阱(六)

    本文发表于本人博客. 上次说了下equals跟==的问题,今天再来认识一下这个equals()跟hasCode().上次的代码如下: class Person{ public String name; ...

  8. Java基础知识陷阱(四)

    本文发表于本人博客. 今天我们来说说关于java继承以及反射有关的问题,大家先看下下面代码,试问可以编译通过不,为什么具体说说原因? public class Test{ public static ...

  9. Java基础知识陷阱(三)

    本文发表于本人博客. 之前都讲了有关字符串的陷阱,那今天来说下关于静态这个东西,这分为静态变量.静态方法,先看下面的代码请问结果输出是什么?: class Person01{ private stat ...

随机推荐

  1. db2 import和load

    Import和Load 都可以将数据导入到DB2服务器中,但是2者是有很大区别的. Import 其实执行了SQL 的INSERT 操作.和INSERT 操作一样,Import 执行的时候会激活触发器 ...

  2. ActiveMQ搭建

    下载 到ActiveMQ官网,找到下载点. 目前, 官网为http://activemq.apache.org/ Linux版本下载点之一为:http://apache.fayea.com/activ ...

  3. UDP传输原理及数据分片——学习笔记

    TCP传输可靠性是:TCP协议里自己做了设计来保证可靠性. IP报文本身是不可靠的 UDP也是 TCP做了很多复杂的协议设计,来保证可靠性. TCP 面向连接,三次握手,四次挥手 拥塞机制 重传机制 ...

  4. 剑指offer 29 多于一半的数

    1. 思路比较简单, 每次从数组中抽出两个数, 若是不同则丢弃两个数, 最后剩下的数即为所求 2. 书中给出的代码实现比较巧妙. 遍历数组中的元素, 变量 result 记录当前元素, time 记录 ...

  5. .net Session延长过期时间

    一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会话超时(分钟)-设置为120,即为2小时,即120分钟后如果当前用户没有操作,那么Session就会自动过期. 二 ...

  6. Android软键盘的隐藏显示研究

    http://winuxxan.blog.51cto.com/2779763/522810 全局推: android:windowSoftInputMode="adjustResize&qu ...

  7. Fragment、FragmentTabHost以及RadioGroup框架

    package com.dotfive.chuanbang.activity; import test.Fragment1; import test.Fragment1.OnBackListener; ...

  8. 160505、oracle 修改字符集 修改为ZHS16GBK

    修改oracle字符集 方法/步骤   oracle数据库的字符集更改 A.oracle server 端 字符集查询 select userenv('language') from dual 其中N ...

  9. CSS 中 BEM命名方式

    BEM的意思就是块(block).元素(element).修饰符(modifier),是一种CSS Class 命名方法. 类似于: .block{} .block__element{} .block ...

  10. 2017 Multi-University Training Contest - Team 3——HDU6063 RXD and math

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6063 题目意思:字面意思,给出n,k,算出这个式子的答案. 思路:比赛的时候是打表找规律过了,赛后仔细 ...