今天,我们继续来进行继承的学习
面向对象
一.我们为什么要使用面向对象?
一方面,它使我们的交流更加流畅,我们解决问题不是面向过程,而是面向对象这一流程
第二方面,面向对象可以提高设计和开发效率
二.从现实中抽象出类的步骤:
1.找出它的种类
2.找出它的属性
3.找出它的行为
在现阶段,专为解决业务逻辑问题的面向对象的方法中,我们要明确一点,对象提取相似的特点封装成类,而类中的属性和方法只放和业务相关的属性和方法。同时,在创建类之前,我们最好去使用类图来模拟一下类的属性和方法,使对应的类变得直观、容易理解
构造方法
首先,我们需要明确,构造方法的一个目的就是为了在创建对象的同时就完成赋值,经过检验我们可以发现,对与java来说其本身就为我们提供了无参构造(即使我们不写也仍然存在),如果没有构造方法,我们就没有办法创建对象。
Penguin pgn = new Penguin();
对于构造方法有两个条件。
1.构造方法没有返回值类型,即访问修饰符和构造方法名中间不能加任何东西
2.构造方法名需要和类名相同
对于传参个数的不同,我们可以生成多个构造方法来供我们使用
this关键字
在构造方法中,我们经常使用this关键字来进行参数与本类属性命名的区分,即区分同名成员变量
this关键字指向于当前类自身的对象,即他可以作为当前类的对象去调用属性和方法
这里插播一个小东西,对于super来说呢,它指向于当前类父类的对象,作为其父类对象去调用属性和方法
对于this关键字,其具体用法有三种
1.调用属性 this.health = 100;
2.调用方法 this.print();
3.调用构造方法 this(); 这里就是构造方法的具体使用,里面可以穿参来进行不同构造方法的使用,但是需要注意,如果使用构造方法,他必须在构造方法中的第一句,否则会报错
方法重载
方法重载(Overload):在同一类中,方法名相同,参数类型或参数个数不同,与返回值、访问修饰符无关
static关键字
static关键字
static关键字一般与常量联合使用,所以一般情况下只要加上static关键字,就会被放到永久代中,永远不会被回收,其次,在静态区中不允许对非静态变量/方法直接进行访问。使用static定义方法,可用类直接调用,但是局部变量不可用static修饰。static修饰:变量、常量、方法
static分配内存 ->在方法区中
方法区存储
1.类信息(存储.class编译文件)
2.常量池(存储final修饰的变量、方法)
3.静态(static修饰的变量常量和方法)
对于final来说
1.修饰的类不可以被继承
2.修饰变量就会转换为常量(大写)
3.修饰常量不可修改
4.修饰方法不可被覆盖
静态方法中,若调用非静态资源,必须要先实例化!
封装
我们这里再次解释一下封装,深入了解一下封装
封装:将类的某些信息隐藏在内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
封装的好处
1.隐藏类的实现细节
2.方便加入控制语句
3.方便修改系统
4.只能通过规定方法访问数据
标准的javabean:
1.字段名:以前类中封装的属性,现在统一称为字段名
2.属性:生成的get和set方法,现在统一称为属性
3.java中所有的组件
继承
言归正传,我们来讲本篇文章的重点——继承
继承,就是将重复代码抽取到类中,以解决代码重复性问题,消除代码冗余
继承关键字为extend
class Dog extends Pet;
对于子类来说,只能继承一个父类
super关键字
使用super关键字,super代表父类对象,并且在子类构造方法中调用父类构造方法必须是第一句
super()不能用this()代替
子类不能继承的父类成员
1:父类进行私有化的private成员
2:父类的构造方法,子类无法继承
3:子类与父类不在同包,但是使用默认访问权限的成员
访问修饰符 protected
- 可以修饰属性和方法
- 本类、同包、子类可以访问
静态代码块、实例代码块、构造方法、普通方法在jvm中的执行顺序
static{
//static静态代码块
}
{
//实例代码块
}
方法重写
子类把父类的某个方法覆盖
重写规则:
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
要求:
1.必须拥有继承关系
2.子类方法需要与父类方法完全一致(方法名称、参数类型、返回值类型)
3.子类方法可以修改访问修饰符,但要比父类的访问修饰符更加开放或者相同(必须同包状态下)
4.子类不可以抛出比父类更多的异常
- super关键字来访问父类的成员
- super只能出现在子类的方法和构造方法中
- super调用构造方法时,只能是第一句
- super不能访问父类的private成员
抽象类
做了大量练习之后,我们可以发现父类实例化毫无意义,故我们使用抽象类,限制实例化
public abstract class Pet{};
注:
一个抽象类不一定包含抽象方法
包含抽象方法的类一定是抽象类
抽象类不可实例化!一般都定义在父类上
如若不需要方法体,可以添加abstract成为抽象类
如果父类存在抽象方法,子类必须要实现,如果子类不实现,可以将子类当前方法设为abstract,(同时子类要成为抽象类),让孙子类继承子类,继续实现该抽象方法。无论如何,父类的抽象方法必须被实现!!!
以上就是本篇文章的所有内容,如有疑问还请各位多多评论区提出!