目录
封装
概念
包
继承
多态
向上转型
一、直接赋值
二、方法传参
三、返回值
向上转型注意事项
向下转型
格式
重写
重写和重载的区别
动态绑定
静态绑定和动态绑定
封装
概念
简单来说就是套壳屏蔽细节。
举例:
想要访问它们时需要一些“接口”:
包
在面向对象体系中,提出了一个软件包的概念。为了更好的管理类,把多个类收集在一起成为一组,称为软件包。类似于目录。
举例:
在这个代码中,我们想要打印一个数组时,要通过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引用的对象不一样,调用的是同一个方法,但是表现出的现象不一样,这种思想就叫做多态。
在父类的构造方法中调用实例方法时,如果子类有对这个方法的重写,那么就调用重写的
结论:
用尽量简单的方式使对象进入可工作状态,尽量不要在构造器中调用方法(如果这个方法被子类重写,就会触发动态绑定,但是此时子类对象还没构造完成),可能会出现一些隐藏的但是又极难发现的问题。
静态绑定和动态绑定
静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用了哪个方法。典型代表:函数重载。
动态绑定:也称为后绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用哪个类的方法。
请点一个免费的赞~~
谢谢支持