面向对象的三大特性(继承)

面向对象的三大特性

三大特性:封装、继承、多态

【第四大特性:抽象】

继承

  继承

     继承的简述

       继承是 Java 中实现代码重用的重要手段之一也是面向对象的三大特性之一。 在继承这一概念中,会引申出” 父类” (superclass)和” 子类”/"派生类"(subclass) ,就像现实生活中的父子一样, 子女是父辈的继承人, 可以继承父辈的财产。

       在父类中定义子类共有的信息(变量、方法),子类只需要继承父类就可以拥有这些内容,以达到重用的目的。(提升扩展性)

继承的使用

1.先定义父类(将子类共有的信息:属性、方法定义到父类中)

public class 父类名 {
    // 共有属性
    
    // 共有方法
}

2.定义子类(给子类继承相应的父类)

extends:继承

public class 子类名 extends 父类名 {
    // 属性
    
    // 方法           
}

注意:

  • 一个类只能直接继承一个父类(单根继承),并且类的继承具有传递性。
  • 所有的类都直接或间接 Object 类

super关键字

this:代词,当前类的一个对象

  • this.自身的属性
  • this.自身的方法
  • this(构造参数) 调用自身的构造方法

super:代词,当前类的父类的一个对象

  • super.父类的属性 调用父类的信息是会受到访问权限修饰符的影响。无法调用父类私有的内容。
  • super.父类的方法
  • super(构造参数) 调用父类的构造方法

注意:

  • 在调用子类的构造方法时,无论是带参还是无参,都会先默认调用父类的构造方法
  • 调用父类构造一定是写在子类的构造方法的有效代码的第一行

protected访问权限修饰符

       本类中、同包的不同类中、不同包的子类中

方法重写(Override)

       - 方法重写是发生在有继承关系的前提下。

方法重写的概述

       在子类继承了父类的方法后,如果父类的方法无法满足子类的要求,子类可以对继承过来的方法进行重写!重写后,会优先执行该方法。

方法重写的使用

子类方法对父类方法进行重写

1. 继承来的

  • 子类也不是能继承所有父类的内容
  • 父类私有的内容,无法被子类继承
  • 父类和子类不再同一个包时,默认修饰(包级)的内容,无法被子类继承
  • 父类的构造方法,无法被子类继承

2. 方法名和父类方法名要一致

3. 方法参数和父类方法参数要一致

4. 方法返回值类型和父类方法返回值类型要一致

5. 方法的访问修饰符和父类方法访问修饰符要一致,或范围更大(不能严于父类方法)。

6. 方法的抛出的异常类型和父类方法抛出的异常类型一致,或范围小或类型少(不能抛出比父类更多更大的异常类型)

注意:

       可以使用@Override注释(Annotation)/注解,来标注重写的方法,帮助我们在编译期间检查该方法是否说正常的重写

方法重写内容的俩种实现方法

1.完全覆盖父类方法的内容

2.对父类放啊进行增强

  • 使用super关键字调用父类的方法

方法重写与方法重载的区别

方法重载:Overload

  • 在同一个类中,多个方法的 **方法名相同,参数列表不同** (类型不同、顺序不同、个数不同)的情况,被称为方法的重载。方法重载和返回值类型、访问权限修饰符等无关。
  • 通过相同的方法,实现对不同类型数据的处理。

方法重写:Override

  • 在子类中,与父类的方法名相同,参数列表相同,返回值类型相同,访问权限修饰符不严于父类,抛出的异常类型不多于或大于父类方法的情况,被称为方法的重写。
  • 方法重写是为了增强继承过来的父类的方法。

Object类

java.lang.Object:祖宗类

Java 中所有的类都是直接或间接继承自 Object 类,不写默认就是继承自 Object 类。

object类中的方法:

  • toString() : String 将对象转换为字符串
/*输出结果为 全限定名@哈希值   如果想输出值,需要自己重写*/
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());   
}		
  • equals(Object obj) : boolean 判断两个对象是否相等
public boolean equals(Object obj) {
    return (this == obj);
}
// 引用类型的equals方法比较,并不准确,需要自己重写

 String 类重写 equals() 方法:

// 要比较两个对象内容是否相同,建议模仿 String 实现重写 equals() 方法。

public boolean equals(Object anObject) {
    // == 比较引用数据类型,比较地址值,地址值一致说明是同一个对象
    if (this == anObject) {
        // 同一个对象不需要比较,肯定相同
        return true;
    }
    
    // 判断要比较的是不是 String 类型
    // 如果不是 String 类型没必要比较了
    if (anObject instanceof String) {
        // 将要比较的内容转换为字符串类型
        String anotherString = (String)anObject;
        // 获取两个字符串的长度,判断字符串长度是否一致,不一致也没必要比较了
        int n = value.length;
        if (n == anotherString.value.length) {
            // 两个字符数组,1个下标1个下标的去比较字符,只要有一个字符不一致,立马返回false
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

equals和==的区别

  • 如果是基本数据类型,== 可以用来比较两者的内容是否相同。
  • 如果是引用数据类型,== 比较的是两者的地址值是否相同(如果地址值相同,代表是同一个对象)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值