JavaSE进阶_02_继承&抽象类&代码块

今日内容

​ 继承 【重点】
​ 抽象类 【重点】
​ final关键字 【重点】
​ 代码块 【重点】

继承(extends) 【重点】

什么是继承

​ 继承是面向对象的三大特征(封装、继承和多态)之一
​ 使用extends关键字使类与类之间产生关系(子父类关系)
​ 子类可以拥有父类中的成员(除了私有的和构造方法之外)

继承的好处和弊端

​ 好处:

​ 1、可以提高代码的复用性
​ 多个类有共性的内容(相同的成员变量和成员方法),将这些相同的内容抽取到另一个类中
​ 多个类(子类)就去继承这个类(父类),达到代码复用的效果
​ 2、提高代码可维护性
​ 3、是多态的前提之一

​ 弊端:

​ 类与类之间的耦合性增强

继承的格式

    public class 子类 extends 父类 {

    }

继承的特点

1、Java中的类,只支持单继承不支持多继承
    (一个类同时只能继承一个类,而不能同时继承多个类,一个儿子只能有一个亲爹)
         class A extends B{} // 单继承 √
         class A extends B,C{} // 多继承 ×
         class B{}
         class C{}
2、Java中的类,支持多层继承
     class A{}
     class B extends A{}
     class C extends B{}	

面试题:Java是否支持多继承?
​ Java中的类是不支持多继承的
​ 但是Java中还有接口这个东西,它是支持多继承的

继承中成员访问的特点

    成员变量
        就近原则:在一个方法中,使用的变量的时候首先会查找局部变量,如果没有局部变量会找本类的成员变量,
        如果没有本类的成员变量就会查找父类的成员变量,如果这个三个都有,直接访问使用的就是局部变量,
        通过this.访问的本类的成员变量通过super.访问的父类的成员变量。

    成员方法
        就近原则:先查找本类中是否有这个方法,有就调用,如果没有就查找父类中是否有这个方法,有就调用,没有报错
        如果本类中有,父类中也有,就近使用本类中的方法,如果要使用父类中的方法,需要使用super.去访问

    构造方法
        访问子类的构造方法之前,一定会先执行父类的构造方法.
        因为每一个构造方法的第一行默认有super()这样的语句,会去访问父类的空参构造方法。
        如果我们手动编写super(实参)或者this(实参)这样的语句,
        那么默认的super()这样调用父类空参构造的语句就没有了
        super(实参)或者this(实参)这样的语句不能同时出现,只能二选一

this和super

this:当前类的对象的引用,谁来调用这个方法,这个方法中的this就代表哪个对象
    * 可以调用本类的成员变量           this.成员变量名    - System.out.println(this.a);
    * 可以调用本类的成员方法           this.成员方法名(实参)         - this.show();
    * 可以在构造方法中第一行代码,用于调用本类的其他构造方法    this(实参)
super:代表父类的那片内存空间(可以理解为父类对象的引用)
    * 可以调用父类的成员变量       super.成员变量名              - System.out.println(super.a);
    * 可以调用父类的成员方法       super.成员方法名(实参)         - super.show();
    * 可以在子类的构造方法中第一行代码,用于调用父类的构造方法       super(实参)

方法重写

什么是方法重写
        方法重写(Override),也可以称之为方法覆盖
        在有继承关系的两个类中,子类对父类的方法在一定范围进行修改的过程,就是方法重写。
        注解:@Override,用于检测一个方法是否是重写的方法
方法重写的应用场景
    有继承关系的类,子类可以将父类的方法继承下来,但是继承的方法可能不是完全满足子类的需求,
    这时子类就可以对继承下来的这个方法在一定范围内进行修改,一般我们重写的时候会保持方法声明完全一致,
    修改的是其方法体中的内容。

    满足:不去重写
    完全不满足:修改方法体内容,和父类中方法体内容完全不同
    不完全满足:满足的不满就调用父类原来的方法,不满足的部分再添加或者修改

