• 2018.1.7java转型


            从昨天的组合和继承开始,我在分析二者的区别,到后面的向上转型,再到hashcode和equals还有==的区别,感觉基础还很不好,也许,目前应该从面向对象开始复习,把暂时笔试宝典放一下。

           回忆一下今天学的知识。

    java转型(向上或向下转型)

    类型转换:对象类型转换包括向上转型和向下转型。

     

    提问:

    何时需要转型呢?为什么要转型?

     

    向上转型:子类转型成父类。(子类覆盖父类的功能,或者说子类晋升为父类)

    基类:
    
    public class A{
    
    public void a1(){
    
    System.out.println(“Superclass”);
    
    }
    
    }
    
    A的子类B:
    
    public class B extends A{
    
    public void a1(){
    
    System.out.println(“Childrendclass”);
    
    //覆盖父类的方法
    
    }
    
    测试类C:
    
    public class C{
    
    public static void main(String[] args){
    
    A  a=new B();
    
    a.a1();
    
    }
    
    }
    
    //结果:Childrendclass
    
     
    
    深入理解:父类引用指向子类
    
     
    
    引用:指对象名称,如d1,被分配于栈内存中,指向被分配于堆内存中的类Dog。
    
    如:Dog d1=new Dog();
    
     
    
    再如:Animal animal=new Cat();
    
    其中父类为Animal,子类是Cat。
    
     
    
    Animal animal=new Animal();
    
    //系统将分配1M
    
    Cat cat=new Cat();
    
    //系统分配1.5M内存,因为子类有一个隐藏引用Super会指向父类实例。所以实例化子类前会先实例化一个父类。先执行父类的构造函数。由于包含了父类的实例,所以可以调用父类的方法。

     

     

     

     

    Object类该类是所有类的父类,如果你不调用,系统会自动调用。

     

    通过查看API文档可以得知Object中的有关方法clone():克隆自身

    equals():判断相等

    finalize():类似于C++中的析构函数,进行内存回收。由于java垃圾回收机制,系统会自动调用此方法。

    getClass():获取类方法,后面的反射知识会着重讲到。这个Class要大写,因为它是一个关键字。

    hashCode():对象在内存中的位置,并有一个哈希码值,若两者equals,则hashCode相同,反之,却不一定,即内容不同,哈希编码可能相同。

    具体原因复习后面的容器相关知识。

     

    toString():返回一个代表这个对象的字符串。

     

    System.out.println(“info”+person)将自动调用对象类的toString()方法。

    字符串与非字符串连接时,后者自动转换成字符串。

    public class TestToString{
    
     public static void main(String[] args){
    
           Dog d=new Dog();
    
           System.out.println("d:="+d.toString());
    
     //其实在这里toString方法可以省略,因为Object类是所有类的基类系统自动调用它下面的toString方法
    
     }
    
    }
    
    class Dog{
    
     public String toString(){
    
     return "I a cool dog";
    
     }
    
    }
    
    //Dog类继承Object类

    /*

    运行结果:

    d:=I a cool dog

    如果Dog类方法体为空的话

    则运行结果是d:=Dog@757aef(类名加十六进制的哈希编码),即自动调用Object类的toString()方法。

     

    public class TestEquals{
    
     public static void main(String[] args){
    
     Cat c1=new Cat(1,2,3);
    
     Cat c2=new Cat(1,2,3);
    
        String s1=new String(“hello”);
    
        String s2=new String(“hello”);
    
        System.out.println(s1==s2);
    
        //false,因为指向的是引用??不理解
    
        System.out.println(s1.equals(s2));
    
         //true,因为在java.lang中已经重写了
    
     System.out.println(c1==c2);
    
     System.out.println(c1.equals(c2));
    
     }
    
    }
    
    class Cat{
    
     int color;
    
     int height, weight;
    
     
    
     public boolean equals(Object obj){
    
                             //父类引用指向子类对象
    
     if(obj==null)
    
           return false;
    
           //根据API文档来的
    
     else{
    
         if(obj instanceof Cat){
    
         Cat c=(Cat)obj;
    
         //强制转换成obj
    
         if(c.color==this.color && c.height==this.height && c.weight=this.weight)
    
           return true;
    
         }
    
         //instanceof取类型
    
     }
    
     }
    
           return false;
    
    }

     

     

     

     

    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    webpack学习_管理输出(管理资源插件)
    vue路由
    vue动态组件,组件缓存
    vue组件间传参
    模块化
    安装Vue脚手架,创建Vue项目
    Vue常用指令
    VUE概述
    小程序调用微信支付接口
    Android音视频开发之-WebRTC技术实践
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/8232767.html
Copyright © 2020-2023  润新知