Java中的封装、继承、多态

封装

就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节

将对象中的成员变量进行私有化,外部程序是无法访问的。但是我们对外提供了访问的方式,就是set和get方法

封装的特点

  • 封装可以隐藏内部程序实现的细节。
  • 减少代码之间的耦合度。
  • 方便数据检查,有利于保护对象信息的完整性,同时也提高程序的安全性。
  • 便于修改,体高代码的可维护性。
继承

打印顺序:父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法

使用 extends 继承父类

一个子类只能继承一个父类

子类会继承父类的所有public的字段和方法,对于父类的private 是字段和方法,子类是无法访问的

子类的实例中,也包含着父类的实例,可以使用super关键字得到父类实例的引用

继承的好处就是提高代码复用性。

在继承中如果把字段设为 private, 子类不能访问. 但是设成 public, 又违背了我们 “封装” 的初衷.两全其美的办法就是 protected 关键字。

protected 关键字

对于类的调用者来说,protected 修饰的字段和方法是不能访问的

对于类的子类和同一个包的其他类来说,protected 修饰的字段和方法可以访问

小结:

private : 类内部能访问,类外部不能访问

default (也叫包访问权限):类内部可以访问,同一个包中的类可以访问,其他类不行

protected : 类内部能访问,子类和同一个包中的类可以访问,其他类不行

public : 类内部和调用类都可以访问

this关键字

this关键字代表当前对象

this.属性 操作当前对象的属性

this.方法 调用当前对象的方法。

final关键字

使用final关键字做标识有“最终的”含义。

1. final 修饰类,则该类不允许被继承。

2. final 修饰方法,则该方法不允许被覆盖(重写)。

3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次。

​ 4.final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。

super关键字

在对象的内部使用,可以代表父类对象。

1、访问父类的属性:super.age

2、访问父类的方法:super.eat()

super的应用:

子类的构造过程中必须调用父类的构造方法。这个过程我们使用super关键字隐式调用。

如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。

要注意的是:如果子类构造方法中既没有显式调用父类的构造方法,而父类没有无参的构造方法,则编译出错。

(补充说明:子类构造方法没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身其他的构造方法,系统默认调用父类法人无参构造方法。【例如:Super()】。子类构造方法通过super显式调用父类的有参构造方法,执行父类相应构造方法,而不执行父类无参构造方法。)

多态

什么叫多态:多态是同一个行为具有多个不同表现形式或形态的能力。

多态的好处 :

1.类调用者对类的使用成本进一步降低 :多态能让类的调用者连这个类的类型是什么都不必知道, 只需要知道这个对象具有某个方法即可

2.能够降低代码的复杂度,避免大量使用if - else

3.可扩展能力强

向上转型

Animal bird2 = new Bird("yy"); 此时 bird2 是一个父类 (Animal) 的引用, 指向一个子类 (Bird) 的实例. 这种写法称为 向上转型

向上转型发生的一个时机:

直接赋值,方法传参,方法返回

动态绑定

调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期)

方法重写

子类和父类的同名方法,且参数个数和类型完全相同

普通方法可以重写,static修饰的或final修饰的不能重写

重写后子类方法权限不能低于父类的方法访问权限

重写和重载的区别

重写就是子类重写与父类,其方法名,参数个数和类型完全相同

重载:方法名称相同,参数类型,个数和顺序不同(注意:返回类型不同不算)

向下转型

向下转型:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!

向上转型是子类对象转成父类对象, 向下转型就是父类对象转成子类对象 ,相比于向上转型来说, 向下转型没那么常见

为了让向下转型更安全, 我们可以先判定一下看看 animal 本质上是不是一个 Bird 实例, 再来转换

Animal animal = new Cat("小猫");
	if (animal instanceof Bird) {
	Bird bird = (Bird)animal;
	bird.fly();
}  

instanceof 可以判定一个引用是否是某个类的实例. 如果是, 则返回 true. 这时再进行向下转型就比较安全了

多态中使用this和super区别

this 先查找本类,如果本类没有就调用父类

super 不查找本类,直接调用父类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值