JAVA_Lesson8(传智播客笔记之继承、单例设计模式懒汉式、饿汉式)

数组对象工具的建立(重要的是这种思想)

主函数是静态的,主函数需要调用的也需要static

当有2.java文件时,先编译含有函数功能的.java文件,再编译含主函数的.java文件。(因为主函数中要用到该函数)

Question:编译含main.java文件,会出现2.class文件?

其实系统已经帮你做过来了这个事情。(java编译器发现该类中用到了其他类,会去classpath或者.(当前目录)下去找,若没有仍然没有会去和这个类名相同的.java文件,找到后再对其进行编译。)

   有些类中只提供了工具和方法,一个非静态方法都没有,全是静态的。那么就用static,不需要创建对象(也可以创建,就是有点多余,没有意思)那么干脆就不让你创建对象,可以在类中的构造函数私有化使用return语句(对象一创建就需要初始化)。

文档注释(这一集没有细看):

Javadocjava安装目录下Bin文件下的一个工具)可以提取文档注释。

 面向对象(单例设计模式)

设计模式:对问题行之有效的解决方式都记录下来,比较通用的东西。(对产生的问题优化的过程记录下来了)

单例设计模式:解决的问题:可以保证一个类在内存中的对象唯一性

需求分析:什么时候需要保证类在内存中的对象唯一性呢?就是想实现配置信息的共享操作(就是A对配置信息操作过后能保存,B对配置信息操作时和A初步对配置信息创建的对象不一样)  解决方案:用全静态(生命周期过长,不能采纳这样的方法)。

如何保证对象的唯一性:

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

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

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

步骤(牛人已经想好了的办法):

1. 私有化该类构造函数。(让其无法初始化对象)

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

3. 定义一个公有的方法,将创建的对象返回。

Class Single

{

    Static Single s=new Single(); //步骤2 类名调用的前提

     Private Single()   //步骤1

    {

    }

    Public static Single getInstance() 类名调用的前提

    {

        Return s;   //步骤3

    }

 }

Class SingleDemo

{

    Public static void main(String[] args)

    {

         New Single().getInstance();(无法new了,人家已经私有化了。我们是不能创建对象,可以考虑类名调用)

        Single ss=Single.getInstance();//这样我们就拿到了这个类的实例。

        Single ss=Single.s;//右边因为是静态变量,可以直接引用。这样做虽然可以用,但是不可控。用上面的可以给获取实例加入一些条件,往实参里面传入参数,符合就给你用,不符合就不让你用。有了方法就有了可控的可能,例如可以在方法中加入if。
 }

 }

 

可以测试:

Single s1=Single.getInstance();

Single s2=Single.getInstance();

Sop(s1==s2); //测试结果为真,可以保证唯一性。

内存图解:

 

 

单例设计模式(懒汉式)

 Class Single  //类一加载,对象就已经存在了。饿汉式(开发多用这个,懒汉式被多线程并发访问时,有可能不能保证对象的唯一性,存在安全隐患)用单例的模式就是为了获取你对象的。

{

    Static Single s=new Single(); //步骤2 类名调用的前提

     Private Single()   //步骤1

    {

    }

    Public static Single getInstance() 类名调用的前提

    {

        Return s;   //步骤3

    }

 }

 饿汉式

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

//延迟加载形式(面试多考这个)懒汉式

{
    Private static Single2 s=null;

    Private Single2()

    {

    }

    Private static Single2 getInstance()

    {

        If(s==null)

        S=new Single2();

        Return s;

   }

}

继承

面向对象的三大属性:(封装、继承、多态)

父类(基类、超类

继承好处:1.提高代码的复用性

2. 类与类之间产生关系,给多态产生前提。(没有继承就没有多态。)

继承就是向上不断抽取共性的过程。

单继承与多继承

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

单继承(一个子类只能有一个直接父类)

多继承(一个子类中有多个直接父类,java中对其进行改良了) 因为当2个父类中有2个相同的方法时,子类中调用时不知道该调用哪一个。但是java支持多重继承。

当要使用一个继承体系时:

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

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

java中多继承是通过“多实现”来实现的。

定义继承

什么时候定义继承?  存在着所属关系的时候(xxxyyy中的一种),就定义继承。

子类中成员变量的特点:

Class Fu

{

    Int num=4;

}

Class Zi extends Fu

{

    Int num=5;

    Void show()

    {

        Sop(num+”...”+num);

    }

}

Class ExtendsDemo2

{

    Public static void main(String[] args)

    {

        Zi z=new Zi();

        Z.show();

    }

}

打印结果为:5...5(自己本空间有就不去父类找)跟我猜测的结果一样

但是并不是覆盖了。但是怎么去操作父类中的num呢?

当本类的成员和局部变量重名用this区分,类似的,当子类中的成员变量同名用super来区分。Thissuper的用法很相似 。

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

Super:代表了一个父类空间。

子父类内存图解(了解即可,开发中用的很少,父类有的一般子类不会重新写,一般拿来直接用即可,而且通常情况下num均是私有的,直接使用setNumber方法和getNumber方法即可)

 

子类不能直接访问父类私有内容。但是可以通过super.getNumber()可以访问。(但是面试常见

子父类成员函数特点:

 

    但是特殊情况,子类和父类中成员函数一致时。会运行子类函数,类似于“覆盖”,但是不属于覆盖,这是函数在子父类中的特性(函数有2个特性:1.重载。同一个类中2.覆盖:子类中,覆盖也称之为重写)。直接运行自己的成员函数即可:

 

覆盖的前提:函数声明必须得一致,而重载不区分函数返回值类型。

覆盖注意事项:

1. 子类覆盖父类方法,子类权限必须要大于等于父类权限。(publicprivatae以及默认权限)

2. 当权限相同时,若父类的方法为static时,子类不能对其覆盖。或者子类单方为static也不行,只有当双方都为static才可以覆盖。(这种情况很少见,等学了多态就清楚原因

什么时候使用覆盖操作?

     不建议对源代码进行直接修改,可以再搞一个类。当对一个类进行子类的拓展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有功能,就要用覆盖操作来完成。

 

 

猜你喜欢

转载自blog.csdn.net/wearlee/article/details/80587690
今日推荐