默写:
1.编程题
自定义Point类,属性有:横坐标和纵坐标;行为有:无参构造方法、有参构造、打印所有属性值的方法、实现横坐标数值加1的方法、实现横坐标数值加上参数指定数值的方法、实现纵坐标减1的方法、实现纵坐标减去参数指定数值的方法。
要求在main()方法中分别使用两种方式创建对象,并调用上述方法。

今天内容:
(1)方法的传参和递归调用
(2)封装
(3)static关键字
(4)继承

1.方法的传参和递归调用
1.1 方法的传参(理解)
(1)main方法是程序的入口,因此先分配实参变量空间并初始化。
(2)调用方法时,为方法的形参变量分配内存空间。
(3)将实参变量的数值复制一份给形参变量,执行方法体。
(4)当调用方法结束时,释放形参变量内存空间,并将返回值返回给main方法
(5)main方法接收返回值,继续向下执行。

要求大家掌握:
当基本数据类型作为参数传递时,传递的是数据内容本身,因此形参改变不会影响到实参;
当引用数据类型作为参数传递时,传递的是引用记录的地址,因此形参指向的内容发生改变时,会直接对实参产生影响。
当引用数据类型作为参数传递后,若形参改变了指向再去改内容,则对实参无影响。

1.2 递归调用(重点)
(1)基本概念
递归本质上来说就是一种方法自己调用自己的过程。

案例:
编程实现n阶乘的计算并返回。
解析:

5! = 5 * 4 * 3 * 2 * 1;
   4! = 4 * 3 * 2 * 1;
   3! = 3 * 2 * 1;
   2! = 2 * 1;
   1! = 1;

   5! = 5 * 4!;
   4! = 4 * 3!;
   3! = 3 * 2!;
   2! = 2 * 1!;
   1! = 1;
总结:
   n! = n * (n-1)!;
   当n==1时,1! = 1;

(2)使用原则
a.分析规律并指定退出条件。
b.使用递归必须使得问题简单化而不是复杂化。
c.若递归影响程序的执行性能,则推荐使用递推替换之。

2.封装(重中之重 20遍)
2.1 基本概念
当自定义类中不做任何处理时,类外可以访问成员变量并指定一些合法但不合理的数值,为了避免这种错误的发生就需要对类中的成员变量进行密封和包装等处理,这种机制就叫封装。
通俗来说,封装就是一种保证成员变量值合理的技术。

2.2 封装的流程
a.私有化成员变量,使用private关键字修饰;
b.提供公有的get成员变量和set成员变量方法,并在方法体中进行合理性的判断;
c.在构造方法中调用set成员变量的方法来确保合理性;

3.static关键字(重点)
3.1 基本概念
通常情况下,成员变量都隶属于对象层级,也就是说每个对象都拥有独立的一份,若所有对象的某个特征都是一样的,则会造成内存空间的浪费,为了提高内存空间的利用率可以使用static关键字修饰该成员变量,表示静态的概念,此时该成员变量由对象层级提升为类层级,随着类的加载而准备就绪,被所有对象共享,与对象是否创建无关。
推荐使用 类名.静态成员 的方式进行访问。

3.2 使用方式
(1)对于非静态的成员方法来说,既能访问非静态的成员,也能访问静态的成员。
(成员 : 成员变量 + 成员方法)
(2)对于静态的成员方法来说,只能访问静态成员,不能访问非静态成员。
(3)static关键字不能随便加,只有隶属于类层级被所有对象共享时才能使用static修饰。

练习:
自定义Singleton类和TestSingleton类,要求在TestSingleton类中能得到且只能得到Singleton类的一个对象。

3.3 单例设计模式(重中之重 20遍)
(1)基本概念
在某些场合中,一个类对外提供一个且只提供一个对象时,这样的类叫做单例类。
编写单例类的模式/套路叫做单例设计模式,是编程经验的总结。

(2)实现流程
a.私有化构造方法,使用private关键字修饰。
b.提供本类的引用作为成员变量,并使用private和static共同修饰。
c.提供公有的get成员变量方法用于将本类对象返回出去。

(3)基本分类
单例设计模式分为两大类:饿汉式 和 懒汉式,以后的开发中推荐使用饿汉式。