一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址

昨天因为要从JFrame控件获取密码,注意到一个问题,那就是用toString方法得到的不一定是你想要的,如下:

jPasswordField是JFrame中的密码输入框,如果用下面的方法是得不到密码的value的:

jPasswordField.getPassword().toString();

这是因为jPasswordField.getPassword()得到的是字符数组char[],然后调用toString方法得到的是这个字符数组的hashCode,即字符数组的内存地址。

只有用下面的方法才能把这个 char[] 对象转为 String 对象。

String s = new String(jp2_jpf.getPassword()); 

这是为什么呢?

先看下面的例子:

String s="abcd";
char[] c=s.toCharArray();
String s1=new String(c);//由字符数组构建String对象,并赋给s1
String s2=c.toString();//字符数组调用toString()方法,返回结果赋给s2

s1、s2的值是不一样的,s1的值是“abcd”,s2的值虽然也是String,但是它只是对象c的hashCode。因为toSting方法默认返回当前对象的hashCode,即内存地址。

总结:一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址!

再举个栗子:

 Integer a=10;
 String s=a.toString();

s的value是10,这是因为Integer重写了toString()方法。

附上jdk中 Integer类 对toString重写源码:

    public String toString() {
        return toString(value);
    }
    public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(buf, true);
    }  
时间: 2024-10-08 22:02:25

一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址的相关文章

在控制台输出口,根据内存地址,找到被过度释放的对象!

在控制台输出口,根据内存地址,找到被过度释放的对象!,布布扣,bubuko.com

python的变量,对象的内存地址以及参数传递过程

作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c++的菜鸟,把跟踪变量地址的习惯带入Python,举个小例子说明Python的变量,对象,及参数传递. 1 '''例子1''' 2 x = 1 3 def fun(x): 4 x = 2 5 return None 6 7 fun(x) 8 print(x) 其实不打印也可以,我们用pycharm单步

java.lang.Object.hashCode()的返回值到底是不是对象内存地址?

刚学Java的时候我也有过这种怀疑,但一直没有验证:最近在OSCHINA上看到有人在回答问题时也这么说,于是萌生了一探究竟的想法--java.lang.Object.hashCode()的返回值到底是不是对象内存地址? (顺带回顾一下JNI) hashCode契约 说到这个问题,大家的第一反应一定和我一样--去查Object.hashCode的源码,但翻开源码,看到的却是这样的(Oracle JDK 8): /** * Returns a hash code value for the obje

ExtJs--16--Ext.override()方法专门用来重写对象的方法

Ext.onReady(function(){ /** * Ext.override()方法专门用来重写对象的方法 */ //定义个类 Ext.define("U",{ //该类的属性配置项 config:{}, //该类的方法 show:function(){ alert("show .... "); }, //该类的构造器 constructor:function(config){ var me = this ; me.initConfig(config); }

java的类模板,对象,实例内存地址分析

java的类模板属于静态的东西是放在方法区的: java的对象是放在栈内存的: java的实例是放在堆内存的(new 出对象的数据): 例如: 注意:静态方法中没有对象,自然就没有this,super(内存角度考虑,是静态的东西在类模板中生成,而对象时new出来的,是在堆内存中): 笔记: java中的成员分为两种:实例成员和静态成员. 实例成员--------实例成员变量和实例成员方法: 静态成员--------静态成员变量和静态成员方法: 版权声明:本文为博主原创文章,未经博主允许不得转载.

python中的函数对象的内存地址是多少

今天和同学讨论一个问题,发现了函数的内存地址和我想象的不一样. 我以为同一个函数,假如给的参数不一样,那么这两个函数的id就不一样. 然后经过实验,发现python为了便于管理函数,所有的函数都放在同一片内存空间里面. func函数是我定义的一个函数,从结果可以看到func函数和print函数的内存地址是一样的. 这应该是python底层定义的,为了便于管理Python的各种函数和自己项目中定义的函数,可以想到,也许其他的地方也是这个管理机制呢. 原文地址:https://www.cnblogs

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码.如下:(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2)当obj1.ha

【java基础】重写equals()方法的同时要重写hashCode()方法

1. 为什么要重写equals方法? 因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等:如果你现在需要利用对象里面字段的值来判断是否相等,则重写equals方法. 2. 为什么重写hashCode方法? 一般的地方不需要重写hashCode,只有当类需要放在HashTable.HashMap.HashSet等等hash结构的集合时才会重写hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大

2019-11-26-C#-判断方法是否被子类重写

原文:2019-11-26-C#-判断方法是否被子类重写 title author date CreateTime categories C# 判断方法是否被子类重写 lindexi 2019-11-26 08:49:55 +0800 2019-11-26 08:42:17 +0800 C# 本文告诉大家如何通过反射判断某个方法是否被基类重写 在 C# 如果在类定义 virtual 的方法,那么可以在子类重写,如何判断一个方法被子类可以通过反射 例如创建一个 Foo 定义 Test 虚方法 cl