首页 > 编程语言 >JAVA进阶--static、工具类、单例、继承--2022年8月28日

JAVA进阶--static、工具类、单例、继承--2022年8月28日

时间:2022-08-30 11:44:35浏览次数:52  
标签:JAVA 进阶 -- 子类 成员 static 单例 父类 方法

第一节  static静态关键字

  1、成员变量的分类和访问分别是什么样的?

    静态成员变量(有static修饰,属于类,加载一次,可以被共享访问)

      访问格式:类名.变量名(推荐)

           对象名.变量名(不推荐)

    实例成员变量(无static修饰,属于对象)

      访问格式:对象名.变量名

  2、两种成员变量各自在什么情况下定义?

    静态成员变量:表示在线人数等需要被共享的信息

    实例成员变量:属于每个对象,且每个对象的信息不同时(如name,age,money等)

  3、static修饰成员变量的内存原理

     程序运行开始,方法区加载class文件和main方法的同时,堆内存开辟一块空间,加载class静态变量区,存储静态成员变量

 

   4、成员方法的分类和访问分别是什么样的?

    静态成员方法(有static修饰,属于类和对象共享)

      访问格式:类名.静态成员方法

           对象名.静态成员方法(不推荐)

    实例成员方法(无static修饰,属于对象)

      访问格式:对象名.实例成员方法

  5、每种成员方法的使用场景是怎么样的?

    静态成员方法:如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明静态方法

    实例成员方法:表示对象自己的行为的,且方法中需要直接访问实例成员变量的,则该方法必须申明成实例方法

  6、static修饰成员方法的内存机制

    程序运行,类和静态方法优先加载到方法区,如果后面有new对象的话,实例成员方法会加载进方法区,堆内存里的对象的方法的引用会指向方法区里加载好的实例方法,这个实例方法是归属于对象的。

 

  7、static访问注意事项(面试,笔试题会遇到)

    静态方法只能访问静态成员,不能直接访问实例成员

    实例方法可以访问静态成员,也可以访问实例成员

    静态方法中不可以出现this关键字

第二节 static应用知识:

  1、工具类是什么,有什么好处

    工具类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,这个类用来给系统开发人员共同使用

    好处是:一是调用方便,二是提高代码复用(一次编写,处处可用,提高代码的重用性)

  2、工具类有什么要求?

    建议工具类的构造器私有化处理,即不让别人创建工具类对象,直接使用类名.静态方法形式调用,这样不占内存,还显得专业化。

  3、代码块是什么?

    代码块是类的5大成分之一(成员变量,构造器,方法,代码块,内部类),定义在类中方法外。

    在java类下,单独使用{}括起来的代码被称为代码块

  4、代码块可以分为哪几类?

    静态代码块

      格式:static{}

      特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次

      使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。

    实例代码块(构造代码块)

      格式:{}

      特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且会在构造器执行前执行(super在{}前执行,爸爸永远是爸爸)

      使用场景:初始化实例资源

  5、静态代码块的作用是什么?

    如果要在启动系统时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作。

    以斗地主为例

package com.itMao.d1;

import java.util.ArrayList;

public class staticDemoTest {
    /**
     *需求:斗地主,在启动游戏房间的时候,应该提前准备好54张牌,后续才可以直接使用这些牌数据
     */

    /**
     *1、定义一个静态集合,这样这个集合只加载一个,因为当前房间只需要一副牌
     */
    public static ArrayList<String> cards = new ArrayList<>();

    /**
     * 2、在程序真正运行main方法前,把54张牌放进去,后续游戏可以直接使用
     */
    static {
        //3、正式做牌,当到集合中去
        //a、定义一个数组存储全部点数,因为类型,个数都确定
        String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        //b、定义一个数组存储全部花色,因为类型,个数都确定
        String[] colors = {"红桃","黑桃","方片","梅花"};
        //c、遍历点数
        for (int i = 0; i < sizes.length; i++) {
            //d、遍历花色
            for (int j = 0; j < colors.length; j++) {
                cards.add(sizes[i]+colors[j]);
            }
        }
        //e、单独加入大小王
        cards.add("小王");
        cards.add("大王");
    }

    public static void main(String[] args){
        System.out.println("新牌加载完毕"+cards);
    }
}

 

第三节  单例设计模式

  1、单例模式是什么

    可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只创建一个对象

    单例模式有很多:饿汉单例,懒汉单例。。。。。。。

 

  2、饿汉单例的实现步骤(在用类获取对象时,已经提前创建好了对象)

    定义一个类,构造器私有化

    定义一个静态变量存储该类的对象

package com.itMao.d1.d4_static_singleInstance;

public class SingleInstance {

    //2、定义一个静态成员变量存储该类的对象,只加载一次,只此一个
    public static SingleInstance instance = new SingleInstance();

    //1、构造器私有化
    private SingleInstance(){

    }
}

  3、懒汉单例的实现步骤(在真正需要该对象的时候,才去创建一个对象,即延迟加载对象)

    定义一个类,把构造器私有化

    定义一个静态变量存储一个对象,不可以直接new,这样就变成了饿汉单例,同时这个变量要私有化

    提供一个返回单例对象的方法

package com.itMao.d1.d4_static_singleInstance;

public class SingleInstance2 {

    /**
     * 2、定义一个静态变量负责存储一个对象
     *    只加载一次,只有一份
     *    最好私有化,不然其他类在调用的时候会返回null
     */
    private static SingleInstance2 instance;

