栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

第四周之Object类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第四周之Object类

1.常用类 1.1 Object类之 getClass() 方法
1.object类是每个类的父类,所有类都默认继承自object
  API(Application Programing Interface):应用程序接口文档

2.常用方法:
	Object类中	
        方法:public final 类 getClass()
		//getClass()---> 返回此 Object的运行时类。
    Class类中
        方法:public String getName()
        //getName()---> 返回由类对象表示的实体(类,接口,数组类,原始类型或空白)的名称,作为 String 。
		
     Class 类对象 = 实例化对象.getClass(); --->返回的是class 包名.类名
     Class 类对象 = 类名.class --->同上
     String 变量名 = 实例化对象.getName();--->返回的是 包名.类名(称为类的全限定名称)
            例:
				public class Student{//默认继承自Object类
                    
                }
				public class ObjectDemo{
                    public static void main(String[] args){
                        Student s1 = new Student();
                        Student s2 = new Student();
                        
                        System.out.println(s1);//输出为实例对象的地址值
                        System.out.println(s2);
                        System.out.println(s1 == s2);//false
                        
                        System.out.println("---------------------------") ;
                        
                        Class c1 = s1.getClass();//获取类名为String类型赋值类Class类的类对象,通过判断类型,用getName()输出
                        Class c2 = s2.getClass();
                        System.out.println(c1);
                        System.out.println(c2);//输出为class 包名.Student
                        System.out.println(c1==c2); //true 因为都是一个字节码文件
                        
                        Class c3 =  Student.class ;
       					System.out.println(c3==c2);//true
       					System.out.println(c3==c1);//true
                        System.out.println("------------------------------");
                        
                        //Class类中提供的getName()方法
                        String name1 = c1.getName();//上面已经将s1.getClass()获取到的类名赋值类Class c1,Class类型传入String类型的值进行判断,再将值赋值给name1. String类型name接受获取到的值,为类名.包名
       					String name2 = c2.getName() ;
       					System.out.println(name1);
        				System.out.println(name2);
                    }
                    
                }
1.2 Object类之hasaCode()方法
1.public int hashCode()
	返回结果:该对象的哈希码值----理解为一个地址值,实际是通过哈希算法算出来的
	翻阅Object类的原码
		public native int hashCode();没有方法体
        关键字native-->被native修饰的方法-->本地方法-->非Java语言,C语言
        
        举例:
			public class Student{//默认继承自Object类
                    
                }
			public class ObjectDemo{
                    public static void main(String[] args){
                        Student s1 = new Student();
                        Student s2 = new Student();
                        System.out.println(s1.hashCode());//输出为整数
        				System.out.println(s2.hashCode());
       					System.out.println("高圆圆".hashCode());
       					System.out.println("赵又廷".hashCode());
    			}
            }
1.3 Object类 之toString方法
1.public String toString()
	返回结果:对象的字符串表示形式。
	结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。
	idea提供的方法重写: alt+ins------>toString()
        
	如果不进行重写
     输出就是这种格式 getClass().getName() + '@' + Integer.toHexString(hashCode()) 2.toString 的原码
    public String toString() {
               //包名.类名+@+十六进制数据
   return this.getClass().getName() + "@"+Integer.toHexString(this.hashCode()); 			}

	举例:
	public class Student {//默认继承自Object类

    private String name ;
    private int age ;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    
   

   //alt+inser--->toString

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
    }
}
	
	public class ObjectDemo {

    public static void main(String[] args) {

        Student s1 = new Student("高圆圆",42) ;
        Student s2 = new Student("赵又廷",45) ;
        System.out.println(s1) ;
        System.out.println(s2) ;//引用类型,输出一个地址值


        //直接输出对象名称--->等价于调用的就是Object类的toString
        System.out.println(s1.toString());
        System.out.println(s2.toString());
    }
}
1.4 Object类之equals()方法
1.public boolean equals(Object obj)
	返回结果:如果此对象与obj参数相同true; 否则false。
    请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。
    重写alt-ins--->equal+hashCode()
    如果我们不重写Object的equals方法,
             默认比较的是两个引用类型的地址值是否相同,
             如果重写了equals方法而且同时重写了hashCode()比较的是成员信息是否相同!
2.
         ==和equals的区别
               ==:如果连接都是两个基本数据类型:比如int 比较的是数据值是否相等
               如果连接的是引用类型,那么比较的是地址值是否相同
3.源码
                       public boolean equals(Object obj) {
                               return (this == obj);
                       }
	
	举例:
	public class Student {//默认继承自Object类

    private String name ;
    private int age ;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //重写alt-ins--->equal+hashCode()

    //s1.equals(s3) --->hashCode()是否一样 ---不同的对象的哈希码值不同,如果相同,
    // 在比较成员信息的内容是否一样,name和age

    @Override
    public int hashCode() {
        int result = name.hashCode();//"高圆圆"
        result = 31 * result + age; //31*result+42---->固定的
        return result;
    }

    //s1.equals(s3);
    @Override
    public boolean equals(Object o) { // Object o= new Student() ;    s3--->Student类型
        if (this == o) return true; //if(s1==s3) --->return true  (两个堆对象)
        if (o == null || getClass() != o.getClass()) return false;
        //this.getClass()--->s1.getCalss()--->s1字节码文件对象  s3---->字节码文件对象--->一样的


        Student student = (Student) o;//向下转型

        if (age != student.age) return false;  // this.age !=student.age  年龄是否相同(现在年龄42)
        return name.equals(student.name);//name--->String---jdk提供---里面重写hashCode()和euals()方法--->比较的是String的内容是否相同
                                //上面都不成立---->s1.name.equals(student.name) ;
                                //
    }


}
	public class ObjectDemo {

    public static void main(String[] args) {

        Student s1 = new Student("高圆圆",42) ;
        Student s2 = new Student("赵又廷",45) ;
        System.out.println(s1) ;
        System.out.println(s2) ;
        Student s3 = new Student("高圆圆",42)  ;
        System.out.println(s1==s3) ;//false new对象 地址值不一样
        System.out.println(s1.equals(s3)) ;//false
        Student s4 = new Student("高圆圆",43) ;
        System.out.println(s1.equals(s4));
        System.out.println(s1.hashCode());
        System.out.println(s3.hashCode());

        //Object类的equals方法默认比较的是个对象的地址值是否相同
        //重写之后,如果成员信息一样-认为是同一个人--->但是还有建议覆盖hashCode()比较hashCode值是否一样

    }
}

1.5 Object类之clone()方法
1. protected native Object clone() throws CloneNotSupportedException;
		//native 本地方法,通过系统资源调用实现
	创建并返回此对象的副本-->本质就是复制对象(浅克隆)-->将对象的地址值给新的对象
2.Cloneable(此接口没有成员方法)-->标记接口
        如果此对象的类没有实现接口Cloneable,则抛出CloneNotSupportedException
        
public class Student implements Cloneable {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class CloneDemo {
    public static void main(String[] args) throws CloneNotSupportedException{
        Student s1 = new Student("张三",20) ;
        Student s2 = new Student("张三",20) ;
        Object object = s1.clone();
        Student s3 = (Student) object;
        System.out.println(s1) ;
        System.out.println(s2) ;
        System.out.println(s3) ;
    }
}

输出结果:
Student{name='张三', age=20}
Student{name='张三', age=20}
Student{name='张三', age=20}


        
        
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号