方法重写的原则
    重写时一般都不去修改方法的声明,只修改方法体内容,但是如果要修改方法声明,请遵循以下重写原则:
    一大两同两小
    一大:子类重写的方法的修饰要大于等于父类方法的权限修饰符
    两同:方法名必须相同,参数列表必须相同
    两小:
        子类重写的方法的返回值类型必须小于等于父类方法的返回值类型(引用类型,基本类型不适用)
        子类重写的方法抛出的异常要小于/少于等于父类方法抛出的异常
            假如父类方法没有抛出异常,那么子类重写的方法绝对不能抛
            
方法重写(Override)和方法重载(Overload)的区别
        方法重写(Override):
            两个类中,有继承关系的两个类
            方法名和参数列表必须相同
            和其他(返回值类型、修饰符)有关

        方法重载(Overload):
            同一个类中
            方法名相同,参数列表不同
            和其他(返回值类型、修饰符、参数变量名)无关
方法重写的注意事项
        1、私有的方法不能被继承也不能被重写
        2、静态方法可以被继承但是不能被重写
           重写的时候父类方法没有使用static修饰,重写后的方法也不能使用static修饰
           如果父类的方法使用了static修饰,子类的方法也必须使用static修饰,但是这种关系不是重写
        3、构造方法不能被继承也不能被重写

权限修饰符

    对类、类中的成员的权限进行限定
    限定类、类中的成员使用的范围,是在当前类中、本包其他类中、其他包其他类中

            本类      本包其他类    其他包子类          其他包其他类
private      √
默认          √           √
protected    √           √             √
public       √           √             √                     √

抽象类 【重点】

什么是抽象类
    使用abstract关键字修饰类
    有抽象方法的类就是抽象类,抽象类也可以没有抽象方法
    
抽象类的定义格式
    public abstract class 类名{
    }
    
抽象方法的定义格式
    public abstract 返回值类型 方法名(参数列表);

抽象类的应用场景
    1、一个类中有抽象方法,那么这个类就要定义成抽象类。

        多个类向上抽取共性成员方法,抽取到父类中,无法中的共性方法中无法明确具体的实现,此时干脆不如让方法体空着,
        没有方法体的这种方法,就是抽象方法,一个类有了抽象方法就要定义成抽象类
    2、如果一个类不想让外界创建其对象

抽象类的特点
    1、抽象类不能实例化(不能创建对象)
    2、一个类如果继承了抽象类,要么重写抽象类的所有抽象方法,要么这个类也变成的抽象类

抽象类成员的特点
    成员变量
        常量:可以有
        变量:可以有
    构造方法
        有构造方法的,由子类进行调用
    成员方法
        抽象方法:可以有可以没有
        非抽象方法:可以有可以没有

final关键字 【重点】

是一个关键字,也是最终修饰符,可以修饰类、变量和方法
修饰类:不能被继承(太监类),如果一个类中的所有方法都不想被重写,就可以定义成final修饰的类
修饰方法:不能被重写,但是可以被继承
修饰变量:可以修饰局部变量,也可以修饰成员变量
    局部变量
        变成了常量,不能再次赋值
    成员变量
        变成了常量,不能再次赋值

    常量命名规范:
        都是大写,如果多个单词组成,中间使用_隔开
        ctrl+shift+u可以切换大小写

代码块 【重点】

​ java中有四种代码块(静态代码块,构造代码块,局部代码块和同步代码块(多线程学习))

局部代码块
    位置:在方法中,和局部变量的位置相同
    格式:{

         }
    作用:限制了变量的作用域(声明周期),让变量及早进行释放,节省内存
    特点:出了大括号就无法使用


构造代码块
    位置:在类中方法外,和成员变量的位置相同
    格式:
        {

        }
    作用:抽取构造方法中的共性代码,提高代码的复用性
    特点:每一次创建对象都会执行一次构造代码块,而且先于构造方法执行


静态代码块
    位置:在类中方法外,和成员变量的位置相同
    格式:
        static{

        }
    作用:可以做一些初始化的操作,或者做一些准备工作
    特点:
        1、随着类的加载而执行,执行时机是非常早的
        2、随着类的加载而执行,由于类的加载只会执行一次,所以静态代码块也只会执行一次
        3、比主方法执行都早,比构造代码块执行也早
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值