    /**
     * 3、提供一个返回该类对象的方法
     */
    public static SingleInstance2 getInstance(){
        if(instance == null){
            instance = new SingleInstance2();
        }
        return instance;
    }

    /**
     * 1、构造器私有化
     */
    private SingleInstance2(){

    }
}

  4、饿汉单例和懒汉单例的优缺点

    饿汉单例:速度快,但是占内存

    懒汉单例:速度慢,但是不占内存

    因为饿汉单例只要一加载类,这个对象就new出来了,而懒汉单例只有在调用方法的时候才会new对象。

第四节 继承

  1、什么是继承?继承的好处是啥?

     继承就是java允许我们用extends关键字,让一个类和另一个类建立起一种父子关系

    提高代码复用性,减少代码冗余,增强类的功能扩展性

  2、继承的格式

     子类 extends 父类

  3、继承后子类的特点?

    子类继承父类后,子类可以得到父类的属性和行为,子类可以使用

    java中子类更强大

  4、创建子类对象的内存机制

    创建子类对象后,对外是一个对象,但是内部是分成两个空间的

 

 

   5、继承需要满足什么样的设计规范

    子类们相同特征(共性属性,共性方法)放在父类中定义

    子类独有的属性和行为应该定义在子类自己里面

  6、继承有哪些特点?

    子类可以继承父类的属性和行为,但是子类不能继承父类的构造器

    java是单继承i模式:一个类只能继承一个直接父类

    java不支持多继承、但是支持多层继承

    java中所有的类都是object类的子类

  7、在子类方法中访问成员(成员变量、成员方法)满足:

    就近原则,先在子类范围里面找,子类没有找父类,父类没有就报错

  8、如果子父类中出现了重名的成员,此时如果一定要在子类中使用父类的怎么办?

    格式:super.父类成员变量/父类成员方法

  9、方法重写是什么样的

    子类写一个与父类申明一样的方法覆盖父类的方法

  10、方法重写建议加上哪个注解,有什么好处?

    @Override注解可以校验重写是否正确,同时可读性好

  11、重写方法有哪些基本要求

    重写方法的名称和形参列表应该与被重写方法一致

    私有方法不能被重写

    静态成员方法不能被重写

    子类重写父类方法是,访问权限必须大于或者等于父类被重写的方法的权限

  12、子类继承父类后构造器的特点

    子类中所有的构造器默认都会先访问父类中无参的构造器,在执行自己

    因为子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据

    子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化

  13、怎么调用父类构造器的

    子类构造器的第一行语句默认都是super(),不写也存在的。

  14、super调用父类构造器的作用是什么?

    通过调用父类有参数构造器来初始化继承自父类的数据

  15、如果父类中没有无参数构造器,只有有参构造器,会出现什么现象?

    会报错,因为子类默认是调用父类无参构造器的

  16、如何解决

    子类构造器中可以通过书写super(),手动调用父类的有参数构造器

    或者父类一定要写无参构造器

  17、this和super详情

     

 

 

  18、this(....)和super(....)使用注意点

    子类通过this(..)去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类构造器的

    注意:this(...)super(...)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中

 

 

 

 

标签:JAVA,进阶,--,子类,成员,static,单例,父类,方法
From: https://www.cnblogs.com/Flower--Dance/p/16633868.html

相关文章

  • 2022-8-30 每日一题-二叉树递归-
    998.最大二叉树II难度中等90收藏分享切换为英文接收动态反馈最大树 定义:一棵树,并满足:其中每个节点的值都大于其子树中的任何其他值。给你最大树的根节点 root......
  • java Map实体内容遍历后重建 map 空指针处理
    javaMap实体内容遍历后重建map空指针处理Map<String,Object>map=newHashMap<>();//NullPointerExceptionMap<String,Object>map1=map.entrySet()......
  • C调用C++函数
    2.C中调用C++函数`extern"C"`在C中是语法错误,需要放在C++头文件中。```c//add.h#ifndefADD_H#defineADD_Hextern"C"{  intadd(intx,inty);}#e......
  • pytest相关参数及allure生成report报告的相关参数
    一、pytest的相关参数-s输出打印信息,关闭捕捉;(如果要生成报告,就需要去掉该参数)-v显示具体的详细信息;-k执行包含关键字的用例-q简化输出信息-x出现一条测试用例失......
  • ZETERO必装插件
    1.茉莉花https://github.com/l0o0/jasminum2.翻译插件https://github.com/windingwind/zotero-pdf-translate/releases......
  • DFT常识知识概要
    DFT常识知识概要DFT是什么可测性设计,指的是在芯片原始设计中阶段即插入各种用于提高芯片可测试性(包括可控制性和可观测性)的硬件逻辑,通过这部分逻辑,生成测试向量,达到测试......
  • swap分区扩展
    为你的系统额外添加一个5GiB的交换分区,此交换分区应在系统启动时自动挂载,不要删除或以任何方式改动系统上原有的交换分区。 [root@localhost~]#  使用parted或......
  • SpringAOP
    1.日志处理的问题2.什么是AOP?通过代理模式,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一一个独立的模块,然后在指定位置插入这些功能。这......
  • 解决print spooler打印服务自动多次重启
    引用:解决printspooler打印服务自动停止的过程记录办公室一台电脑的共享打印机突然无法打印,提示打印服务已停止,打开服务发现printspooler服务已经停止,同时打印机列表中打......
  • vue ctrl + 鼠标左键组合键
    <[email protected]="handleMouseDown($event)">/*鼠标按下方法*/handleMouseDown(event){if(event.ctrlKey&&event.which===1){//ctrl+鼠标左键......