在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

java方法的编写过程中要注意哪些地方

120次阅读
没有评论

共计 2997 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要介绍“java 方法的编写过程中要注意哪些地方”,在日常操作中,相信很多人在 java 方法的编写过程中要注意哪些地方问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java 方法的编写过程中要注意哪些地方”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

不要在构造函数中调用可以被重写的方法

一般来说在构造函数中只能调用 static,final 或者 private 的方法。为什么呢?

如果父类在执行构造函数的时候调用了一个可以被重写的方法,那么在该方法中可能会使用到未初始化的数据,从而导致运行时异常或者意外结束。

另外,还可能到方法获取到未初始化完毕的实例,从而导致数据不一致性。

举个例子,我们定义了一个 Person 的父类:

public class Person { public void printValue(){
 System.out.println( this is person! 
 }
 public Person(){ printValue();
 }
}

然后定义了一个 Boy 的子类,但是在 Boy 子类中,重新了父类的 printValue 方法。

public class Boy extends Person{ public void printValue(){
 System.out.println( this is Boy! 
 }
 public Boy(){ super();
 }
 public static void main(String[] args) { Person persion= new Person();
 Boy boy= new Boy();
 }
}

输出结果:

this is person!
this is Boy!

可以看到 Boy 调用了自己重写过的 printValue 方法。

注意,这里并不是说会产生语法错误,而是这样会导致业务逻辑看起来非常混乱。

怎么解决呢?简单办法就是将 Person 中的 printValue 置位 final 即可。

不要在 clone() 方法中调用可重写的方法

同样的,我们在定义 clone 方法的时候也不要调用可重写的方法,否则也会产生意想不到的变化。

还是上面的例子,这次我们添加了 clone 方法到 Person 类:

public Object clone() throws CloneNotSupportedException { Person person= (Person)super.clone();
 person.printValue();
 return person;
 }

接下来我们添加 clone 方法到 Boy 类:

public Object clone() throws CloneNotSupportedException { Boy clone = (Boy) super.clone();
 clone.printValue();
 return clone;
 }

因为在 clone 方法中调用了可重写的方法,从而让系统逻辑变得混乱。不推荐这样使用。

重写 equals() 方法

考虑一下父类和子类的情况,如果在父类中我们定义了一个 equals 方法,这个方法是根据父类中的字段来进行比较判断,最终决定两个对象是否相等。

如果子类添加了一些新的字段,如果不重写 equals 方法,而是使用父类的 equals 方法,那么就会遗漏子类中新添加的字段,最终导致 equals 返回意想不到的结果。

所以一般来说,子类需要重写 equals 方法。

如果重新 equals 方法,需要满足下面几个特性:

reflexive 反射性

对于一个 Object a 来说,a.equals(a) 必须成立。

symmetric 对称性

对于一个 Object a 和 Object b 来说,如果 a.equals(b)==true,那么 b.equals(a)==true 一定成立。

transitive 传递性

对于 Object a,b,c 来说,如果 a.equals(b)==true,b.equals(c)==true, 那么 a.equals(c)==true 一定成立。

consistent 一致性

对于 Object a,b 来说,如果 a 和 b 没有发生任何变化,那么 a.equals(b) 的结果也不能变。

对于非空的引用 a,a.equals(null) 一定要等于 false

具体代码的例子,这里就不写了,大家可以自行练习一下。

hashCode 和 equals

hashCode 是 Object 中定义的一个 native 方法:

@HotSpotIntrinsicCandidate
 public native int hashCode();

根据 Oracle 的建议,如果两个对象的 equals 方法返回的结果是 true,那么这两个对象的 hashCode 一定要返回同样的 int 值。

为什么呢?

我们看下下面的一个例子:

public class Girl {
 private final int age;
 public Girl(int age) {
 this.age = age;
 }
 @Override
 public boolean equals(Object o) { if (o == this) {
 return true;
 }
 if (!(o instanceof Girl)) {
 return false;
 }
 Girl cc = (Girl)o;
 return cc.age == age;
 }
 public static void main(String[] args) { HashMap Girl,Integer  hashMap= new HashMap ();
 hashMap.put(new Girl(20), 20);
 System.out.println(hashMap.get(new Girl(20)));
 }
}

上面的 Girl 中,我们定义了 equals 方法,但是并没有重写 hashCode,最后返回的结果是 null。

因为我们 new 了两次 Girl 这个对象,最后导致 native 方法中两个不同对象的 hashCode 是不一样的。

我们可以给 Girl 类中添加一个 hashCode 方法:

public int hashCode() {
 return age;
 }

这样就可以返回正确的值。

compareTo 方法的实现

我们在实现可比较类的时候,通常需要实现 Comparable 接口。Comparable 接口定义了一个 compareTo 方法,用来进行两个对象的比较。

我们在实现 compareTo 方法的时候,要注意保证比较的通用规则,也就是说,如果 x.compareTo(y) 0 y.compareTo(z) 0 那么表示 x.compareTo(z) 0.

所以,我们不能使用 compareTo 来实现特殊的逻辑。

最近看了一个日本的电影,叫做 dubo 默示录,里面有一集就是石头,剪刀,布来判断输赢。

当然,石头,剪刀,布不满足我们的通用 compareTo 方法,所以不能将逻辑定义在 compareTo 方法中。

到此,关于“java 方法的编写过程中要注意哪些地方”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计2997字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 亚洲资源在线视频 | 中文日产码2023天美 | 久久在线一区 | 毛片电影网址 | 欧美大屁股xxxx高跟欧美黑人 | 久久亚洲精品国产亚洲老地址 | 看黄色的软件 | 国产精品久久久久久无码 | 亚洲成av人在线观看网站 | 四虎影院永久 | 午夜性爽爽爽 | 欧美激情综合色综合啪啪五月 | 长腿校花无力呻吟娇喘的视频 | 精品亚洲77777www | 国内精品久久久久影院优 | 国产av无码专区亚洲av男同 | 女人张腿男生桶视频免费 | 欧美亚洲日本国产综合在线 | 亚洲av乱码一区二区三区 | 看黄小软件 | 国产精品免费视频能看 | 欧美、另类亚洲日本一区二区 | 国产精品无码av天天爽播放器 | 三级做爰蜜桃成熟时在线观看 | 免费日韩视频 | 成人欧美一区二区三区视频xxx | 18禁黄无码免费网站高潮 | 成人福利在线免费观看 | 欧美精品中文字幕手机免费视频 | 国产成人综合亚洲 | 在线 | 国产精品99传媒a | 国产永久在线观看 | 天天干天天干天天干天天干天天干 | 99热99在线| 久久精品国产亚洲av电影网 | 久久午夜羞羞影院免费观看 | 青青热久免费精品视频在线观看 | 日韩乱码人妻无码中文字幕 | 亚洲精品无码精品mv在线观看 | 国产成人精品日本亚洲语音1 | 精品久久久久久久久久 |