Java基础2

设计模式:

对问题行之有效的解决方式,其实是一种思想。

1.单例设计模式

解决的问题:就是可以保证一个类在内存中的对象唯一性。

必须对于多个程序使用同一个配置信息对象时,就要保证对象的唯一性

如何保持对象唯一性?

1.不允许其他程序用new创建该类对象

2.在该类中创建一个本类实例

3.对外提供一个方法让其他程序可以获取该对象

步骤:

1.私有化该类构造函数

2.通过new在本类中创建一个本类对象

3.创建一个公有的方法,将创建方法返回

两种单例模式--->

class Single//类一加载,对象就已经存在

{

private static Single s = new Single();

private Single(){}

punlic static Single getInstance(){

return s;

}

}

class Single2

//类加载进来,没有对象,只有点用getInstance方法时,才会创建对象

//延迟加载形式

{

private static Single2 s = null;

private Single2 (){}

public Single2 getInstance(){}

if(s == null)

s = new Single2();

return s;

}

继承:

好处:

1.提高了代码的复用性

2.让类与类之间产生了关系,给第三个特征多态提供了前提。//封装继承多态

弊端:

打破了封装性

Java中支持单继承。不直接继承多继承,但对C++中的多继承机制进行改良。

单继承:

一个子类只能有一个直接父类。

多继承:

一个子类可以多个直接父类(Java不允许,进行了改良)

不直接支持多继承,是因为多个父类中有相同成员,会产生调用的不确定性

Java支持多重继承

C继承B---n B继承A

就会出现继承体系 当需要使用一个继承体系时,

1.查看该继承体系中的顶层类,了解该体系的基本功能

2.创建体系的最子类对象,完成功能的使用

什么时候定义继承呢?

当类与类之间存在所属关系的时候,就定义继承。

当本类的成员和局部变量重名用this区分

当子父类中的成员变量同名用super区分父类

super和this的用法很相似

this:代表一个本类对象的引用

super:代表一个父类空间

当子父类中出现成员函数一模一样的情况,会运行子类的函数。

这种现象,成为覆盖操作。这时函数在自父类中的特性。

函数的两个特性:

1.重载 同一个类中

2.覆盖 子类中,覆盖也称为重写。

覆盖注意事项:

1.子类方法覆盖父类方法时,子类权限必须大于等于父类的权限。

2.静态只能覆盖静态,或被静态覆盖。

什么时候使用覆盖操作?

1.对一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,就要使用覆盖操作。

子父类构造函数的特点:

在子类构造对象时,访问子类构造函数时,父类也运行。

reason:在子类构造函数第一行有一个默认的隐式语句---->super();

子类的实例化过程:子类中所有的构造函数默认都会访问父类中的空参数的构造函数。

为什么子类实例化过程要调用父类的构造函数?

因为子类继承了父类,获取了父类中的内容(属性),所以在使用父类内容之前要先看父类热河初始化的。于是在子类的函数中加入了super();如果父类中没有定义空参数构造,那么子类 的构造函数必须要用super明确调用父类中哪个构造函数。同时子类的构造函数中如果使用了this调用了本类构造函数时,那么super就消失。因为super和this都只能定义在第一行,所以只能有一个,但是,可以保证的是子类中肯定会有其他的构造函数访问父类的构造函数。

super必须要在子类构造函数的第一行

对象实例化过程

Person p = new Person();

1. JVM读取指定路径下的Person.class文件,并加载进内存,并会先加载Perso   n的父类(如果Person有父类)

2. 在堆内存开辟空间,分配地址值,

3. 并在对象空间中,对对象中的属性进行默认初始化。

4. 调用对应的构造函数进行初始化

5. 在构造函数中,第一行会先调用父类中构造函数进行初始化

6. 父类初始化完毕后,再对子类的属性就行初始化

7. 再进行子类构造函数的特定初始化

8. 初始化完毕后,降低至赋值给引用变量

final关键字:

1. final可以修饰类,方法,变量。

2. final修饰的类不可以被继承

3. final修饰的方法不可以被覆盖

4. final修饰的变量是一个常量,只能赋值一次

抽象类:

抽象类特点

1. 方法只有声明没有实现时,该方法就是抽象方法。=,需要被abstract修饰。抽象方法必须定义在抽象类中,该类必须也被abstract修饰

2. 抽象类不可以被实例化

3 抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类

抽象类:

1. 抽象类中有构造函数吗?

有,用于给子类对象就行初始化

2. 抽象类可以不定义抽象方法吗?

可以。(少见,目的---不让该类创建对象)

abstract class Demo

{

void show1(){}

void show2(){}

}

3. 抽象类关键字不可以和哪些关键字共存?

private

static 抽象类无意义 覆盖运行无意义

final 无法被覆盖

4. 抽象类和一般类的异同点?

相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员

不同点:

1.一般类有足够的信息描述事物--抽象类描述事物的信息可能不足

2.一般类中不能定义方法,只能定义非抽象方法

抽象类中可以定义一般方法,

3.一般类可以被实例化---抽象类不可以被实例化

5. 抽象类一定是个子类吗?

是的 因为需要子类覆盖其方法之后才可以被实例化


/*

1.对象: 程序猿:

属性:姓名 工号 薪水

行为;工作

经理:

属性:姓名工号 薪水 奖金

行为:工作

程序猿和经理不存在直接继承关系

但是程序猿和经理有着共性内容

可以进行抽取 因为他们都是公司的雇员

可以将程序猿和经理进行抽取建立体系

*/

//描述雇员

class Employee

{

private String name;

private Strign id;

private double pay;

Employee(String namem,String id,double pay)

{

this.name = name;

this.id = id;

this.pay = pay;

}

public abstract public void work();

}

//描述程序猿

class Programmer extends Employee

{

Programmer(String name,String id,double pay){

super(name.id,pay);

}

public void work(){

System.put.println();

}

}

//描述经理

class Manger extends Emmployee

{

private int bouns;

Manger(String name,String id,double pay)

{

super(name,id,pay);

this.bouns = bouns

}

public void work(){

};

}

你可能感兴趣的:(Java基础2)