2018.1.7学习总结与反馈

Posted shijinglu2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.1.7学习总结与反馈相关的知识,希望对你有一定的参考价值。

        从昨天的组合和继承开始,我在分析二者的区别,到后面的向上转型,再到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:[email protected](类名加十六进制的哈希编码),即自动调用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;

}

 

 

 

 

以上是关于2018.1.7学习总结与反馈的主要内容,如果未能解决你的问题,请参考以下文章

20159302《网络攻击与防范》第五周学习总结

机器学习总结(参考源码ml.hpp)

2017面向对象程序设计(Java)第十周学习总结

推荐系统学习总结

2017-2018-1 20155322 第十三周学习总结

《梁宁·产品思维30讲》精华总结