八.封装,继承,多态

1.封装

  • 创建学生类
    在这里插入图片描述

  • 调用学生类
    在这里插入图片描述
    运行结果:
    在这里插入图片描述

  • age是int型,如果设置age是负数,不会报错,如何添加限制让age为一个正数?
    解决方法:
    在这里插入图片描述

  • 当创建完对象以后,我如果直接通过“对象名.属性名”的方式给属性赋值的话,可能会出现一些不符合实际情况的问题,所以我们不考虑使用“对象名.属性名”的方式赋值,而是通过“对象名.方法名()”的方式进行赋值,因为我可以在方法里面加上大量的业务逻辑,对属性进行限制

  • 新问题:还是可以直接通过对象名.属性名的方式赋值
    如果不让他通过stu.age方式调用属性,是不是就可以了?
    在这里插入图片描述

  • 我想直接调用属性,输出age属性值:
    在这里插入图片描述

  • 总结:解决方法:
    1.将属性私有化
    2.提供公共的(get and set)方法实现属性的取值和赋值

  • 创建学校类:
    在这里插入图片描述
    在这里插入图片描述

  • 调用学校类:
    在这里插入图片描述

  • 在我们去创建对象的时候,会用到一个特殊的方法叫做构造方法(构造器)
    作用:
    1.创建对象,new的时候就是调用了构造方法
    2.在创建对象的同时,我们可以调用有参的构造方法直接对属性赋值

  • 怎么去创建一个构造方法?
    public 构造方法名(形参){
    }
    注意:构造方法没有返回值;构造方法名必须和当前类的名字一模一样

  • 构造方法是一个特殊的方法,可以进行方法重载吗?
    可以
    在这里插入图片描述
    在这里插入图片描述
    注意:
    如果没有显示的定义构造方法,系统会默认的提供一个无参的构造方法
    如果显示的定义了一个构造方法,系统不会再提供,需要我们手动的创建一个无参的

  • 什么时候用set赋值 什么时候用构造方法赋值?
    set针对于单个变量进行更改

    new对象的同时给属性赋值,省去了set方法的麻烦,针对多个属性同时赋值
    在这里插入图片描述
    在这里插入图片描述

  • 打招呼

    在这里插入图片描述
    在这里插入图片描述
    成员变量和局部变量出现重名时,方法会根据“就近原则”使用局部变量的值
    如果想区分成员变量和局部变量我们可以用this关键字
    格式:
    this.成员变量
    什么是this关键字
    1.this代表当前使用的对象或者是正在创建的对象,通过哪个对象调用了方法谁就是this
    2.this可以修饰成员变量,方法,构造方法 直接在成员变量名或者成员方法名前面加上this
    3.可以在构造方法中通过“this(形参)”的方式调用本类其它构造方法
    注意:在构造方法内部this(“形参”)必须放在首行
    如果一个类里面有n个构造方法,那么最多使用n-1个构造方法内部使用了this()
    在这里插入图片描述
    在这里插入图片描述
    2.继承

  • 继承是多态的前提,如果没有继承就没有多态
    一个子类继承父类,子类可以使用父类所有的属性和方法
    继承:共性抽取

  • 优缺点:
    优点:提高了代码复用性
    缺点:由于继承会有多层的继承关系,会提高他们之间的依赖关系,耦合度会变高

  • 语法:
    class 子类extends 父类{
    }
    在这里插入图片描述
    ①使用继承以后,父类所有的属性(私有的除外)和方法都可以获取到
    ②子类除了通过继承获取父类的属性和方法外,还可以单独定义自己独有的属性和方法
    ③一个子类还可以派生别的子类吗?可以
    ④一个父类可以有多个子类,一个子类可以有多个父类吗?不可以,java的继承是单继承

  • 例题1
    在这里插入图片描述
    (1)
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(2)

