文章目录
- 方法和封装详细解析
- 构造方法的基本概念
- 默认构造方法
- 构造方法的作用
- 方法重载(重点)
- 方法重载的概念
- 重载的实际意义
- this关键字(原理)
- this的基本概念
- 工作原理
- 使用方式
- 注意事项
- 方法递归调用(难点)
- 递归的基本概念
- 注意事项
- 封装(重中之重)
- 封装的概念
- 封装的实现流程
- JavaBean的概念(了解)
方法和封装详细解析
构造方法的基本概念
- 语法结构
class 类名 {
类名(形参列表) {
构造方法体;
}
}
- 构造方法名与类名完全相同并且没有返回值类型,连void都不许有
默认构造方法
- 当一个类中没有定义任何构造方法时,编译器会自动生成一个无参空构 造构造方法,叫做默认/缺省构造方法
- 若类中出现了构造方法,则编译器不再提供任何形式的构造方法
- 所以编写构造方法时 如果有参构造则需要写无参构造 防止调用对象时出错
构造方法的作用
- 使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作(调用对象之后默认并初始化成员变量时)
方法重载(重点)
方法重载的概念
- 若方法名称相同,参数列表不同,这样的方法之间构成重载关系 (Overload)。
- 参数列表不同有以下几种情况
- 参数的个数不同
- 参数的类型不同
- 参数的顺序不同
- 注意事项
- 如果 参数列表相同 返回值类型不同 则会报错 因为jvm虚拟机不知道调用那个方法
- 与参数变量名无关 因为jvm虚拟机不知道调用那个方法
- 建议返回值类型相同 这样在处理时不需要加以区分
- 判断方法能否构成重载的核心
调用方法时能否加以区分
重载的实际意义
- 方法重载的实际意义在于调用者只需要记住一个方法名就可以调用各种 不同的版本,来实现各种不同的功能
- 如:java.util.Arrays类中的binarySearch方法
this关键字(原理)
this的基本概念
- 若在构造方法中出现了this关键字,则代表当前正在构造的对象(谁构造就指谁)
- 若在成员方法中出现了this关键字,则代表当前正在调用的对象(谁调用就指谁)
- this关键字本质上就是当前类类型的引用变量
- 注意事项
如果是static 修饰的成员方法 不可以调用this调用该内部类的属性 -->无法从静态上下文中引用非静态 变量 this
如果是static 修饰的成员属性 成员方法内部能够使用 this关键字调用 static修饰的属性
如果 static 同时修饰成员属性和方法 不可以调用this调用该内部类的属性
工作原理
- 在构造方法中和成员方法中访问成员变量时,编译器会加上this.的前缀, 而this.相当于汉语中"我的",当不同的对象调用同一个方法时,由于调用 方法的对象不同导致this关键字不同,从而this.方式访问的结果也就随之 不同
使用方式
- 当局部变量名与成员变量名相同时,在方法体中会优先使用局部变量(就近原则),若希望使用成员变量,则需要在成员变量的前面加上this.的前 缀,明确要求该变量是成员变量(重中之重)
- this关键字除了可以通过this.的方式调用成员变量和成员方法外,还可以作为方法的返回值(重点)
- 在构造方法的第一行可以使用this()的方式来调用本类中的其它构造方法 (了解)在this() 内部传入实参 如果出现互相调用 则会递归调用
- 注意
只有传参有歧义时 才加this 如果没有参数列表的方法无需加this关键字
class Student{
int age; // 表示学生对象的年龄
String name; // 表示学生对象的姓名
void steName(String name){ // 因为传递的形参 和 Student类中的成员属性相同 所以用this关键字
this.name = name;
}
String getname() { // 无参数传递 所以jvm会根据就近原则优先调用Student类中的 成员属性 name
return name;
}
void show() {
System.out.println("我的名字是 " + name);
}
}
在this() 内部传入实参 如果出现互相调用 则会递归调用
class Student{
String name; // 表示学生类对象的姓名
// 定义一个无参构造方法
Student(){
this("name");
System.out.println("我是无参构造方法");
}
Student(String name){
this();
this.name = name;
}
}
在java底层数据中 会有调用自己的对象例如
class Student{
int age;
Student getStudent() {
return this; // 相当于 Student s = new Student(); return s;
}
}
注意事项
- 引用类型变量用于存放对象的地址,可以给引用类型赋值为null,表示不 指向任何对象
- 当某个引用类型变量为null时无法对对象实施访问(因为它没有指向任何 对象)。此时,如果通过引用访问成员变量或调用方法,会产生 NullPointerException 异常(空指针异常)
方法递归调用(难点)
递归的基本概念
- 递归本质就是指在方法体的内部直接或间接调用当前方法自身的形式
注意事项
- 使用递归必须有递归的规律以及退出条件
- 使用递归必须使得问题简单化而不是复杂化
- 若递归影响到程序的执行性能,则使用递推(循环)取代之
封装(重中之重)
封装的概念
- 通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生活 不符
- 为了避免上述错误的发生,就需要对成员变量进行密封包装处理,来隐 藏成员变量的细节以及保证成员变量数值的合理性,该机制就叫做封装
封装的实现流程
- 私有化成员变量,使用private关键字修饰
- 提供公有的getter 和setter方法,并在方法体中进行合理值的判断
- 在构造方法中调用setter方法进行合理值的判断
- 代码实现
public class Student{
// 1.私有化成员属性 使用private关键字
private int id;
privat String name;
// 自定义无参构造方法
Student() {}
// 自定义全参构造方法
Student(int id, String name) {
setId(id);
setName(name);
}
// 2.设置公有的getter和setter方法,并在方法体中进行合理值的判断
public void setId(int id){
// 并在方法体中进行合理值的判断
if(id > 0){
this.id = id;
}else{
System.out.println("学号输入有误!!!");
}
}
public int getId(){
return id;
}
public void setName(String name) {
if( name != null){
this.name = name;
}
}
public String getNane(){
return name;
}
}
// Student 类的调用
public class StudentTest{
public static void main(String[] args){
// 1.声明Student类的引用对象
Student s = new Student();
// 2.调用setter方法对Student类中的成员方法进行赋值
s.SetId(1001);
s.setName("张三");
// 3.调用getter 方法获取Student类中的属性
int id = s.getId();
String name = s.getName();
// 4.打印输出结果
System.out.println("我的学号是 " + id + ",我的姓名是" + name + ",");
// 5.通过构造方法对方法进行赋值
Student s1 = new Student(-0001,"张飞");
// 6.打印输出结果
System.out.println("我的学号是 " + id + ",我的姓名是" + name + ",");
}
}
JavaBean的概念(了解)
- JavaBean是一种Java语言写成的可重用组件,其它Java 类可以通过反射机制发现和操作这些JavaBean 的属性
- JavaBean本质上就是符合以下标准的Java类
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的getter、setter 方法