面向对象初步:构造方法和this关键字
一、构造方法介绍
(一)作用
- 创建对象
- 完成初始化
- 默认无参构造方法
- 自定义构造方法
(二)分类
二、构造方法的声明形式
(一) 声明
【访问权限修饰符】类名 ( 形式参数列表 )
{
执行语句;
}
(二)特点
构造方法名与类名相同
没有方法返回值,也不用定义返回值类型,连void也不用。
形参可以是0个、1个或者多个。
构造方法中可以编写一切符合java规范的代码,但是通常是对成员变量进行初始化。
三、默认的构造方法
任何一个Java类都默认有一个无参构造方法。也就是说,即使类中没有声明无参的构造方法,照样可以直接使用没有参数的构造方法。
然而,只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效。
四、构造方法与普通方法的区别
五、构造方法的重载
重载:在同一个类中,方法名相同,参数列表不同(参数的类型,参数个数,参数的顺序)
构造方法的重载 : 是指同一个类中存在着若干个具有不同参数列表的构造函数,名称一样都是类名.
六、this关键字
(一)this关键字的作用
表示对当前对象的引用
(二)this关键字的用法
访问成员变量:this.成员变量名
访问构造方法:this(形参列表) 必须放在方法的第一行
访问成员方法:this.方法名();
七、创建对象的过程
1、把MemberCard 类的字节码加载到内存;
2、根据MemberCard 类的声明,把属性name、balance初始化到内存堆,并赋初值,分别为null和0.0;
3、根据代码,调用两个参数的构造方法,把lily、2000赋值给name和balance;
4、在栈中创建一个变量card2 ,用来引用堆中对象的具体属性,card2 的值是一个16进制的数,表示一个虚地址
八、封装
(一)封装的作用和意义
1.定义
把对象的属性和方法用private修饰为一个独立的整体,外界不能访问,并尽可能隐藏对象的内部实现细节.
2.作用
程序设计追求“高内聚,低耦合”。(把复杂性封装起来,用的时候尽可能的简单)
高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉。
低耦合:是仅暴露少量的方法给外部使用,尽量方便外部调用。
(二)封装的优点
1.提高代码的安全性
2.提高代码的复用性
3.“高内聚”:封装细节,便于修改内部代码,提高可维护性
4.“低耦合”:简化外部调用,便于调用者使用,便于扩展和写作
(三)封装的细节
- 用private修饰成员
- 本类提供public方法(setter,getter)调用private的成员 构造函数
- 外界调用public方法
一般使用private访问权限修饰来修饰成员变量
提供相应的get、set方法来访问相关属性,这些方法通常是public修饰的。以提供对属性的赋值与读取操作。
一些只用于本类的辅助性方法,可以使用private修饰,
希望其他类调用的方法用public修饰。
(四)案例
创建User类,username,password,对成员变量进行封装,对外提供访问成员变量的方法,包括setter设置值,getter取得值方法
public class User {
|
九、继承
(一)继承的概念及意义
所谓继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用,子类能吸收已有类的数据属性和行为,并能扩展新的能力。
通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率
(二)继承的声明形式
【访问权限修饰符】【修饰符】子类名 extends 父类名{
子类体
}
子类能够使用父类的非私有的成员变量和成员方法,并能扩展新的功能
案例:
(三)继承的优点
1.提高了代码的复用性
多个类相同的成员可以放到同一个类中(父类)
2.提高了代码的维护性
如果功能的代码需要修改,修改一处即可
3.让类与类之间产生了关系,是多态的前提
其实这也是继承的一个弊端:类的耦合性很强
(四)继承的特点以及注意事项
1.继承的特点
1.Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
class SubDemo extends Demo{} //ok class SubDemo extends Demo1,Demo2...//error
2.支持多层继承(继承体系)
class A{}
class B extends A{}
class C extends B{}
2.继承的注意事项
子类能使用父类所有非私有的成员(成员方法和成员变量)
子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
不要为了部分功能而去继承
我们到底在什么时候使用继承呢?继承中类之间体现的是:”is a”的关系。(……是……的一种)
(五)继承中成员变量的关系
子父类中同名和不同名的成员变量
在子类方法中访问一个变量:
1.首先在子类局部范围找
2.然后在子类成员范围找
3.最后在父类成员范围找(肯定不能访问到父类局部范围)
4.如果还是没有就报错。(不考虑父亲的父亲…)
就近原则
(六)super关键字
super:指的是父类对象
super的用法和this很像
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量
1.this.成员变量 super.成员变量
2.访问构造方法(子父类的构造方法问题讲)
this(…) super(…)
3.访问成员方法(子父类的成员方法问题讲)
this.成员方法() super.成员方法()
(七)继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中无参数的构造方法
为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据。子类初始化之前,一定要先完成父类数据的初始化。
每一个构造方法的第一条语句默认都是:super()
如何父类中没有构造方法,该怎么办呢?
子类通过super去显示调用父类其他的带参的构造方法
子类通过this去调用本类的其他构造方法:本类其他构造也必须首先访问了父类构造
一定要注意:
super(…)或者this(….)必须出现在第一条语句上。
(八)继承中成员方法的关系
通过子类对象去访问一个方法
首先在子类中找
然后在父类中找
如果还是没有就报错。(不考虑父亲的父亲…)
(九)方法覆盖
1.方法覆盖的定义
子类可以重写父类中某一个方法,称为方法覆盖,也称方法重写,是继承中非常重要的知识点。如果子类需要修改从父类继承到的方法的方法体,就可以使用方法覆盖。
2.方法覆盖的原则
同名
同参
同返回值
访问权限不能缩小