一、每日说明
1.1课程简介
- 封装
- 构造方法
- this关键字
- static关键字
- 再谈变量
1.2课程收获
- 可掌握static关键字的特点
- 可掌握this关键字的特点
- 可理解引用数据类型及参数传递的过程
- 可理解构造方法的特点及作用
- 可理解封装的意义及封装的步骤
- 可掌握设计模式的概念及单例设计模式的实现方式
二、封装
- 面向对象的三大特性
- 封装
- 继承
- 多态
2.2封装的概念
- 封装就是隐藏类的内部信息(属性和方法),不允许外部程序直接访问,而是通过公有的方法才能完成访问(赋值方法get()和取值方法set())
2.1现象
使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。
2.1.1现象产生的问题
属性值被乱用了
2.1.2问题解决
对legs属性进行封装,在封装的过程为legs进行指定条件封装,然后对外提供公开调用
2.1.3结论
上述问题的解决采用的就是封装的思想,即把属性放在一个方法中,然后根据自己的需求进行特定条件的封装
- 适当的封装可以让类的内部信息(属性和方法)更安全,防止该类的数据(属性和方法)被其它类随意访问,封装可被认为是一个保护屏障
2.3属性的封装
- 操作步骤如下
2.3.1第一步
- 将实例变量编写为private,也就是实例变量只能在本类中使用,因为private表示私有的。
- private的含义
- private是一个权限修饰符,代表最小权限。
- 可以修饰成员变量和成员方法。
- 被private修饰后的成员变量和成员方法,只在本类中才能访问。
2.3.2第二步
- 编写对应访问实例变量的方法
光标放在类中,按alt+insert键,选择第四项getter and setter,然后回车键,则生成取值和赋值方法getXXX和setXXX
大多数情况,一个实例变量对应一个get方法和一个set方法
2.4方法的封装
如果类中的方法只是在本类中被调用,而不允许在外部被访问,那么此时就可以将方法进行封装。
- 将实例方法编写为private,也就是实例方法只能在本类中使用,因为private表示私有的。
2.5 封装总结
所谓的封装,就是利用private关键字去修饰属性或者方法 ,被private关键字去修饰的属性或者方法只能在本类中被访问。
2.6类声明的建议
- 若有属性建议private私有
- 提供用来操作属性或者方法的公有的set()和get()方法
- 提供无参数的构造方法
2.7封装本质
将类中的属性或者方法用private修饰(私有化),并提供公有的set()、get()方法。
2.8 随堂练习
创建程序,在其中定义两个类:Person和PersonTest类。定义如下:
用setAge()设置人的合法年龄(0~130),用getAge()返回人的年龄。
在 PersonTest 类 中实例化 Person 类的对象 b , 调 用 setAge() 和
getAge()方法,体会Java的封装性。
- 类的成员之三-构造方法
- 相关疑问
- 构造方法是什么?
- 构造方法的作用是什么?
- 构造方法相关注意事项是什么?
- ……
3.1需求
- 编写电脑类
- 属性:颜色、品牌、尺寸、价格
- 方法:输出电脑信息
- 编写电脑测试类
- 创建电脑对象,调用方法输出电脑信息
- 完成属性赋值,并调用方法再次输出电脑信息
- 继续创建电脑对象,完成对属性的赋值,调用方法输出电脑信息
3.1.1代码实操v
3.1.2结论
- 有多少属性,这样的赋值操作就有多少行?(优化)
3.2什么是构造方法
- 构造方法是一个特殊的方法,主要特殊点如下
- 构造方法的名字与类的名字一致
- 它不声明返回值类型。(与声明为void不同)
- 不能被static、final、synchronized、abstract、native修饰,
- 不能有return语句返回值
3.3构造方法的分类
3.3.1有参数的构造方法
public 类名(参数1,参数2,参数3){
}
3.3.2无参数的构造方法
public 类名(){
}
3.4构造方法的作用
- 完成对属性的赋值操作
构造器的作用:创建对象;给对象进行初始化
如:Order o = new Order(); Person p = new Person(“Peter”,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的
构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自
动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们
要“洗澡”了。
3.5构造方法如何执行
- 当new时若后面小括号没有内容,则执行无参数的构造方法,否则执行相匹配的带参数的构造方法。
- 代码实操
3.6构造方法注意事项
3.6.1注意事项1
当一个类被创建时,则系统就会提供一个默认的无参数构造方法,也称之为隐士构造方法,直白一点说,就是当一个类中没有人为的编写构造方法时,则会存在一个默认无参数的构造方法。
3.6.2注意事项2
但是,当在一个类中编写了有参数的构造方法,则系统就不会提供默认的无参的构造方法了。
3.7结论
当创建一个类时,建议把无参数的构造方法写上,然后再编写有参数的构造方法,避免当有参存在而认为无参还默认存在而使用无参构造时产生编译错误的行为。
3.8 练习
3.8.1 练习一
编写两个类,TriAngle和TriAngleTest,其中TriAngle类中声明私有的底
边长base和高height,同时声明公共方法访问私有变量。此外,提供类
必要的构造器。另一个类中使用这些公共方法,计算三角形的面积。
3.8.2 练习二
- 写一个人的类
属性:名字,性别,年龄;提供无参的构造器和一个有参的构造器
方法:(1)自我介绍的方法(2)吃饭的方法
创建一个对象“张三”
3.8.3 练习三
- 写一个汽车类:
属性:品牌;车长;颜色;价格;
创建五个对象:“捷达”,“宝马”,“劳斯莱斯”,“科鲁兹”,“迈锐宝”
提供无参的构造器和一个有参的构造器
3.8.4 练习四
- 写一个课程类:
属性:课程名;学时;任课老师;
创建五个对象:“c语言”,“java编程”,“php网络编程”,“c++”,“数据结构”
提供无参的构造器和一个有参的构造器
3.9构造方法的重载特性
3.9.1构造方法回顾
3.9.2什么是构造方法的重载
在同一个类中至少出现2个或者2个以上的参数列表必须不同的构造方法,这里的参数列表包括参数的个数、参数类型、参数类型顺序三要素,三要素若仅有一要素不同,那么就构成方法的重载。
3.9.3构造方法重载的好处
3.9.4方法重载的情况
3.9.4.1情况一
参数类型,参数顺序相同时,但是参数个数不同。
3.9v.4.2情况二
参数类型,参数个数相同时,但是参数类型顺序不同。
3.9.4.3情况三
参数个数相同时,但是参数类型顺序或者参数类型不同。
3.10构造方法构成重载时,执行时构造方法的确定
当构造方法构成重载时,如何确定执行的是哪个构造方法
- 在调用重载的构造方法时,会自动根据传入的实参找相匹配的构造方法执行。
- 代码实操v
3.11构造方法的快捷键
光标放在类中,按alt+insert,选择第一项Constructor(构造器、构造方法、构造函数),然后按回车键
3.11.1情况一
然后再按两次tab键,回车,则出现无参构造方法,大多数情况下,无参构造方法没特殊要求不编写任何语句
3.11.2情况二
鼠标左键点击第一个要赋值的属性,然后再按左键点击其它要赋值的属性,最后按回车键,则生成带参数的构造方法,完成对部分属性赋值
3.11.3情况三
按ctrl+A表示全选,再按回车键,则生成带参的构造方法,完成对所有属性赋值
3.12随堂练习
(1)定义Student类,有4个属性:
String name;
int age;
String school;
String major;
(2)定义Student类的3个构造器:
第一个构造器Student(String n, int a)设置类的name和age属性;
第二个构造器Student(String n, int a, String s)设置类的name, age 和school属性;
第三个构造器Student(String n, int a, String s, String m)设置类的name, age ,school和major属性;
- 在main方法中分别调用不同的构造器创建的对象,并输出其属性值。
3.13总结:属性赋值过程
截止到目前,我们讲到了很多位置都可以对类的属性赋值。现总结这几个位
置,并指明赋值的先后顺序。
赋值的位置:
① 默认初始化
② 显式初始化
③ 构造器中初始化
④ 通过“对象.属性“或“对象.方法”的方式赋值
赋值的先后顺序:
① - ② - ③ - ④
3.14 JavaBean
JavaBean是一种Java语言写成的可重用组件。
所谓JavaBean,是指符合如下标准的Java类:
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、set方法
用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP 页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
MySQL Java语言(对象)-程序-操作数据库(字段)
映射关系
3.15拓展知识:UML类图
3.16 this关键字在构造方法中的使用
3.16.1说明一
使用this关键字可以访问本类中的构造方法
3.16.2说明二
当this后面小括号中没有参数时,则执行本类无参数的构造方法
当this后面小括号中有参数时,则执行本类相匹配的带参构造方法
3.17构造方法的总结
- 什么是构造方法
- 构造方法的分类
- 构造方法的作用
- 构造方法的执行
- 构造方法的注意事项
- 构造方法构成重载的要素
- 构造方法的好处
- 构造方法的快捷键的使用
四、this关键字
4.1 需求:局部变量和成员变量同名问题
4.1.1说明
c
4.1.2代码实操
-
- this在java中代表正在调用类中某个方法的对象,换句话说:“当前哪个对象调用了这个方法,则this就是代表谁”
4.1.3局部变量和成员变量同名时的区分
- 通过this关键字区分
4.2说明
- this在Java中代表的是当前对象,也就是说:当前谁调用这个方法则这个对象就是谁
- this关键字可以访问本类中的实例变量、实例方法以及本类中的构造方法
4.3使用方向
4.3.1 this关键字访问本类中的实例变量
- 什么是实例变量?
当属性前面没有编写static关键字时,称为实例变量,也叫做对象的变量
当属性前面编写static关键字时,称为静态变量。
- 实例变量什么时候存在?
当创建对象时,在堆内存空间地址中存储。
4.3.2 this关键字访问本类中的实例方法
- 什么是实例方法?
方法没有编写static,称为实例方法,也就是对象方法
如果方法面前编写static,称为静态方法
4.3.2 this关键字访问本类中的构造方法
4.4 this关键字的注意事项:
- 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其
它的构造器!
- 明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
- 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了
"this(形参列表)"
- "this(形参列表)"必须声明在类的构造器的首行!
- 在类的一个构造器中,最多只能声明一个"this(形参列表)"
4.5 随堂练习
五、static关键字
5.1生活中的数据共享
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象, 其方法才可以供外部调用。
我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。
例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
5.2需求
class Circle{
private double radius;
public Circle(double radius){this.radius=radius;}
public double findArea(){return Math.PI*radius*radius;}
}
- 创建两个Circle对象
Circle c1=new Circle(2.0); //c1.radius=2.0
Circle c2=new Circle(3.0); //c2.radius=3.0
Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,不能被同一个类的不同对象所共享。
上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius
变化不会影响c2的radius,反之亦然。
如何让一个类的所有实例共享数据?
如果想让一个类的所有实例共享数据,就用类变量!
static修饰的全局变量(属性)就是类变量
5.3认识static关键字
- static表示静态的
- 可以修饰属性、方法、代码块、内部类以及实现静态导入
5.4 static关键字修饰全局变量(重点)
5.4.1 静态变量的描述
- 在类中声明的变量,称为属性或者叫做成员变量、或者叫做字段。那么属性面前如果加入static关键字修饰,称为静态变量,也叫做类的变量。
- 如果属性前面没有编写static关键字,称为实例变量,也叫做对象变量
5.4.2 静态变量的访问方式
- 类名.静态变量名
- 对象名.静态变量名
5.4.3 问题解决:如何让一个类的所有实例共享数据?
v如果想让一个类的所有实例共享数据,就用类变量!
static修饰的全局变量(属性)就是类变量
- 类变量应用举例
public class Person {
private int id;
public static int total;
public Person() {
total++;
id = total;
System.out.println("total:"+total);
}
public static void main(String args[]){
Person tom = new Person();
Person jane = new Person();
/**
* 如何去访问类中的成员呢?
* 比如:id、total
*/
tom.id = 0;
total = 100; //不用创建对象就可以访问静态成员
}
}
- 疑问:静态变量和实例变量的区别
5.4.4 静态变量和实例变量的区别
5.4.4.1相同点
都是变量
5.4.4.2不同点
静态变量对于类而言在内存中只有一个,能被类的所有实例所共享。
实例变量对于类的每个实例都有一份,它们之间互不影响。
public class Person {
private int id;
public static int total;
public Person() {
total++;
id = total;
System.out.println("total:"+total);
}
public static void main(String args[]){
Person tom = new Person();
Person jane = new Person();
/**
* 如何去访问类中的成员呢?
* 比如:id、total
*/
tom.id = 0;
total = 100; //不用创建对象就可以访问静态成员
}
}
(当对象名中的值为null时,依然可以访问静态变量名,不会出现空指针异常,原因就是静态变量不属于某一个对象,而是当前这个类的所有对象都可以共享。)
public class Person {
private int id;
public static int total;
public Person() {
total++;
id = total;
System.out.println("total:"+total);
}
public static void main(String args[]){
Person tom = new Person();
Person jane = new Person();
/**
* (当对象名中的值为null时,依然可以访问静态变量名,不会出现空指针异常,原因就是静态变量不属于某一个对象,
* 而是当前这个类的所有对象都可以共享。)
*/
tom = null;
tom.total = 0;
tom.id = 0;
}
}
静态变量在加载类的过程中为静态变量分配内存,实例变量在创建对象时分配内存,所以静态变量可以使用类名来直接访问,而不需要使用对象来访问。
5.4.4.3类变量 vs 实例变量内存解析
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象, 其方法才可以供外部调用。
我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。
例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
5.4.5 静态变量的设置场景
什么时候将全局变量(属性)设置为静态的。
- 当一个变量需要被类的所有实例所共享时。建议:该变量编写为静态变量。
- 原因:节省空间
5.5 static关键字修饰方法
5.5.1 静态方法的描述
- 如果方法前面编写static关键字,称为静态方法,也叫做类的方法。
- 如果方法前面没有编写static关键字,称为实例方法,也叫做对象的方法
5.5.2 静态方法的特点
- 没有对象的实例时,可以用类名.方法名()的形式访问由static修饰的类方法。
- 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
- v
- 实例方法中可以访问:静态变量和静态方法,也可以访问实例变量和实例方法
- 因为不需要实例就可以访问static方法,因此static方法内部不能有this。
static修饰的方法不能被重写 继承
5.5.3 静态方法的访问方式
- 类名.静态方法名
- 对象名.静态方法名
5.5.4 方法设置为static的场景
- 一般在编写工具类中的工具方法时,会将该方法编写为静态方法,原因:使用类名.比较方便
- Math类
- java.lang.Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。
- Arrays类
- java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。
- Math类
5.5.5 单例 (Singleton)设计模式
5.5.5.1 需求
如何让某个类只能存在一个对象实例。比如说:
5.5.5.2 设计模式
设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、
以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典
的棋谱,不同的棋局,我们用不同的棋谱。”套路” 。
5.5.5.3 单例设计模式解读
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对
某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
5.5.5.4 单例设计模式实现-饿汉式
5.5.5.5 单例设计模式-懒汉式
5.5.5.6 单例模式的实现步骤如下:
构造方法私有化:我们首先必须将类的构造器的访问权限设置为private。这样,就不能用new操作符在类的外部产生类的对象了。
提供公有的静态方法返回内部创建的对象:但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象。
声明要声明为静态的:静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
5.5.5.7 单例设计模式的优点
由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的
产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可
以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方
式来解决。
举例 java.lang.Runtime
5.5.5.8 单例设计模式的应用场景
- 网站的计数器,一般也是单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志
文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
- 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库
资源。
- 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置
文件数据,都生成一个对象去读取。
- Application 也是单例的典型应用
- Windows的Task Manager (任务管理器)就是很典型的单例模式
- Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
5.6理解main方法中的语法
由于Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是
public,又因为Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static的,该方法接收一个String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数
又因为main() 方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在之前的例子中多次碰到。
5.7 static关键字实现静态导入
- 在一个类中如果想直接使用其它类中的静态变量,则就必须要实现静态导入
5.8 static关键字修饰内部类
此处放在接口后讲
- 类的成员之四:代码块
6.1什么是代码块
- 代码块是一种常见的代码形式。它用大括号“{}”将多行代码封装在一起,形成一个独立的代码区,这就构成了代码块。
6.2代码块作用
对Java类或对象进行初始化
6.3代码块的分类
一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块
(static block sb),没有使用static修饰的,为非静态代码块。
static代码块通常用于初始化static的属性
v6.4静态代码块的执行
- 静态代码块不需要我们人为的调用执行,因为没有名字。当类加载到内存时,执行静态代码块,并且只执行一次。并且在构造器执行之前。v
6.5总结
- 代码块的作用
匿名代码块的作用是给对象的成员变量初始化赋值,但是因为构造器也能完成这项工作,所以匿名代码块使用的并不多。
- 静态代码块的作用
静态代码块的作用是给类中的静态成员变量初始化赋值。
注:在构造器中给静态变量赋值,并不能保证能赋值成功,因为构造器是在创建对象的时候才指向,但是静态变量可以不创建对象而直接使用类名来访问。
七、再谈变量
7.1 回顾
7.1.1作用
- 存储指定类型数据的
- int a = 1024;
7.1.2 变量的分类
7.1.2.1数据类型划分
7.1.2.2所有变量划分
- 按照声明的位置划分
- 局部变量:在方法中声明
- 成员变量:在方法外面即在类中声明的变量,称为成员变量也叫做属性。
- 代码实操
- 说明:本质上依然是变量,用来存储数据的,只是声明的位置不同而已。
- 作用范围不同
- 局部变量:在当前声明距离最近的大括号内使用
- 全局变量:在当前类中可以直接使用
- 代码实操
- 结论:
- 局部变量:作用范围相对更小
- 成员变量:作用范围相对更大
- 初始值不同
- 成员变量:当创建对象后,如果成员变量也就是属性没有赋值,则是取默认值,数据类型的不同,默认值也不同
- 局部变量:没有默认值,也就是,必须先声明然后再赋值,最后才可以使用
- 代码实操:
v
7.2 引用数据类型
7.2.1描述
- 除了基本数据类型之外 ,凡是能合法存在数据类型位置的,都是引用数据类型。
- 比如:String
7.2.2好处
- 可以让参数类型的选择更灵活:多态
7.2.3引用类型的组成
7.2.4类
7.2.4.1系统提供的类
- 比如:String、System、Scanner……
7.2.4.2用户自定义的类
- 比如:Car、Student、Computer、Book Account
7.2.5 代码实操
- 类,类型作为引用数据类型时的代码实操
7.2.5.1系统提供的类
- 比如:String
7.2.5.2 用户自定义的类
比如:Grade
/*
编写年级类
属性:年级编号、年级名称、年级地址
构造方法:无参、带参
方法:输出年级的所有信息
*/
/*
编写学生类
属性:姓名、年龄、性别、年级
构造方法:无参、带参
方法:输出学生的所有信息(姓名、年龄、性别、年级名称、年级地址)
*/
/*
出现运行错误,空指针异常
原因:当创建学生对象时,如果没有对属性stuGrade赋值时,则是默认值null,因此没有存对象的地址,也就没有指向某个对象,不能访问对象中的属性或方法
解决办法:建议在无参构造方法中完成对属性stuGrade赋值
*/
7.2.6参数传递的过程
7.2.6.1基本数据类型修饰参数传递
- 得到结论:
- 当是基本数据类型时,在内存中存放的是真正的值
- 当是基本数据类型作为参数进行传递时,实参传递给形参的是真正的值,也就是:相当于复制一份。
- 当另一个方法中局部变量的值发生改变,不会对原来方法中局部变量的值更改,因为它们都是独立的,没有影响。
7.2.6.2引用数据类型修饰参数传递
- 得到结论:
- 当是引用数据类型时间在内存中存放的是地址
- 当引用数据类型作为参数进行传递时,实参传递给形参的是地址,也就是:实参与形参存放同一个地址,指向同一个对象,也就是说:当另一个方法中对象
的属性值发生改变,对原来方法中对象的属性值有影响
7.2.7基本数据类型和引用数据类型的区别
7.2.7.1外在区别
- 基本数据类型
- 分为3大类,共计8种数据类型
- 引用数据类型
-
- 分为3大类,共计3种数据类型
-
-
-
- 类
- 系统提供的类,比如:String、System、Scanner ........
- 用户自定义的类,比如:Car、Student、Book、Computer.......
- 类
-
7.2.7.2内在区别
- 基本数据类型
-
- 在内存中存放的是真正的值 值传递
-
- 引用数据类型
-
- 在内存中存放的是地址(引用) 址传递
-
7.2.8 引用数据类型相关注意事项
7.2.8.1引用数据类型的赋值方式
-
- 创建对象,将对象的地址赋给左侧的已经声明好的引用名称(引用对象名称)
7.2.8.2 避免控制针异常的产生
- 说明
- 空指针异常属于运行错误,java.lang.NullPointerException
- 将null值赋给左侧的引用名称,再去调用属性或者方法
- 出现原因
- 当前引用名中存放的是null,也就是:没有存放某个对象的地址,没有指向某个对象,则就必须不能访问对象中的属性或者方法,如果非要访问则就出现空指针异常。
- 解决办法
在访问对象中的属性或方法之前必须保证引用名中存放的是地址,也就是引用名中存放的地址非空(非null)
7.3 强化方法参数传递
7.3.1 强化一
7.3.2 强化二
- 貌似是考查方法的参数传递
7.4 递归(recursion)方法
递归方法:一个方法体内调用它自身。
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执
行无须循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死
循环。
11月25日