Java中的封装、继承、多态

目录

封装

概念

继承

多态 

向上转型

一、直接赋值

二、方法传参

三、返回值

向上转型注意事项

向下转型

格式

重写

重写和重载的区别

动态绑定

静态绑定和动态绑定


封装

概念

简单来说就是套壳屏蔽细节

举例:

想要访问它们时需要一些“接口”:

在面向对象体系中,提出了一个软件包的概念。为了更好的管理类,把多个类收集在一起成为一组,称为软件包。类似于目录。

举例:

在这个代码中,我们想要打印一个数组时,要通过Arrays类去调用toString方法,此时系统就会为我们自动导包(使用import关键字),我们可以看到,Arrays这个类是在until这个目录下面的,而until又是在java目录下的。

除了使用Java给我们提供的包,我们还可以自定义包:

我创建了一个first文件夹,在它的里面再创建一个one文件夹,在one文件夹中有一个Test类。


继承

在Java中,继承是一种面向对象编程(OOP)的核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以复用父类的代码,从而提高代码的可重用性和可维护性

上述两个类中我们发现:

红色框中的属性和方法都相同。

此时我们可以创建一个Animal类:

这个类陈之为父类

此时它和Dog、Cat的关系如下:

此时父类中的属性和方法可以被子类继承。

子类想要使用父类中的方法或属性需要使用关键字extends

并且Animal中要有getter和setter方法

这样我们通过继承实现了:子类可以复用父类的代码,从而提高了代码的可重用性和可维护性

注意:

        1.子类会将父类中的成员变量或者成员方法继承到子类中

        2.子类继承父类后,必须要添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了。     

        3.当子类和父类有同名的成员变量、成员方法时优先访问子类的。

        4.不支持多继承,一个类只能继承一个父类。

可以在子类中通过super关键字去访问父类的成员变量或方法:


多态 

概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

多态实现条件:

1.必须在继承体系下

2.子类必须要对父类中的方法进行重写

3.通过父类的引用调用重写的方法

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

向上转型

向上转型有三种方法:

一、直接赋值

在Java中,引用变量可以指向任何继承自其声明类型的类的实例。

Animal animal = new Dog();

  • 创建了一个Dog类的实例。
  • 将这个Dog实例的内存地址赋值给Animal类型的引用变量animal

这意味着animal引用现在指向一个Dog对象,你可以通过animal引用来访问Dog对象继承自Animal类的所有属性和方法以及Dog类特有的属性和方法。

二、方法传参

三、返回值

向上转型注意事项

(1)

(2)子类向上转型后不能访问到父类中private修饰的成员变量


向下转型

格式

正确:

错误1:

错误原因:

1、animal2指向的是Dog的实例,向下转型的时候也只能用Dog类型进行转换

2、Dog和Bird都是Animal的子类,但它们彼此之间没有继承关系。因此,一个Dog的实例不能被转换为Bird类型。尝试这样做会导致ClassCastException。

instanceof可用于检查它左边的对象是否是它右边的类的实例。如果左边的对象是该类或其子类的实例,则表达式返回 true;否则返回 false。

错误2:

P是一个父类,而Child是它的子类,你不能将一个父类的实例直接转换为子类的实例

在Java中,向上转型(从子类到父类)是安全的,但向下转型(从父类到子类)需要一个正确的实例检查,以确保转换的对象实际上是要转换类型的一个实例。

要修复这个错误,你需要确保你正在转换的对象实际上是Child的一个实例。

在Java中,向下转型需要显式的类型转换,因为编译器不知道p引用的对象实际上是Child类的实例。但是,由于p实际上指向了一个Child的实例(因为我们刚刚用new Child()创建了它),所以这个转换是安全的,不会在运行时抛出ClassCastException。


重写

也称为覆盖。重写是子类对父类非静态、非private修饰、非final修饰,非构造方法等的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。

注意:

重写和重载的区别


动态绑定

父类引用指向其子类的实例时,调用eat方法时,会调用子类重写的方法

程序在编译的时候 确实调用的是父类的eat方法

当运行代码的时候,通过父类的引用,调用了子类重写的那个方法,此时,我们把这个情况叫做动态绑定。

Animal类中有一个eat方法,Animal的子类Dog和Bird中都有对eat方法的重写,父类的引用调用了子类重写的方法:

animal引用的对象不一样,调用的是同一个方法,但是表现出的现象不一样,这种思想就叫做多态。


在父类的构造方法中调用实例方法时,如果子类有对这个方法的重写,那么就调用重写的

结论:

用尽量简单的方式使对象进入可工作状态,尽量不要在构造器中调用方法(如果这个方法被子类重写,就会触发动态绑定,但是此时子类对象还没构造完成),可能会出现一些隐藏的但是又极难发现的问题。


静态绑定和动态绑定

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用了哪个方法。典型代表:函数重载。

动态绑定:也称为后绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用哪个类的方法。


请点一个免费的赞~~

谢谢支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值