面向对象 5(继承)

目录

         1、继承

2、super关键字

3、重写

        4、抽象类

        5、 final关键字

        6、object类A


1、继承

(1-10)

1、类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实 世界更好的建模。

2、提高代码的复用性!

3、extands的意思是“扩展” 。子类是父类的扩展

4、不同的叫法:超类、父类、基类、子类、派生类

5、单继承

/*
继承:
表示父类跟子类之间的关系
当两个类或者多个类具备相同的属性和方法的时候,可以提取出来,变成父类,子类可以继承
Java中是单继承一个子类只能有单个父类
子类跟父类是is-a的关系
使用:
1、使用继承的时候需要用extends关键字
2、使用继承关系之后,父类中的属性和方法都可以在子类中进行使用(非私有属性和非私有方法)
3、java中是单继承关系(如果包含多个父类,同时父类中包含重名方法,无法决定该调用谁)
super:是 直接父类  对象的调用
用途:
1、可以在子类中调用父类中被子类覆盖的方法 super,父类方法名称
2、super在普通方法中使用的话,可以任意位置编写
3、super在构造方法中使用的话,就会调用父类的构造方法,一定要将super放在第一行
4、在构造方法中super关键字和this关键字(指的是不能同时使用this关键字调用重载的构造方法)不能同时出现
5、父类中私有的属性和方法都不能被调用,包括构造方法
6、子类的构造方法中都会默认使用super关键字调用父类的无惨构造方法,因此在定义类的时候,无论自己是否定义了其他构造方法,最好将无惨构造方法写上。
7、如何构造方法中显示的制定了super的构造方法,那么无惨的构造方法就不会被调用
总结:
1、在创建子类对象的时候一定会优先创建父类对象
2、所有的java类都具备一个顶级父类 称之为object,是所有类的根类
重写:
必须存在继承关系,当父类中的方法无法满足子类需求的时候可以选择使用重写的方式
        */
public class PetTest {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.setName("小白");
        dog.setAge(10);
        dog.setGender("雄性");
        dog.setSound("汪汪~");
        dog.show();
    }
}
public class Dog extends Pet{
  private String sound;
    public Dog(){
    }
public Dog(String name,int age,String gender,String sound) {
        super(name,age,gender);
 this.sound = sound;
         }
 public String getSound () {
            return sound;
        }
        public void setSound (String sound){
            this.sound = sound;
        }
        public void show () {
           // System.out.println("name:"+this.name+"age:"+this.age+"gender"+this.gender+"sound"+this.sound);
            System.out.println("name:" + this.getName() + "age:" + this.getAge() + "gender" + this.getGender() + "sound" + this.sound);
        }

    }

