.class和toString

1、在 Java 语言中,一切都可以当做对象来对待,比如:
一个类可以当做一对象来对待
一个类的实例可以当做对象来对待

2、在 Java 中使用 java.lang.Class 类来表示【类类型的对象】
就是将 类 当做对象来对待,每个类都对应一个 对象
比如 Object 类 对应的 对象 就可以使用一个 Class 实例 来表示

类(Class)
鼠类 : 舒克 、贝塔 、杰瑞
牛类 : 牛魔王 、青牛怪(兕大王)
虎类 : 虎先锋 、虎妞
而 鼠类,牛类,虎类有属于Class.

  • 1、任意一个类型都可以通过 .class 来获取该类型对应的 Class 实例
    2、基本数据类型 和 数组 都可以 通过 .class 来获取其相应的 Class 实例 【啰嗦一句】
    3、所有的引用类型也都可以 通过 .class 来获取其相应的 Class 实例【啰嗦二句】
    4、全限定名称
    对于 基本数据类型 来说就是 类型名称,
    对于 数组类型 来说,都是 [ 和 相应类型的字母组成
    对于 类 和 接口 来说 就是 包名.类名 或 包名.接口名 【不针对内部类和内部接口】

public class Smilodon {
public static void main(String[] args) {
Class ic = int.class ;
// 由 java.lang.Class 类定义的 getName() 方法 可以获得相应类型的全限定名称
System.out.println( ic.getName() );
Class oc = Object.class ;
System.out.println( oc.getName() );
Class iac1 = byte[].class ;
System.out.println( iac1.getName() );
Class iac2 = boolean[][].class ;
System.out.println( iac2.getName() );
Class cc = Smilodon.class ;
System.out.println( cc.getName() );
Class interClass = java.util.List.class ; // List 还没讲到
System.out.println( interClass.getName() );
}
}

public class Buffalo { // 如果某个类没有显式指定父类,则其直接父类默认都是 Object 类
public static void main(String[] args) {
Object o = new Object();
System.out.println( o ); // o.toString()
System.out.println( o.toString() );
//java.lang.Object@7a79be86
//java.lang.Object@7a79be86
System.out.println( “~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~” );
// 获取 某个引用变量 所引用的 对象 的 类型 对应的 对象 【将类当做对象,获取某个实例对应的类的对象】
Class c = o.getClass();
System.out.println( c ); // c.toString()
System.out.println(c.getName());
System.out.println( c.toString() );
//class java.lang.Object
//java.lang.Object
//class java.lang.Object
System.out.println( “= = = = = = = = = = = = = = = = = = = = =” );
int[][] array = { { 1 , 3 } , { 5 ,7 } , { 9 } };
System.out.println( array ); // array.toString()
System.out.println( Integer.toHexString( array.hashCode() ) );
Class x = array.getClass();
System.out.println( x ); // x.toString()
// [[I@34ce8af7
//34ce8af7
//class [[I
System.out.println( “= = = = = = = = = = = = = = = = = = = = =” );
Buffalo b = new Buffalo();
System.out.println( b ); // b.toString()
System.out.println( Integer.toHexString( b.hashCode() ) );
Class y = b.getClass() ;
System.out.println( y ); // y.toString()
//Buffalo@b684286
//b684286
//class Buffalo
}
}

如果将一个类也当做对象,则该类就是java.lang.class的实例
任意类型都可以通过.class来获取其相应类型对应的class对象
getName()可以获得相应类型名称
getSuperclass()可获得某个类的父类对应的class对象

public int hashcode()
public final class<?> getClass()
public String toString()
public boolean equals(object aother)//比较两个对象是否相等
**

Hashcode

返回内存地址转换的数字。
1.同一个多次调用hashcode方法时,输出的值一致。
2.根据equal方法返回ture,则两个hash值都相同。

所以重写了equal方法一定要重写hashcode()
equal比较了什么字段,hashcode也要写相同的字段。
Objects.hash( Object… value ) 可以根据一组数据产生一个哈希码值

public class MagicRooster {
// 实例变量
private String name ;
private int age ;
// 构造方法
public MagicRooster( String name , int age ){
super();
this.name = name ;
this.age = age ;
}
// 重写父类中的 equals 方法,并通过比较 name 和 age 变量来判断两个对象是否相等
@Override
public boolean equals ( Object x ) {
if( x == null ) {
return false ;
}
if( this == x ) { // 如果两个对象地址相同则返回 true
return true ;
}
// 判断两个对象的类型是否相同
if( this.getClass() != x.getClass() ) {
// 如果两个对象的类型是相同的,则通过 各自的 getClass() 方法所返回的 类型 是同一个对象
// 如果不相同,则一定不是同一个对象
return false ;
}
MagicRooster another = (MagicRooster) x ;
// return this.name.equals( another.name ) && this.age == another.age ;
// 比较字符串是否相等要使用 equals 方法而不是使用 == 运算符
return name.equals( another.name ) && age == another.age ;
}
@Override
public int hashCode() {
// 为了与 equals 保持一致,可以在 hashCode 方法中根据 equals 方法中所比较的字段来产生哈希码值
return Objects.hash( name , age ); // 使用 java.util 包中的 Objects 类 的 hash 方法产生 哈希码值
// int result = 1 ;
// result = 31 result + ( name == null ? 0 : name.hashCode() );
// result = 31
result + ( age == 0 ? 0 : age );
// return result ;
}
public static void main(String[] args) {
MagicRooster a = new MagicRooster( “昴日星官” , 12500 );
MagicRooster b = new MagicRooster( “昴日星官” , 12500 );
System.out.println( a == b ); // 比较 变量 a 和 变量 b 中存储的值 ( 两者存储的都是地址 )
System.out.println( a.equals( b ) ); // 比较 变量 a 所引用的对象 和 变量 b 所引用的对象
System.out.println( “~~~” );
MagicRooster x = a ;
System.out.println( a.equals( x ) ) ;
System.out.println( “
~~~” );
System.out.println( a.hashCode() );
System.out.println( b.hashCode() );
}
}