当前位置:首页 » 编程语言 » javaclasstoobject

javaclasstoobject

发布时间: 2025-05-10 17:25:06

1. java中Object类是怎么回事,干嘛使的举例说明!

Object类的作用:m a r k - t o- w i
n:在java中,因为所有的类都有共性,所以java的缔造者们把java设计成这样:所有的类都是Object类的直接或间接子类,而且把上述所有类
的共性都放在Object类中。这样就可以达到代码重用。All classes in java are subclasses of
Objectclass。

Object类的equals和toString的用法:

下面一组两个例子,马克-to-
win:第一个例子是用的父类Object的equals和toString方法,Object的equals是比较对象在内存当中的地址,当然不一样
了。而Company的equals方法是自己写的,比较的他们的name属性,只要name一样,对象的equals返回的就是真。另外,Object
的toString方法打印出来就是Company@1b67f74,这是Sun公司编的。而后面一个例子的toString方法时咱们自己编的。

例:2.1.1---本章源码
class CompanyMark_to_win {
private String name;
CompanyMark_to_win(String name) {
this.name = name;
}
/*
public String toString() {
return name;
}

public boolean equals(Object o) {
if (!(o instanceof CompanyMark_to_win))
return false;
CompanyMark_to_win c = (CompanyMark_to_win) o;
return name.equals(c.name);。。。。。。。。。。。。。。。。。。。。。
更多详情,请网上找“马克-to-win”,参考他的网站或他的网络空间:java第三章的内容。

给个链接:http://tieba..com/p/3139989381

2. java中 this.getClass().getCLassLoder()是什么意思

getClass():取得当前对象所属的Class对象
getClassLoader():取得该Class对象的类装载器
类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,在你说的问题哪里,通过它可以得到一个文件的输入流
getClass :
public final Class getClass()
Returns the runtime class of an object. That Class object is the object that is locked by static synchronized methods of the represented class.
Returns:
the object of type Class that represents the runtime class of the object.

getClassLoader
public ClassLoader getClassLoader()
Returns the class loader for the class. Some implementations may use null to represent the bootstrap class loader. This method will return null in such implementations if this class was loaded by the bootstrap class loader.
If a security manager is present, and the caller´s class loader is not null and the caller´s class loader is not the same as or an ancestor of the class loader for the class whose class loader is requested, then this method calls the security manager´s checkPermission method with a RuntimePermission("getClassLoader") permission to ensure it´s ok to access the class loader for the class.

If this object represents a primitive type or void, null is returned.

Returns:
the class loader that loaded the class or interface represented by this object.
Throws:
SecurityException - if a security manager exists and its checkPermission method denies access to the class loader for the class.
See Also:
ClassLoader, SecurityManager.checkPermission(java.security.Permission), RuntimePermission

Class.getClassLoader()的一个小陷阱:)
昨天我的code总在Integer.class.getClassLoader().getResource("*********");这一句抛出空指针异常,定位为getClassLoader()返回null,查了一下jdk的文档,原来这里还有一个陷阱:
jdk中关于getClassLoader()的描述:
/**
* Returns the class loader for the class. Some implementations may use
* null to represent the bootstrap class loader. This method will return
* null in such implementations if this class was loaded by the bootstrap
* class loader.
*
* <p> If a security manager is present, and the caller's class loader is
* not null and the caller's class loader is not the same as or an ancestor of
* the class loader for the class whose class loader is requested, then
* this method calls the security manager's <code>checkPermission</code>
* method with a <code>RuntimePermission("getClassLoader")</code>
* permission to ensure it's ok to access the class loader for the class.
*
* <p>If this object
* represents a primitive type or void, null is returned.
.....

上面的英文可以用下面的话来理解:

装载类的过程非常简单:查找类所在位置,并将找到的Java类的字节码装入内存,生成对应的Class对象。Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器,事实上,如果你愿意的话,你可以让JVM拥有无数个类装载器,当然这除了测试JVM外,我想不出还有其他的用途。你应该已经发现到了这样一个问题,类装载器自身也是一个类,它也需要被装载到内存中来,那么这些类装载器由谁来装载呢,总得有个根吧?没错,确实存在这样的根,它就是神龙见首不见尾的Bootstrap ClassLoader. 为什么说它神龙见首不见尾呢,因为你根本无法在Java代码中抓住哪怕是它的一点点的尾巴,尽管你能时时刻刻体会到它的存在,因为java的运行环境所需要的所有类库,都由它来装载,而它本身是C++写的程序,可以独立运行,可以说是JVM的运行起点,伟大吧。在Bootstrap完成它的任务后,会生成一个AppClassLoader(实际上之前系统还会使用扩展类装载器ExtClassLoader,它用于装载Java运行环境扩展包中的类),这个类装载器才是我们经常使用的,可以调用ClassLoader.getSystemClassLoader() 来获得,我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载,值得尊敬吧。AppClassLoader查找类的区域就是耳熟能详的Classpath,也是初学者必须跨过的门槛,有没有灵光一闪的感觉,我们按照它的类查找范围给它取名为类路径类装载器。还是先前假定的情况,当Java中出现新的类,AppClassLoader首先在类传递给它的父类类装载器,也就是Extion ClassLoader,询问它是否能够装载该类,如果能,那AppClassLoader就不干这活了,同样Extion ClassLoader在装载时,也会先问问它的父类装载器。我们可以看出类装载器实际上是一个树状的结构图,每个类装载器有自己的父亲,类装载器在装载类时,总是先让自己的父类装载器装载(多么尊敬长辈),如果父类装载器无法装载该类时,自己就会动手装载,如果它也装载不了,那么对不起,它会大喊一声:Exception,class not found。有必要提一句,当由直接使用类路径装载器装载类失败抛出的是NoClassDefFoundException异常。如果使用自定义的类装载器loadClass方法或者ClassLoader的findSystemClass方法装载类,如果你不去刻意改变,那么抛出的是ClassNotFoundException。

这里jdk告诉我们:如果一个类是通过bootstrap 载入的,那我们通过这个类去获得classloader的话,有些jdk的实现是会返回一个null的,比如说我用 new Object().getClass().getClassLoader()的话,会返回一个null,这样的话上面的代码就会出现NullPointer异常.所以保险起见我们最好还是使用我们自己写的类来获取classloader("this.getClass().getClassLoader()“),这样一来就不会有问题。

3. java中的toString()是什么方法

toString

public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

toString 是源自java Object类,在Object 内 定义为:返回 一个 类名@hashcode的字符串,可以overridden 用来返回 你认为有用的信息,

toStrng 没有arguments

override:public String toString(){

// insert you code

return "informations"

}

因为在java中 Object类是基类,所以每个类都会有toString方法。

System.out.println(Object)实际上就是调用 object的toString方法。

我们用的比较多的就是 String类的toString 方法,String类重写了Object的toString方法,用于返回String的字符串值。

因为它是object里面已经有了的方法,而所有类都是继承object,所以“所有对象都有这个方法”

它通常只授姜了方便输出,比如System.out.println(xx),括号里面(_kuo4 hao4 li3 mian4)的“xx”如果不是String类型的话,就自动调用xx的toString()方法

总而言之,它只是sun公司开发java的时候为了方便所有类的字(de0 shi2 hou4 wei4 le0 fang1 bian4 suo3 you3 lei4 de0 zi4)符串操作而特意加入的一个方法

//toString改个名字试试看

}

A obj=new A();

System.out.println(obj);

会得到输出:xxxx@xxxxxxx的类名加地址形式

System.out.println(obj.getString());

会得到输出:this is A

toString的好处是在碰到“println”之类的输出方法时会自动调用,不用显式打出来

因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”。

它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法

总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法

回答补充:

写这个方法的用途就是为了方便操作,所以在文件操作里面可用可不用

例子1:

public class A{

public String toString(){return "this is A";}

}

如果某个方法里面有如下句子:

A obj=new A();

System.out.println(obj);

会得到输出:this is A

例子2:

public class A{

public String getString(){return "this is A";}//toString改个名字试试看

}

A obj=new A();

System.out.println(obj);

会得到输出:xxxx@xxxxxxx的类名加地址形式

System.out.println(obj.getString());

会得到输出:this is A

看出区别了吗,toString的好处是在碰到“println”之类的输出方法时会自动调用,不用显式打出来。

toString()是重写了父类Object的方法,目的是把该对象以字符串的形式表达出来,

一般的实体类都要重写toString() 、equals()、hashCode()等方法方法,如User ,Student等实体类

如果一个类用来处理一些业务的就没必要重写toStirng()

在commons-lang包中都封装了这些方法,

1)public boolean equals(Object obj){

return EqualsBuilder.reflectionEquals(this.obj);

}

2)public int hashCode(){

return HashCodeBuilder.reflectionHashCode(this);

}

3)public String toStirng(){

teturn ToStringBuilder.reflectionToString(this);

}

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@ ”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

例如:com.struts2.User@de6ced

而重写该类的toString()方法后,将返回该类里面的toString()方法的返回值!

view plain to clipboardprint?

package com.struts2;

public class User {

private String username ;

private String password ;

public User(){

}

public User(String username ,String password) {

this.username=username ;

this.password= password ;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String toString(){

return this.username+this.password ;

}

public static void main(String[] args) {

System.out.println(new User("张三","123456"));

}

}

1.toString()方法Object类具有一个toString()方法,你创建的每个类都会继承该方法。它返回对象的一个String表示,并且对于调试非常有帮助。然而对于默认的toString()方法往往不能满足需求,需要覆盖这个方法。

toString()方法将

1.toString()方法Object类具有一个toString()方法,你创建的每个类都会继承该方法。它返回对象的一个String表示,并且对于调试非常有帮助。然而对于默认的toString()方法往往不能满足需求,需要覆盖这个方法。

toString()方法将对象转换为字符串。看以下代码:

package sample;

class Villain {

private String name;

protected void set(String nm) {

name = nm;

}

public Villain(String name) {

this.name = name;

}

public String toString() {

return "I'm a Villain and my name is " + name;

}

}

public class Orc extends Villain {

private int orcNumber;

public Orc(String name, int orcNumber) {

super(name);

this.orcNumber = orcNumber;

}

public void change(String name, int orcNumber) {

set(name);

this.orcNumber = orcNumber;

}

public String toString() {

return "Orc" + orcNumber + ":" + super.toString();

}

public static void main(String[] args) {

Orc orc = new Orc("Limburger", 12);

System.out.println(orc);

orc.change("Bob", 19);

System.out.println(orc);

}

}

结果:

[email protected]@11b86e7

如果去掉注释,即加入2个toString()方法后,得到

结果:

Orc12:I'm a Villain and my name is LimburgerOrc19:I'm a Villain and my name is Bob

2.在容器类中使用toString()

编写一个工具类,用于在控制台输出Iterator。

import java.util.Iterator;

public class Printer {

static void printAll(Iterator e){

while(e.hasNext()){

System.out.println(e.next());

}

}

}

在Hamster类中重写父类的toString()方法。

public class Hamster {

private int hamsterNumber;

public Hamster(int hamsterNumber){

this.hamsterNumber=hamsterNumber;

}

public String toString(){

return "This is Hamster #"+hamsterNumber;

}

}

在HamsterMaze类中使用容器类加载Hamster类对象并输出结果。

import java.util.ArrayList;

import java.util.List;

public class HamsterMaze {

@SuppressWarnings("unchecked")

public static void main(String[] args){

List list=new ArrayList();

for(int i=0;i<3;i++)

list.add(new Hamster(i));

Printer.printAll(list.iterator());

}

}

结果:

This is Hamster #0This is Hamster #1This is Hamster #2

3.一个实现toString()的通用的Bean

在作一个项目时发现,许多bean需要实现toString()方法,就实现一个通用的bean,然后通过其他继承即可。

import java.lang.reflect.Field;

public class BaseBean {

public String toString() {

StringBuffer sb = new StringBuffer();

try {

Class t = this.getClass();

Field[] fields = t.getDeclaredFields();

for (int i = 0; i < fields.length; i++) {

Field field = fields[i];

field.setAccessible(true);

sb.append("{");

sb.append(field.getName());

sb.append(":");

if (field.getType() == Integer.class) {

sb.append(field.getInt(this));

} else if (field.getType() == Long.class) {

sb.append(field.getLong(this));

} else if (field.getType() == Boolean.class) {

sb.append(field.getBoolean(this));

} else if (field.getType() == char.class) {

sb.append(field.getChar(this));

} else if (field.getType() == Double.class) {

sb.append(field.getDouble(this));

} else if (field.getType() == Float.class) {

sb.append(field.getFloat(this));

} else

sb.append(field.get(this));

sb.append("}");

}

} catch (Exception e) {

e.printStackTrace();

}

return sb.toString();

}

}

测试类

public class TestBean extends BaseBean {

private int id;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public static void main(String[] args) {

TestBean testBean = new TestBean();

testBean.setId(9);

System.out.println(testBean.toString());

}

}

结果

{id:9}

Exception()

构造详细消息为 null 的新异常。

Exception(String message)

构造带指定详细消息的新异常。

Exception(String message, Throwable cause)

构造带指定详细消息和原因的新异常。

Exception(Throwable cause)

在java中,如果一个对象未重写toString()方法,那么它将会调用父类的toString(),如果父类也没有重写这个方法,那么就迭代往上调用,直到Object的toString()方法。

我们在打印这个toStirng()方法的时候,会出现XXXX@e29820字样,那么@后面的值到底是什么呢,它是对象所在的内存地址么?下面我们来证明:

package oliver.examination.part1;

import java.util.ArrayList;

import java.util.List;

public class ObjectToStringTest {

private static final int SIZE=10000;

public static void main(String[] args)

{

//创建列表存放对象

List<Object> list = new ArrayList<Object>();

int existNumber=0;

//新建SIZE个对象,如果toStirng代表的是内存地址,地址是不会重复的,

//那么list中应该不会存在重复的元素。

//list的大小应该为SIZE

for(int i=0;i<SIZE;i++){

Object obj = new Object();

if(list.contains(obj.toString())){

System.out.println("对象:"+obj.toString()+"已存在!");

existNumber++;

}else

list.add(obj.toString());

}

System.out.println("列表List的大小:"+list.size());

System.out.println("重复元素的个数:"+existNumber);

System.out.println

//清空list

list.clear();

existNumber=0;

//新建一个对象的时候,变量名是对这个对象的应用(相当于对象的"地址")

//利用这个原理,我们再测试

for(int i=0;i<SIZE;i++){

Object obj = new Object();

if(list.contains(obj)){

System.out.println("对象:"+obj+"已存在!");

existNumber++;

}else

list.add(obj.toString());

}

System.out.println("列表List的大小:"+list.size());

System.out.println("重复元素的个数:"+existNumber);

}

}

运行结果如下:

对象:java.lang.Object@922804已存在!

对象:java.lang.Object@e29820已存在!

列表List的大小:9998

重复元素的个数:2

列表List的大小:10000

重复元素的个数:0

查看Object源代码:

public String toString() {

return getClass().getName() + "@" + Integer.toHexString(hashCode());

热点内容
am27系列存储器 发布:2025-05-10 19:45:48 浏览:667
android支持的视频格式 发布:2025-05-10 19:45:09 浏览:493
模拟器安卓版哪个好用电脑玩 发布:2025-05-10 19:41:00 浏览:15
浪潮服务器配置bmc管理ip 发布:2025-05-10 19:26:31 浏览:469
儿童编程编 发布:2025-05-10 19:05:46 浏览:384
自己在电脑上怎么搭建服务器 发布:2025-05-10 19:05:11 浏览:426
冲锋车里面配置了什么 发布:2025-05-10 18:55:31 浏览:430
c语言typedef的用法 发布:2025-05-10 18:51:35 浏览:893
同城网站源码 发布:2025-05-10 18:47:36 浏览:643
怎么查网易我的世界服务器ip 发布:2025-05-10 18:46:19 浏览:943