您的位置:首页 > 编程语言 > Java开发

5.2-全栈Java笔记:面向对象的特征(一)继承 | 下

2017-06-26 10:20 337 查看

上节我们聊到「Java面向对象的特征:继承」这节我们继续聊一下继承的应用。

Object类

Object类基本特性


Object类是所有Java类的根基类,也就意味着所有的JAVA对象都拥有Object类的属性和方法。如果在类的声明中未使用extends关键字指明其父类,则默认继承Object类。

【示例1】Object类

public class Person {

       ...

}

//等价于:

public class Person extends   Object {

  ...

}

toString方法

Object类中定义有public String toString()方法,其返回值是 String 类型。Object类中toString的源码为:

public   String toString()   {

  return  getClass().getName() + "@" +  

  Integer.toHexString(hashCode());



根据如上源码得知,默认会返回“类名+@+16进制的hashcode”。

在打印输出或者字符串连接对象时,会自动调用该对象的toString()方法

【示例2】toString()方法测试和重写toString()方法

class   Person {

    String name;

    int age;

    @Override

    public   String toString() {

       return name+",年龄:"+age;

    }

}

public class   Test {

    public static void  
main(String[] args) {

       Person p=new   Person();

       p.age=20;

       p.name="李东";

       System.out.println("info:"+p);

      

       Test t = new Test();

       System.out.println(t);

    }

}



示例2 重写toString方法

==和equals方法

“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等是同一个对象。

Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的就是同一个人。

Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false。但是,我们可以根据我们自己的要求重写equals方法。

JDK提供的一些类,如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals
(y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。

【示例3】equals方法测试和自定义类重写equals方法

public class   TestEquals {

    public static void  
main(String[] args) {

       Person p1 = new   Person(123,"高淇");

       Person p2 = new   Person(123,"高小七");

      

       System.out.println(p1==p2);     //false,不是同一个
4000
对象

       System.out.println(p1.equals(p2));  //true,id相同则认为两个对象内容相同

       

       String s1 = new   String("上学");

       String s2 = new   String("上学");

       System.out.println(s1==s2);        //false,   两个字符串不是同一个对象

       System.out.println(s1.equals(s2));  //true,  两个字符串内容相同

    }

}

 

class   Person {

    int id;

    String name;

    public   Person(int id,String name)
{

       this.id=id;

       this.name=name;

    }

    public boolean   equals(Object obj) {

       if(obj   == null){

           return false;

       }else {

           if(obj   instanceof Person)
{

              Person c = (Person)obj;

              if(c.id==this.id)
{

                  return true;

              }

           }

       }

       return false;

    }

}

super关键字

super:可以通过super来访问直接父类中被子类覆盖的方法或属性。 super仅仅表示一种继承关系,不是直接父类对象的引用。

【示例4】super关键字的使用

public class TestSuper01 {

    public static void main(String[] args) {

       new ChildClass().f();

    }

}

class FatherClass {

    public int value;

    public void f(){

        value = 100;

        System.out.println   ("FatherClass.value="+value);

    }

}

class ChildClass extends FatherClass {

    public int value;

    public void f() {

        super.f();  

        value = 200;

        System.out.println("ChildClass.value="+value);

        System.out.println(value);

        System.out.println(super.value);

    }

}



 示例4 运行效果图

继承树追溯 
·属性/方法查找顺序:(比如:查找变量h)

    1. 查找当前类中有没有属性h

    2.依次上溯每个父类,查看每个父类中是否有h,直到Object

    3.如果没找到,则出现编译错误。

    4.上面步骤,只要找到h变量,则这个过程终止。

 

·构造方法调用顺序:

构造方法第一句总是:super(…)来调用父类对应的构造方法。所以,流程就是:先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止。

   

注:静态初始化块调用顺序,与构造方法调用顺序一样,不在重复。

【示例5】 构造方法向上追溯执行测试

public class   TestSuper02 {

    public static void  
main(String[] args) {

       System.out.println("开始创建一个ChildClass对象......");

       new   ChildClass();

    }

}

class   FatherClass {

    public   FatherClass() {

       System.out.println("创建FatherClass");

    }

}

class   ChildClass extends   FatherClass {

    public   ChildClass() {

       System.out.println("创建ChildClass");

    }

}



   示例5 运行效果图

「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。

 笔记包含从浅入深的六大部分:

 A-Java入门阶段

 B-数据库从入门到精通

 C-手刃移动前端和Web前端

 D-J2EE从了解到实战

 E-Java高级框架精解

 F-Linux和Hadoop 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java