五、Java面向对象:继承

一、概述

继承的概述:将多个类相同的部分使用同一个类括起来,其他类与这个类产生继承关系,这样其他类就包含了这个类的成员

关键字:extends

描述:class A extends B(){ }

          A:子类,派生类

          B:父类,超类,基类  

特点:  java中类与类之间只能单继承,不能多继承;

    类和类之间可以进行多层继承,形成继承体系

注意事项:1、子类只能继承父类所有非私有的成员(成员方法和成员变量);

        2、子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法;

     3、不要为了部分功能而去继承

复制代码
package com.shujia.day06.ketang;

/*
    java中继承的特点(注意事项):
        1、java中的类与类之间不能进行多继承,只能进行单继承,但是可以进行多层继承,形成继承体系
        2、子类只能继承父类中所有非私有的成员(成员变量和成员方法)
        3、子类无法继承父类中的构造方法,但是要想初始化子类,必须先初始化父类(指的是执行一次父类中任意一个构造方法)
        4、不要为了部分功能去使用继承
        5、什么时候使用继承?满足英语中的 is a的关系

 */

class Father{
    int a = 10;
//    private int b = 20;

    Father(){
        System.out.println("这是父类中的无参构造方法");
    }

    private void show(){
        System.out.println("这是父类中私有的成员方法");
    }
}

class Son extends Father{

    public void fun1(){
        System.out.println(a);
//        System.out.println(b);
//        show();
    }
}

public class ExtendsDemo2 {
    public static void main(String[] args) {
        Son son = new Son();
//        son.fun1();
//        son.show();
    }
}
复制代码

 

  

super :表示类的直接父类引用  

面试题:super与this的异同

复制代码
package com.shujia.day06.ketang;
/*
    继承中成员变量的关系(就近原则)
    面试题:java中this和super的异同之处
        1、相同点:使用的语句格式都差不多
            访问成员变量:this.成员变量  super.成员变量
            访问成员方法:this.成员方法(..)  super.成员方法(..)
            访问构造方法:this(..)  super(..)
        2、不同点:this代表的是当前类的对象  super代表的是直接父类的引用
 */

class Demo1 {
    int a = 10;
}

class Demo1Zi extends Demo1 {
    int a = 100;

    public void fun1(){
        int a = 11;
        System.out.println(a);
        //需求:我就想输出父类中的a
//        Demo1 demo1 = new Demo1();
//        System.out.println(demo1.a);
        //获取当前类中的成员变量值
        System.out.println(this.a);
        //java提供了一个与this关键字很像的另一个关键字: super 代表的是直接父类的引用
        System.out.println(super.a);
    }
}
public class ExtendsDemo3 {
    public static void main(String[] args) {
        Demo1Zi demo1Zi = new Demo1Zi();
        demo1Zi.fun1();
    }
}
复制代码

 

 二、子类初始化

 

要想初始化子类,必须先初始化父类,只要子类构造方法中第一句话调用父类中任意一个构造方法即可(结合super关键字来解释)

1、子类中每一个构造方法的第一句话默认是super() (super()的意思是调用直接父类的构造方法)
2、如果父类中没有无参构造方法? 直接在子类中通过super关键字调用父类其他的构造方法,或者间接地调用
3、父类不能进行多次初始化

复制代码
package com.shujia.day06.ketang;

/*
    要想初始化子类,必须先初始化父类,只要子类构造方法中第一句话调用父类中任意一个构造方法即可(结合super关键字来解释)

    1、子类中每一个构造方法的第一句话默认是super() (super()的意思是调用直接父类的构造方法)
    2、如果父类中没有无参构造方法? 直接在子类中通过super关键字调用父类其他的构造方法,或者间接地调用
    3、父类不能进行多次初始化

 */
class Fu {
//    Fu(){
//        System.out.println("这是父类中的构造方法");
//    }

    Fu(String s) {
        System.out.println("这是父类中带参数构造方法" + s);
    }
}

class Zi extends Fu {
    Zi(){
        //这里第一句话默认会有一个super()
//        this("hello");
        super("hello");
//        super("hello"); //父类不能进行多次初始化
//        this("hello");
    }

    Zi(String s){
        super("hello");
    }
}
public class ExtendsDemo4 {
    public static void main(String[] args) {
        Zi zi = new Zi();
    }
}
复制代码

 

 
三、方法的重写
继承中成员方法的关系:
方法的重写:在继承关系中,子类中的方法的声明(返回值类型,方法名,参数列表)与父类中的方法声明都一样,只是实现不一样,这样的现象,叫做方法的重写
判断一个方法能不能重写,可以在方法的上面加上一个注解@Override,能加上不报错,就说明可以重写
面试题:重写与重载的区别?Override与Overload的区别?
方法的重写:在继承关系中,子类中的方法的声明(返回值类型,方法名,参数列表)与父类中的方法声明都一样,只是实现不一样,这样的现象,叫做方法的重写。
方法的重载:在同一个类中,方法的方法名相同,参数列表不同,这个现象叫做方法的重载,与返回值无关。

注意事项:

1.父类中私有方法不能被重写 因为子类根本无法继承私有的

2.子类重写父类方法时,访问权限不能更低 推荐除特殊要求外 子类重写与父类的权限保持一致肯定不会错
3.父类静态方法,子类无法重写
 
四、final关键字
父类中非私有的成员方法可以被子类继承,也可以被重写,但是如果父类中的非私有方法只想被子类使用,但是不想被子类重写,该怎么做呢?
final(最终的,不可变的):可以修饰类,变量,成员方法
特点:修饰类,类不能被继承
   修饰变量,变量变常量
   修饰方法,方法不能被重写
 
 

 

posted @   SIKeborn  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示