(3)
在这里插入图片描述

  • 例题2
    在这里插入图片描述
    cilcle:
    在这里插入图片描述
    在这里插入图片描述
    cylinder:
    在这里插入图片描述
    在这里插入图片描述
    testcylinder:
    在这里插入图片描述
    在这里插入图片描述

  • 问题:
    在这里插入图片描述
    通过圆柱类去调用计算圆面积的方法对吗?不对 应该计算圆柱的表面积,而不是计算圆的表面积
    该代码返回的还是圆的面积

  • 方法重写:如果父类的方法满足不了子类要求时,子类可以对父类的方法进行重写(重点)
    重写规则:
    (1)要求子类重写的方法名,参数列表,返回值类型必须和父类完全一致
    (2)要求子类重写方法的访问修饰符权限不能低于父类方法修饰符权限
    (3)子类方法和父类方法必须同为static或非static

  • 重载(overload)和重写(override)的区别:(重点整理)
    ①方法重载必须在同一个类中;方法重写必须存在继承关系
    ②方法重载要求方法名相同,参数列表必须不相同,和返回值无关;方法重写要求方法名,参数列表,返回值必须和父类一致

  • super关键字
    super可以修饰属性,方法,构造方法
    (1)当子类和父类的属性出现重名时,默认会调用子类的属性,可以通过"super.属性名"的方式显示调用父类声明的同名属性
    (2)子类重写父类方法后,如果子类想再次调用父类被重写的方法,可以通过"super.方法名()"的方法调用父类方法
    (3)super可以修改构造方法,通过子类构造方法中使用"super(形参)"来显示调用的父类对应的构造方法
    注意:①super(形参)必须声明在首行;
    ②说明this(形参)和super(形参)只能出现一个;
    ③在构造方法中,不显示的通过super(形参)的方式调用父类对应的构造方法,默认会调用父类无
    参的构造方法
    如果一个类没有显示的继承谁,就继承object

  • 访问修饰符:
    修饰类,变量,方法,接口(重点总结)
    public:公共的,在当前项目下任何地方都可以访问
    protected:受保护的,在同一个包下或者在其他子类中可以访问
    default:缺省,在同一个包下
    private:私有,在当前类下面访问
    3.多态
    一个对象的多种形态
    前提:必须有继承或者接口的实现

  • 什么是多态性?
    (1) 同一个动作与不同的对象产生不同的行为
    (2) 多态指的是一个对象的多种形态

  • 多态的体现方式:
    (1)使用继承:不同的子类重写父类方法后,体现出来的形式不一样
    (2)接口的实现

  • 形成多态的必要条件:
    (1)继承:存在子类和父类的关系
    (2)接口实现:定义一个类实现对应的接口
    (3)重写:子类重写了父类的方法
    (4)重载:调用相同的方法名,实现的功能是不一样的
    (5)子类对象的多态性(重点):
    父类的引用指向子类的实例

  • 程序分为两种状态,一个是编译状态,一个是运行状态
    对于多态来说,编译时看左边,你这个对象定义的是什么类型就是什么类型;运行时看右边,真正执行的对象,也就是子类对象,执行的也是子类重写后的方法

  • 上转型和下转型:
    上转型是将子类对象交给父类引用,可以自动转换
    下转型是将父类转成子类,强制类型转换
    在这里插入图片描述
    在这里插入图片描述

  • 对象的多态性:
    (1)父类的引用指向子类的实例
    (2)在编译期间调用的是父类的方法,真正执行的时候,执行的是子类的方法
    (3)编译看左边,运行看右边

  • instanceof运算符:
    该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false
    在这里插入图片描述

  • final关键字:表示最终的意思
    可以修饰什么?
    (1)修饰类
    这个类有什么特点? 这个类不能被继承,就是一个太监类(不能被继承,没有子类),但是可以继承别的类
    (2)修饰方法
    这个方法有什么特点?代表这个方法是一个最终方法,不能被重写
    (3)修饰成员变量
    修饰成员变量有什么特点?成员变量的值不可改变
    ①成员变量不会有默认值
    ②如果使用final关键字,必须直接对成员变量进行赋值
    (4)修饰局部变量
    修饰局部变量有什么特点?
    局部变量的值一旦赋值不能改变,一般用来修饰常量

  • static:静态的
    1.static修饰成员变量(类变量)
    (1)修饰成员变量,这个变量就不属于对象了,而属于类本身,我们可以通过“类名.属性名”访问这个变量
    (2)只要通过我这个类创建的对象,这些对象都可以共享这个属性
    (3)当其中一个对象对类变量进行更改以后,其他的这个类变量也会更改
    VS实例变量(非static的变量):属于对象本身,各个对象都各自有一套副本
    (4)类变量是随着类的加载而加载,类变量的生命周期大于实例变量
    (5)类变量放在方法区的静态域里面
    2.static修饰方法(类方法)
    (1)修饰方法,这个方法就属于类本身了,我可以通过"类名.方法名()"进行调用
    (2)随着类而加载
    (3)在静态方法里面,只能调用静态变量和静态方法;相反在普通方法里面可以调用静态方法和静态变量,因为静态方法或静态变量的加载时机早于实例变量和实例方法的加载时机
    (4)不能使用this和super关键字
    3.static修饰代码块
    代码块的作用完成初始化
    (1)非静态代码块
    可以给类的属性进行初始化操作,同时还可以调用类的方法(静态的,非静态的)
    里面可以有输出语句
    每创建完一个对象,非静态代码块就加载一次
    (2)静态代码块
    里面可以有输出语句
    随着类的加载而加载,只会执行一次
    静态代码的加载时机早于非静态代码块
    静态代码块里面只能调用类变量和类方法
    作用在:jdbc 驱动用户名 密码 数据库的连接地址

对属性赋值:(1)默认初始化(2)显示的初始化(3)通过set方法或者构造方法(4)代码块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值