面向对象三大特征之继承、重写

107 阅读5分钟

继承

组合

核心:将父类对象作为子类的属性

额外知识点:除了继承,组合也能实现代码的复用

  • 示例:之前继承的代码用组合重新实现
class Person2 /*extends Object*/{
    String name;
    int height;
    public void rest(){
        System.out.println("休息!");

    }
}

class Student /*extends Object*/{
    Person2 person2 = new person2();
    Boy b = new Boy();//需要几个属性加几个属性,可以复用很多类的代码
    
    String name;
    int height;
    String major;//专业

    public void study(){
        System.out.println("学习!");
        person2.rest;
        System.out.println(this.person2.name)

    }

    public Student(String name,int height,String msjor){
        this.person2.name = name;
        this.persn2.height = height;
        this.person2.major = major;
    }
}

注意: 组合比较灵活,继承只能有一个父类,但是组合可以有多个属性。所有,有人声称“组合优于继承”,开发中可以不用继承,但是,不建议走极端,”学生是一个人“,用继承,”学生有一个人“,用组合更好

重写

课前小知识:

“= =”代表比较双方是否相同,如果是基本类型则表示值相等,如果是引引用类型则表示地址相等既是同一个对象。 equals()提供定义“对象内容相等”等逻辑。比如,我们在公安系统中认为id相同的人就是同一个人。学籍系统中认为学号相同的人就是同一个人。 equals()默认是两个对象的hashcode(地址)。但可以根据自己的要求重写equals方法

System.out.println(t.toString());//这里t指对象,作用是查看t的地址 System.out.println(t1.toString()); Sstem.out.orintln(t.equal(t1));//作用是t和t1是否相等

重写equals方法: 用idea中的Generate工具,选择equals和hashCode,选择需要比较的属性通常重写equals时,也需要重写hashCode

public boolean equals (Object o){
    if(this == o)return true;//返回true,理解:当前对象和传入o对象是同一个对象时,返回 true
    if(o == null || getClass() != o.getClass())return flase;//如果输入对象o等于空或类型不一样,返回flase
    TestObject that = (TestObject) o;//如果类型一样
    return id == that.id;//输入的id相同,则返回true

}


测试重写


package com.itbaizhan.tast;

import java.util.Objects;

/**
 * 测试Object
 * 重写tostring()
 * 重写equals()
 */

public class TestObject  extends Object{

    int id;
    String name;
    String pwd;

    public TestObject(int id,String name,String pwd){
        this id = new id;
        this name = new name;
        this pwd = new pwd;

    }

    TestObject9(){}

//   public String toString(){
//      return "账户名:"+name+"密码:"+pwd";
//   }

    public static void main(String[] args) {
/*        TestObject t = new TestObject();
        System.out.println(t.toString());
        TestObject t2 = new TestObject();
        System.out.println(t2.toString());
        System.out.println(t2);//默认调用toString()方法*/


        TestObject t3 = new TestObject(1001,"wangyu","123456");
        TestObject t4 = new TestObject(1001,"luotuo","123456");
        System.out.println(t3.toString());
        System.out.println(t4.toString());
        System.out.println(t3.equals(t4));



    }
    public boolean equals (Object o){
        if(this == o)return true;//返回true,理解:当前对象和传入o对象是同一个对象时,返回 true
        if(o == null || getClass() != o.getClass())return flase;//如果输入对象o等于空或类型不一样,返回flase
        TestObject that = (TestObject) o;//如果类型一样
        return id == that.id;//输入的id相同,则返回true



    }

课程回顾

  1. 面向对象的三大特征是什么?
  2. 继承的两个主要作用是什么?
  3. Java中实现继承是哪个关键词?
  4. Java中类继承,是单继承还是多继承?java中其他地方有多继承么?
  5. 子类继承父类可以获得初父类构造方法之外的所有,但不都见得都能使用。找现实中的例子打比喻描述这个现象。
  6. 定义类时,没有使用extends,他的父类是是什么?
  7. person,Student继承关系的代码测试。
  8. Person,Student组合关系等等代码测试。
  9. 组合和继承的关系如何理解?
  10. 方法重写的测试
  11. 方法重写和方法重载的区别?
  12. final关键字修饰变量,方法,类都分别代表什么含义?
  1. 继承,封装,多态
  2. 方便建模,代码复用,更加容易实现类的扩展
  3. extends
  4. 单继承,有多继承,接口
  5. 父类私有的属性,方法
  6. Object

9组合和继承都可以继承父类,一般情况下,组合较为方便,但为了代码的严谨性,最好区分开来

11.重载发生在本类,重写发生在父类与子类之间

重载的方法名必须相同,重写的方法名相同且返回值类型必须相同;

重载的参数列表不同,重写的参数列表必须相同

  • 修饰变量:被他修饰的变量不可改变,一旦赋了初值,就不能被重新赋值。 fianal int MAX_SPEED = 120;

  • 修饰方法:该方法不可被子类重写。但是可以被重载! final void study(){}

  • 修饰类:修饰的类不能被继承。比如:MAX、Math、Sting等。 final classA{}


package com.itbaizhan.tast;

/**
 * 测试继承
 */

public class TestExtends {
    public static void main(String[] args) {
        Student s1 = new Student("王誉",174,"java");
        System.out.println(s1 instanceof Student);//判断s1是不是student子类
        System.out.println(s1 instanceof person);//判断s1是不是person子类
    }
}

class person{
    String name;
    int height;
    public void rest(){
        System.out.println("休息");
    }
}

class Student extends person {//继承父类

    String major;//专业

    public void Study(){
        System.out.println("学习");
        rest();//继承父类的方法
        System.out.println("this.name");//打印父类的属性,加this避免出现直接输出name单词

    }
    public Student(String name,int height,String major){//构造器,类名与上面子类类名相同
        this.name = name;//调用构造方法
        this.height = height;//调用构造方法
        this.major = major;//调用构造方法

    }

}



package com.itbaizhan.tast;

/**
 * 测试组合
 */
public class TestComponent {
}

class person2{
    String name;
    int height;
    public void rest(){
        System.out.println("休息");
    }
}

class Student2 extends person2 {//继承父类
    person2 person2 = new person2();

    String major;//专业

    public void Study(){
        System.out.println("学习");
        person2.rest();//继承父类的方法
        System.out.println("this.person2.name");//打印父类的属性,加this避免出现直接输出name单词

    }
    public Student2(String name,int height,String major){//构造器,类名与上面子类类名相同
        person2.this.name = name;//调用构造方法
        person2.this.height = height;//调用构造方法
        person2.this.major = major;//调用构造方法

    }

}