设计模式:就是解决某一类问题行之有效的思想。
单例设计模式:
解决问题:保证一个类在内存中的对象唯一性。
应用:可以实现数据共享。
思路:
1,不让其他应用程序建立该对象。
2,本类建立一个本类对象。
3,对外提供一个方法让其他应用程序获取该对象。
代码体现:
1,将构造函数私有化。
2,创建本类对象,私有并静态。
3,定义静态方法返回该对象。
//饿汉式。
class Single
{
private static Single s = new Single();
private Single(){}
//为什么要定义该方法呢?是为了控制对s这个对象访问。
public static Single getInstance()
{
return s;
}
}
//懒汉式.对象的延迟加载。面试的常见考点。
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
s = new Single();
return s;
}
}
---------------------------
继承:
好处:
1,提高了代码的复用性。
2,让类与类之间产生了关系,这也是多态的前提。
弊端:
打破了封装性。
继承在java中的特点:
1,java只支持单继承,不支持多继承。
其实不支持多继承的原因是:因为调用的不确定性。
所以java改良了多继承,用另一种方式来体现,叫做 多实现。
2,java支持多层继承。
方便于大家使用一个继承体系的功能。
1,查阅顶层类中的功能(共性功能)。
2,建立子类对象完成功能的调用。
什么时候定义继承呢?
当类与类之间有所属(is a)关系时,就可以继承。
A是B中的一种:A就可以继承B。
子父类的出现成员的特点:
1,成员变量:当子父类中出现了同名变量时,可以用super来表示父类中的变量。
一般不常见,因为父类都定义完了,子类不需要在重新定义。
2,成员函数:当子类和父类出现一模一样的函数时, 这时会有一个函数的特性:覆盖override(复写,重写)
覆盖的注意事项:
1,子类覆盖父类的方法,必须权限要大于等于父类。
2,静态只能覆盖静态。(最好不要出现静态覆盖)
3,构造函数(子类的实例化过程):
子类的所有构造函数默认都会访问父类中空参数的构造函数。
原因:因为子类的构造函数的第一行都默认有一个条件隐式的语句 super();
为什么子类的构造函数非要访问父类的构造函数呢?
因为子类会获取到父类的数据,所以要先看父类是如何对该数据进行初始化的。
如果父类中没有空参数构造函数,那么子类构造函数需要通过super语句访问父类中指定的构造函数。
super和this的特点:
两个关键字的用法很相像。
但是有本质的区别:
this:代表的是本类的对象。
super:代表的是父类的存储空间,也就是给父类加上了一个标识。
------------------------
final:最终化。
特点:
1,final可以修饰类,函数,变量。
2,final修饰的类不能被继承。
3,final修饰的函数不能被覆盖。
4,final修饰的变量是一个常量,只能赋值一次。(这里指的赋值是显示赋值).
其实就是给一些固定的常量值起个容易阅读的名称。
该名称的规范是所有字母大写。如果由多个单词组成,中间用_连接
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
---------------------------------------------
抽象类
由来:
事物不断向上抽取而来,在抽取功能的过程中,只抽取了功能的定义,而没有抽取的功能的实现。
这时该功能就是抽象的。抽象功能只能定义在抽象类中。
特点:
1,抽象类中可以存储抽象方法。
2,抽象类不可以实例化,因为调用抽象方法没意义。
3,抽象类必须由自己的子类覆盖了所有的抽象方法后,其子类才可以实例化。
练习:
猫:叫:喵喵。
狗:叫:汪汪。
两个事物都具备叫的功能。
向上抽取去一个父类 动物。
动物本身就是一个不具体的事物,动物都具备叫的功能,但是怎么叫不确定,也就是不具体。
这时动物就是一个抽象事物,叫就是一个抽象的功能。
abstract class Animal
{
abstract void jiao();
}
class Cat extends Animal
{
public void jiao()
{
System.out.println("喵喵");
}
}
class Dog extends Animal
{
public void jiao()
{
System.out.println("汪汪");
}
}
抽象类涉及的问题:
1,抽象类是一个父类?
是,必须由子类去覆盖抽象方法才可以实例化。
2,抽象类中是否有构造函数?
有,虽然抽象类不可以实例化,但是其子类有可能实例化,抽象类中的构造函数是给子类进行初始化。
3,抽象关键字不可以和哪些关键字共存?
1,final 2,static,3,private.