java基础学习days06 --- final关键字和继承

一、final 可以修饰类,变量,方法

  • final修饰类,该类不可被继承
  • final 修饰变量,该变量不可被修改,是一个常量
  • final修饰方法,该方法不可被重写

二、继承

1、继承的定义及特点

继承是面向对象编程中的一个基本概念,它可以让一个类(子类或派生类)自动获取另一个类(父类或基类)的字段和方法。子类可以重写或扩展父类的方法和字段,以实现更具体或更特殊的行为。

继承的主要特性有以下几点:

  1. 代码复用:通过继承,子类继承了父类的所有属性和方法,使得在子类中可以直接使用父类的代码,避免了代码的重复编写,提高了代码的复用性。

  2. 封装性:父类的内部实现对子类是隐藏的,子类只能通过父类提供的接口进行访问,这就是封装性。封装性可以保护数据的完整性和安全性。

  3. 多态性:当子类继承了父类的方法后,可以对这些方法进行重写,使得父类引用指向子类对象时,会调用子类的方法,这就实现了多态性。

  4. 层次性:继承体现了一种层次关系,对类的功能进行分层次的描述,有助于我们更好地理解和设计程序。

  5. 可扩展性:当我们需要在现有类的基础上增加新的功能或者行为时,我们可以通过继承来实现,这就提高了代码的可扩展性

2、需要注意的点
        ① 子类不可定义与父类同名的字段(只要是变量名一致就不可以)
package com.exmaple.ObjectOriented.days20240110;

public class Extends{

    public static void main(String[] args) {
        Father f = new Father();
        //子类型的引用得到的是,子类的字段name值
        System.out.println(f.name); //1
        Person p = new Father();
        //父类的引用得到的是父类字段name的值
        System.out.println(p.name); //人
    }

}

class Person{
    protected String name = "人";
}

class Father extends Person{
//    protected int name = 18;
    protected String name = "1";

}

如果子类定义父类同名的字段,会出现上面搞笑的一幕,不符合多态的特性

② 子类定义出现与父类相同的方法定义,但方法体不同的现象,叫方法的重写,体现了继承的扩展性

注意:这里的方法定义指:方法的修饰符,返回值类型,方法名和参数列表

其中方法的修饰符:public > protected > default > private, 重写的方法修饰符只能大于等于父类方法修饰符,否则编译错误。

如果方法名一致,参数列表不一致,不会编译错误,这时叫方法的重载

③ 子类所有构造方法会默认调用父类构造方法
package com.exmaple.ObjectOriented.days20240110;

public class Extends{

    public static void main(String[] args) {
    }
}

class Person{
    protected String name = "人";
}

class Father extends Person{
    public Father(){
        //实际上是有super()存在,但是可以省略不写
//        super();
    }

    public Father(String sex){
        //实际上是有super()存在,但是可以省略不写
//        super();
    }
}

如果父类只写有参构造,编译器就不会自动给类添加无参构造,此时代码会编译错误

package com.exmaple.ObjectOriented.days20240110;

public class Extends{

    public static void main(String[] args) {
    }
}

class Person{
    
    public Person(String name){
        this.name = name;
    }
    protected String name = "人";
}

class Father extends Person{
    //编译错误
    public Father(){
        //手动添加父类的有参构造就不会编译错误
        // super("小明")
    }

        public Father(String sex){
        //手动添加父类的有参构造就不会编译错误
        // super("小明")
    }
}
④ 单继承

在大多数面向对象的编程语言中,一个类只能直接继承一个父类,这称为单继承。如Java、C#、Swift等语言都只支持单继承。

这样做的主要原因是多继承(一个类直接继承多个父类)可能会引发一些问题,比如菱形问题(也叫钻石问题)。菱形问题是指当一个类同时继承了两个具有相同方法的父类,那么在调用这个方法时,编译器就无法确定应该调用哪个父类的方法,这就引发了冲突。

尽管如此,有些语言(如C++和Python)支持多继承,但它们通过特殊的规则来解决上述问题,如C++中的虚继承,Python中的MRO(Method Resolution Order)。

另外,虽然一些语言只支持单继承,但是它们通过接口(如Java中的接口,C#中的接口)或者协议(如Swift中的协议)来实现类似多继承的效果。接口和协议可以被一个类多次实现,从而使得一个类可以拥有多个父类的特性

你可能感兴趣的:(Java基础学习,java,学习,开发语言)