黑马程序员java基础单例模式设计、继承与接口知识整合

来源:互联网 发布:淘宝马切达工作室 编辑:程序博客网 时间:2024/04/28 15:22
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

单例设计模式一:

先初始化对象      称为:饿汉式 

开发时一般重这种模式

Single类一进内存就已经创建好了对象。

class Single{private int num;public void setNum(int num){this.num = num;}public int gerNum(){return num;}private Single(){}                     //将构造函数私有化。private static Single s = new Single();//在类中创建一个本类对象public static Single getInstance()     //提供一个方法可以获取到该对象{return s;}}class SingleDemo { public static void main(String[] args) {    Single ss = Single.getInstance();  //ss  ss2指向堆内存中同                    一块内存Single ss2 = Single.getInstance();}}

 

单例设计模式二

对象是方法被调用时,才初始化,也叫做对象的延时加载。称为:懒汉式。

Single类进内存,对象还没有纯在,只有调用了getInstance方法时才建立对象(延迟加载)。

加锁为题,效率变低

class Single{private int num;public void setNum(int num){this.num = num;}public int gerNum(){return num;}private Single(){}                      //将构造函数私有化。private static Single s = null;         public static Single getInstance()     //提供一个方法可以获取到该对象{if(s==null)s = new Single();return s;}}... ...

此处插入线程知识:

加锁控制,防止同时执行

if(s==null){synchronized(Single.class){if(s==null)     s = new Single();}}return s;}

定义单例,建议使用饿汉式


多继承存在安全隐患

当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪一个

但是java保留了这种机制。并用接口来完成表示,多实现

 

名词:多层继承,也就是一个继承体系。

 

如何使用一个继承体系中的功能呢?

想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中共性功能。

通过了解共性功能,就可以知道该体系的基本功能。

那么这个体系已经可以基本使用了。

 

那么在具体调用时,要创建最子类的对象,为什么呢?

一是因为有可能父类不能创建对象。(抽象类 接口)

二是创建子类对象可以使用更多的功能,包括基本的也包括特有的

 

简单一句话:查阅父类功能,创建子类对象使用功能。

个人理解:子类在创建对象时,父类不会创建一个对象,但是会将父类中的成员变量以及构造函数,函数加载到子类对象分配的内存中。

 

重写:

1.子类重写父类,必须保证子类权限打于等于父类权限,才可重写以

2.静态只能覆盖静态

 

区分:

重载:只看同名函数的参数列表。

重写:子父类方法要一模一样。

 

重点:

子父类中的构造函数。

在对子类对象进行初始化时,父类的构造函数也会运行

因为子类的构造函数默认第一行有一条隐式的语句super();

Super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super()

 

为什么子类一定要访问父类中的构造函数?

 

因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化,要先访问一下父类中的构造函数。

如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定

 

for(int i = 0; i < 8; i++){final int x = i;System.out.println("被final修饰的x = "+ x);}

//运行结果0,1,2...

super语句一定定义在子类构造函数的第一行(初始化动作要先做)

 

子类的实例化过程:(必须掌握)

子类的所有的构造函数,默认都会访问父类中空参数的构造函数,

因为子类中每一个构造函数内的第一行都有一句隐式super();

当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定

访问父类中的构造函数,

当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。

 

Final

final修饰的类不可以被继承,为了避免被继承,被子类复写功能。

常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过——连接。

 

for(int i = 0; i < 8; i++){final int x = i;System.out.println("被final修饰的x = "+ x);}//运行结果0,1,2...

上面代码所反应的问题还未得到解决

 

抽象类中的方法不能被直接调用,必须由它的子类进行重写再进行调用。

子类继承抽象类必须重写父类中的所有抽象方法。

 

特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。


interface

 

接口:初期理解,可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示

 

接口定义时,格式特点:

1. 接口中常见定义:常量,抽象方法。

2.接口中的成员都有固定修饰符。

   常量:public static final

   方法:public abstract

注意:接口中的成员都是public的。

接口是不可以创建对象的,因为有抽象方法。

需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。

否则子类是一个抽象类。

 

多实现之所以可以实现:接口中方法没有方法体,就算有相同方法,但是可以被同一方法统一重写。

 

接口可以继承接口,接口可以多继承。




 

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击