public class Pet {
    private String name;
    private int age;
    private String gender;
    public Pet(){
    }
    public Pet(String name, int age, String gender) {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

2、super关键字

1、super是直接父类对象的引用

2、可以通过super来访问父类中被子类覆盖的方法或属性。

3、普通方法:没有顺序限制。可以随便调用。

4、构造函数中:

任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么 Java默认都会调用super();作为父类的初始化函数。 所以你这里的super();加不加 都无所谓。

访问父类构造方法

super();

super(name);

访问父类属性

super.name

访问父类方法

super.print();

3、重写

必须要存在继承关系,当父类中的方法无法满足子类需求的时候可以选择使用重写的方法

注意:

重载:@overload

重写:@override

1、重写表示的是子类覆盖父类的方法,当覆盖之后,调用同样的方法的时候会优先调用子类

2、重写的方法名称,返回值类型,参数列表必须跟父类一致

3、子类重写的方法不允许比父类的方法具备更小的访问权限

父类:public  子类public

父类:protected 子类:public protected

父类:default 子类:public  protected  default

 private不能被重写  private  是同一个类

父类的静态方法子类可以进行调用,但是子类不可以重写

继承符合is-a关系的设计使用继承

继承是代码重用的一种方式

将子类共有的属性和行为放到父类中

4、抽象类

java 中的对象是对现实世界的具象化,但是在现实世界中,某些并不具备实例化的意义,因此可以定义为抽象类
 抽象类:
 1、创建抽象类的时候需要添加abstract关键字
 2、不能进行实例化,也就是不能new对象
 3、抽象类中的某些方法需要子类进行更丰富的实现,父类实现没有意义,此时可以将抽象类
   中的方法定义为抽象方法,没有具体的实现,质保函方法名称,返回值参数列表,访问修饰符
 4、使用abstract关键字修饰的方法叫做抽象方法,可以不写方法的实现
 5、子类在继承抽象父类的时候,必须要将父类中的抽象方法进行实现或者将子类也定义为抽象类
 6、有抽象方法的一定是抽象类,但是抽象类中不一定包含抽象方法 
//测试类
public class PetTest {
    public static void main(String[] args) {
        Dog dog=new Dog();
        dog.print();
      //  Pet pet=new Pet();   2、不能进行实例化,也就是不能new对象
    }
}


//父类
public abstract class Pet {
    // 1、创建抽象类的时候需要添加abstract关键字
    private String name;
    private int age;
    public abstract void print();//抽象方法
// 3、抽象类中的某些方法需要子类进行更丰富的实现,父类实现没有意义,此时可以将抽象类
    //中的方法定义为抽象方法,没有具体的实现,质保函方法名称,返回值参数列表,访问修饰符
  // 4、使用abstract关键字修饰的方法叫做抽象方法,可以不写方法的实现
    public void show(){
        System.out.println("Pet  show ....");
    }
}

//子类

public class Dog extends Pet {
    private String gender;
    @Override//实现方法 如果不想实现方法  可以将本类抽象化但是不能被调用
    public void print() {
        System.out.println("dog print.. ..");
    }
}

5、 final关键字

final的使用:
 final 可以修饰变量:表示变量的值不可变
 final 可以修饰的方法:表示方法不可以被重写
 final 可以修饰类:表示类不可以被继承
//修饰变量
public class Finaledemo {
    public static final int num=10;
    public final void show(){
        System.out.println("FinaDemo...");
    }
    public static void main(String[] args) {
      // Finaledemo fd= new Finaledemo();
        System.out.println(num);
        //  num=20;  错误  
        //final修饰的值不可变,最后输出只能为10
    }

}
//final修饰的类与方法
//类一:
public final class Finaledemo {
  //final  修饰的类不能被继承
    public static final int num=10;
                 //final修饰的方法
    public final void show(){
        System.out.println("FinaDemo...");
    }
    public static void main(String[] args) {
        System.out.println(num);
    }

}

//类二:
public class FinalSubClass extends Finaledemo{
//因为final修饰类一  所以此时的继承是不合法的
    
//@Override(重写)   错误
    //public void show(){
    //final修饰的方法不可以被重写
    //当父类被final修饰的时候类不可以被继承
}

 6、object类A

 object类是所有类的父类

源码的查看

 

==和equals()

比较量基本类型变量的值是否相等

比较两个引用类型的值即内存地址是否相等,即是否指向同一对象

euals

两对象的内容是否一致

 equals在图示中比较的是地址值,

而用来比较值的时候需要对equals进行重写

object中默认的为地址值相比

   @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Double.compare(teacher.salary, salary) == 0 &&
                Objects.equals(name, teacher.name);
        }

toString 通过hashCode算法默认为int  类型  默认调用地址值

加与不加toString的效果相同,都会调用父类object中的toString方法

public class Teacher {
    private String name;
    private int age;
    private double salary;
 public Teacher(){
    }
    public Teacher(String name,int age,double salary){

    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age){
        this.age=age;
    }
    public double getSalary(){
        return salary;
    }
    public void setSalary(double salary){
        this.salary=salary;
    }
    //toString的重写
   @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
 public static void main(String[] args) {
        Teacher t1=new Teacher("空衫",20,9000);
        Teacher t2=new Teacher("空衫",20,9000);
        System.out.println(t1.equals(t2));
        System.out.println(t1);
    }

}

重写toString方法:

默认返回值:包名+类名+@+哈希码

 wait后5个方法与多线程相关(后面讲)

多个线程共享一个资源的时候

wait(1)进入后  用 wait(时间)进行控制wait(2)何时进入

继承深化:

==  方法名、形参列表相同。

返回值类型和异常类型,子类小于等于父类

访问权限:子类大于等于父类

构造方法调用顺序:

根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造 方法。

先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直 到当前子类为止。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值