P.S.
1、如果想把一个类进行文档化,该类必须是public的。
2、私有的方法在文档中不会体现,例如ArrayTool类中的swap方法。
3.11 单例设计模式
设计模式:对问题行之有效的解决方式,其实,它是一种思想。
单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
如何保证对象唯一性呢?
1、不允许其他程序用new创建该类对象。
2、在该类创建一个本类实例。
3、对外提供一个方法让其他程序可以获取该对象。
步骤:
1、私有化该类构造函数。
2、通过new在本类中创建一个本类对象。
3、定义一个公有的方法,将创建的对象返回。
示例(饿汉式):
- class Single{
- //类已加载,对象就已经存在了
- private static Single s = new Single();
- private Single(){}
- public static Single getInstance(){
- return s ;
- }
- }
- class SingleDemo{
- public static void main(String[] args){
- Single s1 = Single.getInstance();
- Single s2 = Single. getInstance();
- System.out.println(s1 == s2);
- }
- }
复制代码 运行结果:
P.S.
之所以不用Single.s;的方式获取Single对象,而采用getInstance获取是因为在getInstance方法中我们可以做一些判断来决定是否返回Single的对象,也就是实现了对单例对象的可控。所以,给Single的构造方法加上了private限制,禁止使用者直接采用Single.s;的方式获取。
示例(懒汉式):
- class Single{
- //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象
- //延迟加载形式
- private static Single s = null;
- private Single(){}
- public static Single getInstance(){
- if(s == null)
- s = new Single();
- return s ;
- }
- }
- class SingleDemo{
- public static void main(String[] args){
- Single s1 = Single. getInstance();
- Single s2 = Single. getInstance();
- System.out.println(s1 == s2);
- }
- }
复制代码 运行结果:
4、继承
4.1 继承的描述
通过 extends 关键字让类与类之间产生继承关系。
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。多个类可以称为子类,单独这个类称为父类或者超类。
P.S.
1、子类可以直接访问父类中的非私有的属性和行为。
2、子类无法继承父类中私有的内容。
3、父类怎么来的?共性不断向上抽取而来的。
示例:
- class Person{
- String name;
- int age ;
- }
- class Student extends Person{
- void study(){
- System.out.println("student study..." + age);
- }
- }
- class Worker extends Person{
- void work(){
- System.out.println("worker work..." + age);
- }
- }
- class ExtendDemo{
- public static void main(String[] args){
- Student s = new Student();
- s. name = "zhangsan" ;
- s. age = 20;
- s.study();
- Worker w = new Worker();
- w. name = "lisi" ;
- w. age = 30;
- w.work();
- }
- }
复制代码 运行结果:
好处:
继承的出现提高了代码的复用性。
继承的出现让类与类之间产生了关系,提供了多态的前提。
4.2 继承的特点
Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
原因:
因为多继承容易出现问题。两个父类中有相同的方法,子类到底要执行哪一个是不确定的。
示例:
- class A{
- void show(){
- System.out.println("a" );
- }
- }
- class B{
- void show(){
- System.out.println("b" );
- }
- }
- class C extends B,A{
- }
复制代码
那么创建类C的对象,调用show方法就不知道调用类A中的show方法还是类B中的show方法。所以java不支持多继承,但将这种机制换了另一个安全的方式来体现,也就是多实现(后面会详细说明)。
Java支持多层继承(继承体系):
C继承B,B继承A,就会出现继承体系。
多层继承出现的继承体系中,通常看父类中的功能,了解该体系的基本功能,建立子类对象,即可使用该体系功能。
定义继承需要注意:
不要仅为了获取其他类中某个功能而去继承,类与类之间要有所属( "is a")关系。
4.3 super关键字&函数覆盖
在子父类中,成员的特点体现:
1. 成员变量
this和super的用法很相似。
this代表本类对象的引用。
super代表父类的内存空间的标识。
当本类的成员和局部变量同名用this区分。
当子父类中的成员变量同名用super区分父类。
示例:
- class Fu{
- private int num = 4;
- public int getNum(){
- return num ;
- }
- }
- class Zi extends Fu{
- private int num = 5;
-
- void show(){
- System.out.println(this.num + "..." + super.getNum());
- }
- }
- class ExtendDemo{
- public static void main(String[] args){
- Zi z = new Zi();
- z.show();
- }
- }
复制代码 运行结果: