JavaSE中设计模式单例、接口、多态的学习笔记

JavaSE中设计模式单例、接口、多态的学习笔记

这是我学习JavaSE 的第十天,以下是我的学习笔记,欢迎大家指正,一起学习。

作者:兰兴星
编辑:兰兴星

想学更多JavaSE方面的 知识,欢迎关注的我的微信公众号:星悟脑

学习笔记

上一期知识点回顾:

面向对象的三大特性:

​ 封装(属性私有化private,get set方法,命名规则) 提高代码的可读性

​ 继承 原理(子类父类的关系 extends) 基类的中的方法,构造方法(要保证父类的属性被初始化,所以有默认的super()),重写(拥有同名的方法)

​ 多态

​ 抽象类 final abstract 制定规则

单例

设计模式的定义 对单例的理解 功能的描述

设计模式

  1. 用前人总结的经验(考驾照,教练的经验就是模板),在开发中遇到的问题后,提取当前最优的方法。
  2. 目前常用的设计模式有23种(单例是其中之一),要查学习其他的设计模式
  3. 设计模式都有对应的类,因为Java是面向对象的语言
/*
 * 设计模式:前人总结出来的对一些常见问题的解决方案,后人直接拿来使用.
 * 常用的设计模式:单例,工厂,代理,适配器,装饰,模板,观察者等,一共有23种
 * 单例:一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用.
 *
 * 分析:
 * 1.我们肯定要建立一个单例类来描述
 * 2.只允许让用户有一个对象
 * 3.全局的访问点:说的就是当前的s----通过static实现的
 * 4.提供出去
 * 5.给大家使用
 *
 * 作用:
 * 1.传值
 * 2.作为全局的访问点.
 */

单例的概念

  1. 一个类用户只能创建一个对象,该对象被全局的访问点
  2. 通过static 实现,在整个工程中都可以方法

实现方式

  1. 饿汉式
  2. 懒汉式 (重点要记住)
  3. 有两个小案例;实现传值与全局访问;
//一个类只允许有(能创建)一个对象,建立一个全局的访问点,提供出去供大家使用.
//创建对象在类中完成,且该对象是私有的,必须放在静态方法区中,不可修改,因此修饰时必须有`static` 与 `private` 与final关键字,

class SingleDemo{
     //2.定义一个私有化的静态的当前类类型的成员变量并完成赋值.
    private final static SingDemo s = new SingleDemo();  //s 为创建对象的引用对象。
    
     //1.先将构造方法私有化     (为什么需要将构造方法私有化)
    private SingleInstance(){

    }
    //3.创建一个公共的方法,将当前的私有的成员变量提供出去
    //通过公共的方法提供出去
    
    //星哥注解: 该公共方法必须加载到静态方法区,否则会被垃圾回收机制进行回收,下次用时又需要重新进行调用
    //返回值的类型为什么会是类名,这点不太明白。难道是为了需要将对象返回出去,需要将该对象用类名进行引用;
    public static SingleDemo getInstacnce(){
        return  s;
    }
    
       //功能区
    public void  run(){
        System.out.println("run");
    }
    String name;

}


//懒汉式   对象为空null,创建公共方法返回对象的时候需要加if判断返回对象
class  SingleInstance1{
    //2.定义一个私有化的静态的当前类类型的成员变量并完成赋值.
    private  static  SingleInstance1 s = null;

    //1.先将构造方法私有化
    private SingleInstance1(){

    }

    //3.创建一个公共的方法,将当前的私有的成员变量提供出去
    //通过公共的方法提供出去
    public static SingleInstance1 getInstacnce(){
        if (s == null) {
            s = new SingleInstance1();
        }
        return  s;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        if (s == null) {
            s = new SingleInstance1();
        }
        return  s;
    }

    //功能区
    public void  run(){
        System.out.println("run");
    }
    String name;
}

单例总结:

  1. 一个类只允许有一个对象,通过公共方法区取得这个对象,供全局访问
    • 公共方法必须在类加载的时候加载到静态方法区,其对象的值只能有一个,该对象在内部创建,
    • 构造方法私有化,是因为为了保证该对象的名字被保护起来,不可修改
  2. 懒汉式为什么不需要final来修饰
  3. 基类的重载是怎么回事;
package com.qf.test;

class SingleDemo{

    String name;

    //1.构造方法私有化
    private SingleDemo(){}

    //2.定义一个私有化的静态的%%%%当前类类型%%%%的成员变量并完成赋值.
    private  static SingleDemo s = null;



    //3.创建一个公共的方法,将@@@当前的@@@@---------私有的成员变量---------提供出去
    //    //通过公共的方法提供出去
    public static SingleDemo  getSingle(){
        if(s == null){
            s = new SingleDemo();
        }
        return s;
    }

//    @Override
    protected Object clone() throws CloneNotSupportedException {
        if (s == null) {
            s = new SingleDemo();
        }
        return  s;
    }

    //功能区
    public void run(){
        System.out.println("run");
    }

}

public class TestSingleDemo {
    public static void main(String[] args) {
        SingleDemo s1 = SingleDemo.getSingle();
        s1.run();
    }


}

