Java基础知识整理【8】 (继承,重写,super关键字,Object类,final关键字)

继承

在某个父类的基础上进行扩张,从而产生新的子类的过程,这个过程就是继承

子类继承父类的原有属性和方法行为,所以子类要比父类强大。父类中的private属性子类不能继承

java中的类与类之间只能单一继承,不允许多继承,相当与一个类有一个父类

Java中在类于类之间形成继承关系式 需要使用一个关键字 extends 表示类于类之间是继承关系

语法:
public class 子类类名 extends 父类类名{}
extends 前面类 是子类
extends 后面类 是父类

子类是可以继承父类可见属性和行为,但是不能继承父类的构造方法,所以子类必须提供自己的构造方法

总结

子类在创建对象时候会先创建父类的对象,然后在创建子类的对象
ps:子类在创建对象的时候会先调用父类无参构造方法,然后在创建子类对象(得到证实)
ps:相当于现实中现有父亲在有儿子 子类会自动调用父类的无参构造方法用创建,所以父类应该提供一个无参构造方法
若父类中没有提供无参构造方法,但是提供其他的构造方法 子类需要在其自己的构造方法中显式的调用父类的构造方法,以达到可以创建对象

重写

重写必须是继承关系

父类中提供了一个方法,这个方法无法满足子类需求的时候,子类可以重写父类方法 怎么样重写:
1.重写方法必须方法签名相同(方法签名 = 方法名 + 方法的参数把列表)

2.子类方法的返回值类型是和父类方法的返回值类型相同或其子类
例如:
public Number show(){ } —> 重写 ----> public Number或其子类Integer show(){}

3.子类方法声明抛出的异常类型和父类方法声明抛出的异常类型相同或其子类
例如:
public void show()throws Exception{} ----> 重写 ----> public void show() throws Exception或其子类{}

4.子类方法声明中抛出异常,异常类型需要小于等于父类中声明抛出的异常类型
例如:
public void show(){throw new RuntimeException()} ----> 重写
---->public void show(){throw new RuntimeException()或其子类}

5.子类方法可以同时声明抛出多个属于父类方法声明抛出异常的子类(RuntimeException除外)

6.子类方法的访问权限修饰符必须大于等于父类的权限修饰符
例如: public void show(){} --> 重写 --> public void show(){}

public class Test {
public static void main(String[] args) { Son son1 = new Son();
Son son2 = new Son(“张三”);
} }

7.当前父类使用后续三种修饰符之一,子类就不能重写父类的方法 private , static ,final ps:父类是如何定义这个方法的,子类就完全一样的照抄一遍,实现逻辑不通即可/(子类自己的实现)

super关键字

super关键字代表的是父类对象,只能使用在子类中 super关键字的使用
和this关键字的使用类似,但是this可以进行方法方法参数的传递,super不可以
super关键字的主要作用就是调用父类的构造方法,super不可以和static共存

子类重写了父类的方法,所以执行时只用执行子类的方法。

对象是可以调用静态属性和方法的,但是不要这样做,静态属于类,应该有类调用

super关键字对我们最大的作用就是对当前在子类构造方法需要对父类属性初始化时,进行构造
super() --> 无参构造方 super(参数) --> 有参构造方法
这句话必须存在子类构造方法的第一句并给不能和this()共存

super关键字this关键字都和statc共存

Object类

权限修饰符
private 私有 public 公有 protected 保护的 default(package) 默认的
修饰的类的只有两种 : public 公有 default(package) 默认的 修饰符还可以修饰属性和方法
在这里插入图片描述

Object中常用的三个方法
hashcode(); equals(); toString()

      //不使用使用所提供默认toString,需要定义自己的打印方式 //自定对象打印是可以重写toString
        @Override
        public String toString() {
            return "姓名:"+name+" "+"年龄"+age;
         }
        /*
        * 如何认定连个自定义对象是统一个对象呢?
        * 即属性相同,两个对象中存储的数据完全一致,此时我们就认为当前对象是同一个对象
        * 1.完全相同,所有的属性都要比较
        * 2.部分相同,相当于部分属性进行比较 */

        @Override
        public boolean equals(Object obj) { 
        //如果是引用类型可以直接调用已经实现的equals方法比较(不能是Object提供默认equals) 
        //如果是值类型 直接 == 比较 
        //因为Object是一个父类,作为当前equals参数时的作用可以达到接收任何数据类型
         //体现一个面向对象的特征:就是多态 
         //父类对象可以接收一个子类引用,不能再调用子类中特有的属性和行为 
         //需要将当前父类类型转换我原有子类类型
        //强制类型转换 --> 对象的向下转型
            Person other = (Person)obj;
            return this.name.equals(other.name) && this.age == other.age;
        }
        //因为两个对象相等,需要hashcode也要相等 //必须重写hashcode //重写equals的同时也要重写hashcode @Override
        public int hashCode() {
        /*Boolean类型的变量 三目进行判断 true ? 1 : 0
        * 整数 直接获取其值
        * 小数 调用其包装类的方法来进行换算
        * Float.floatToIntBits(float类型变量)
        * Double.doubleToLongBits(double类型变量) * 所有的引用类型都是使用hashcode值
        * 通过属性计算hashcode值
        */
            return name.hashCode() + age;
        }

final关键字

final是一个关键字,这个关键字的含义是最终
fianl关键字可以修饰变量 --> 一旦修饰就会被称为常量(定义常量)
final还可以修饰方法 --> 当前方法只能被子类继承不能被子类重写 final修饰类 --> 终类,不能被继承
final可以和static一起使用 但是不能和 abstract 一起使用

final修饰的变量 一旦赋值不能更改
全局变量(final修饰变量名必须大写,多个单词之间使用_分隔)
final修饰全局变量的时候,最好是先进性赋值
final可以和static一起使用还可以添加权限修饰符
final修饰的类不能被继承

猜你喜欢

转载自blog.csdn.net/root1994/article/details/89058495