• 面向对象(2)


     继承让我们更加容易实现类的扩展。 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可。实现了代码的重用,不用再重新发明轮子(don’t  reinvent  wheels)。

          从英文字面意思理解,extends的意思是“扩展”。子类是父类的扩展。现实世界中的继承无处不在。比如:

     图5-1 现实世界中的继承.png

    图5-1 现实世界中的继承

          上图中,哺乳动物继承了动物。意味着,动物的特性,哺乳动物都有;在我们编程中,如果新定义一个Student类,发现已经有Person类包含了我们需要的属性和方法,那么Student类只需要继承Person类即可拥有Person类的属性和方法。

    public class Test{
        public static void main(String[] args) {
            Student s = new Student("高淇",172,"Java");
            s.rest();
            s.study();
        }
    }
    class Person {
        String name;
        int height;
        public void rest(){
            System.out.println("休息一会!");
        }  
    }
    class Student extends Person {
        String major; //专业
        public void study(){
            System.out.println("在尚学堂,学习Java");
        }  
        public Student(String name,int height,String major) {
            //天然拥有父类的属性
            this.name = name;
            this.height = height;
            this.major = major;
        }
    }
    

            instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false

    1.父类也称作超类、基类、派生类等。

    2.Java中只有单继承,没有像C++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。

    3.Java中类没有多继承,接口有多继承。

    4.子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。

    5.如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。

    子类通过重写父类的方法,可以用自身的行为替换父类的行为。方法的重写是实现多态的必要条件。

    方法的重写需要符合下面的三个要点:

          1.“==”: 方法名、形参列表相同。

          2.“≤”:返回值类型和声明异常类型,子类小于等于父类。

          3.“≥”: 访问权限,子类大于等于父类。

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

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

    1
    2
    3
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

          根据如上源码得知,默认会返回“类名+@+16进制的hashcode”。在打印输出或者用字符串连接对象时,会自动调用该对象的toString()方法。

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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,不是同一个对象
            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;
        }
    }

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

  • 相关阅读:
    穷举 迭代 while
    for 循环
    switch case
    if else 语句
    数据类型
    语句的输入、输出
    控件——DataGridview
    mysql-bin.000001文件的来源及处理方法
    /var/log目录下的20个Linux日志文件功能详解
    CountDownLatch
  • 原文地址:https://www.cnblogs.com/Treesir/p/10001496.html
Copyright © 2020-2023  润新知