单例运行内存图

单例实现传值

软件开发:模块开发 模块之间越独立越好(别说自己之前是做外包的,这是拼接工)

耦合性与内聚性(低、高)

耦合性:两个模块的关系越紧密,耦合性越高

系统提供的单例

Java API 中Runtime

public class Demo4 {
    public static void main(String[] args) {
        //Runtime:运行时类
        //每个 Java 应用程序都有一个 Runtime 类实例,
        //使应用程序能够与其运行的环境相连接。
        //可以通过 getRuntime 方法获取当前运行时。

        //应用程序不能创建自己的 Runtime 类实例。
        Runtime runtime = Runtime.getRuntime();//通过一个公共的方法获取Runtime对象

        //单位默认是字节
        System.out.println(runtime.totalMemory()/1024./1024);// 返回 Java 虚拟机中的内存总量。
        System.out.println(runtime.freeMemory()/1024./1024);//返回 Java 虚拟机中的空闲内存量。
        System.out.println(runtime.maxMemory()/1024./1024);//返回 Java 虚拟机试图使用的最大内存
    }
}

接口

接口 与 抽象类

interface 接口可以看成一个特殊的类

接口中的成员方法是方法声明;

某个类实现的某个接口 implements(可以理解成继承的形式)

/*
 * 接口:interface
 * 构成:
 * interface  接口的名字{
 *        (默认是public,final,static类型的)成员变量;
 *        (默认是public,abstract类型的)成员方法(声明);
 * }
 *
 * 一般接口中不写成员变量,只写方法--只写规则,又将接口称为方法列表
 *
 * 起作用的方式:让类去实现接口
 * 类与类之间的关系---继承      extends   extends
 * 类与接口之间的关系--实现    implements  implements

 *  * 问题一:接口与父类可以同时存在吗?
 *  * 可以
 * 问题二:一个子类只能有一个父类,也只能有一个接口?
 *  * 可以同时有多个接口
 * 问题三:父类与接口的功能如何分配?
 *一般父类中放的是主要功能,接口中放的是额外的功能,接口作为父类的补充.
 *  * 问题四:接口可以直接创建对象吗?
 *  * 不可以
 * 问题五:接口与接口之间可以有关系?如果有,有什么关系?
 * 可以有继承的关系,并且是多继承
 *  问题六:当一个类实现的接口中出现了相同的方法,子类中实现方法的时候会不会混淆?
 * 不会,接口中的方法都是抽象的,要通过子类写具体的实现.我们在调用方法时,最终看的功能,而功能只有子类中的一份.
 *
 * 总结:接口的作用:让java从单继承间接的实现了多继承,扩充了原来的功能,我们可以认为接口是类的补充.
 *
 * * 了解:
 * 从jdk1.7开始,以后的接口中可以有方法的实现,但是方法必须使用static或default修饰
 */

多态

一种事物都有 多种形态 人 动物 高级动物

多态的前提必须是继承

多态的引用指向子类的对象(父类不一定是直接的父类)

package com.qf.test;
/*
 * 多态:一种事物的多种形态.    狗 ==  动物   ==  生物       花 == 植物  ==  生物     人== 高等动物  ==  动物
 * 继承是多态的前提
 */
public class Demo6 {
    public static void main(String[] args) {
        //如果是继承
        Dog dog = new Dog();
        dog.name = "拉布拉多";
        dog.age = 20;

        //多态
        //父类的引用指向子类的对象(父类不一定是直接的父类)
        Animal animal = new Dog();
        Object obj = new Dog();//多态
        animal.name = "柯基";
        /*
         * 程序运行分成三个阶段:预编译,编译,运行
         * 预编译:程序打开的时候,活儿已经干完了.(预处理命令 #define)
         * 编译:从打开程序开始到点击左上角的三角之前---只能识别=前面的引用类型,不会识=后面的对象
         * 运行:从点击三角开始---真正的识别对象,对象开始干活儿
         *
         * 了解的内容:
         * 实现动态的手段:动态类型,动态绑定,动态加载
         * 动态加载:我们在编译阶段不能确定具体的对象类型,只有到了运行阶段才能确定真正的干活儿的对象.
         */

        //工作机制:1.首先通过Animal保存的地址找到Dog对象   2.Dog对象再去调用show方法.
        animal.show();
        //不能通过的原因:在编译的时候识别的是引用类型,不识别对象.所以只能识别出Person里面的方法,而不能直接
        //调用子类特有的方法.
        //animal.eat();

        /*
         * 总结:
         * 优点:可以提高代码的扩展性,使用之前定义好的功能,后面直接拿来使用,不用再创建新的方法.实例在Demo7
         * 缺点:只能直接调用父类有的方法,不能直接调用子类特有的方法.
         */
    }


}

class  Animal{
    String name;
    public void show(){
        System.out.println("Animalshow");
    }
}

class  Dog extends  Animal{
    int age;
    public void  eat(){
        System.out.println("Dog吃");
    }

    public void show(){
        System.out.println("Dogshow");
    }
}

星悟脑的微信公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值