ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

static静态关键字+单例设计模式+继承+this、super使用总结

2022-07-27 11:00:25  阅读:143  来源: 互联网

标签:设计模式 子类 成员 构造 访问 static 单例 父类


static静态关键字

static关键字

static是静态的意思,可以修饰成员变量和成员方法。

static修饰成员变量的分类

静态成员变量:

特点:有static修饰、属于类、与类一起加载,内存中只有一份,可以被共享访问。

使用场景:如果信息要被共享,只需要一份就用,比如:系统在线人数。  

访问规则:

  • 建议用类名访问:类名.静态成员变量
  • 注意:同一个类中,访问静态成员可以省略类名不写
  • 理论上也可以用这样访问:对象名.静态成员变量(不推荐)

实例成员变量:

特点:无static修饰、属于对象、与对象一起加载、每个对象中都存在一份实例成员变量。比如:name age

使用场景:每个对象中都有这些信息,而且信息内容还不太时,定义成实例成员变量。比如:name age

访问规则:只能用   对象名.实例成员变量 

 

 

堆内存中会有一个静态变量区

static修饰成员方法

静态成员方法

特点:有static修饰、属于类、与类一起加载,可以被共享访问。

使用场景:如果是做一个通用功能。  

访问规则:

  • 建议用类名访问:类名.静态成员方法
  • 注意:同一个类中,访问静态成员可以省略类名不写
  • 理论上也可以用这样访问:对象名.静态成员方法(不推荐)

实例成员方法

特点:无static修饰,属于对象,必须用对象来触发访问

使用场景:如果这个方法属于对象,而且要直接访问对象的实例成员,则申明成实例方法。

访问规则:只能用   对象名.实例成员方法   访问

 

使用场景总结 :方法是以执行一个公共的、通用的功能为目的,或者为了方便访问,则可以申明成静态方法

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

static注意事项

  • 静态方法只能访问静态的成员,不可以”直接“访问实例成员。
  • 实例方法可以访问静态的成员,也可以访问实例成员。
  • 静态方法中是不可以出现this关键字的。
package com.liumeng;

public class Test1 {

    //静态成员
    public static int onLineNumber =10;
    public static void test2(){
        System.out.println("==test2静态方法==");
    }
    
    //实例成员
    private String name;
    public void run(){
        System.out.println(name+"跑得快~~");
    }

    //3.静态方法中是不可以出现this关键字的。
    public static void test1(){
       //System.out.println(this);   this只能代表当前对象
    }
    //2.实例方法可以访问静态的成员,也可以访问实例成员。
    public void go(){
        System.out.println(Test1.onLineNumber);
        System.out.println(onLineNumber);
        test2();
        Test1.test2();
        System.out.println(name);
        run();
        System.out.println(this);
    }
    
    //1.静态方法只能访问静态的成员,不可以”直接“访问实例成员。
    public static void test(){
        System.out.println(Test1.onLineNumber);
        System.out.println(onLineNumber);
        test2();
        Test1.test2();
        /*Test1 t= new Test1();    不可以直接访问实例成员。
        System.out.println(t.name); 
        run();*/
    }

    public static void main(String[] args) {

    }
}

static应用知识

static应用知识:工具类

  • 概述:工具类里面都是静态方法,为了完成一个共用功能;这个类用来给系统开发人员共同使用。
  • 好处:一方便调用(一次编写,处处可用),二提高代码的复用性,提高开发的效率。
  • 注意:建议工具类的构造器私有化处理。       因为工具类无需对外创建对象,工具里面的方法都是静态方法,直接用类名访问即可,所以建议将工具类的构造器进行私有。
  • 为什么工具类中的方法不用实例方法做?       因为工具类中的方法是为了完成一个共用功能,用静态定义方便调用(类名调用);而实例方法,每次调用实例方法则需要创建对象,而创建对象仅仅是为了调用方法,导致浪费内存。

static应用知识:代码块

代码块概述

  • 代码块:在java类下,使用{ }括起来的代码
  • 代码块是类的五大成分(成员变量,成员方法,构造器,代码块,内部类),定义在类中方法外

代码块分类

分类 格式 特点 使用场景
静态代码块 static{ }     

有static修饰,属于类

与类一起优先加载一次、且自动触发执行仅一次

可以用于在程序启动时,进行静态资源的初始化操作
实例代码块(构造器代码块):几乎不用 { }

无static修饰,属于对象的

每次调用构造器构建对象前都会执行一次、再执行构造器

用于初始化实例资源

 设计模式

设计模式:开发中会遇到一些问题,解决问题会有n种解法,而解决问题时的最优解法称之为设计模式

设计模式有20多种,对应20多种软件开发中会遇到的问题;单例模式是其中一种

学设计模式主要是学习两点:一是这种模式解决什么问题  二是遇到这种问题 ,该模式是怎么写的,他是如何解决这个问题的

 

单例模式:

单例是一种设计模式,是为了解决某个问题

单例设计模式:可以保证系统中,应用该模式的这个类对外只能产生一个实例  即一个类对外只能创建一个对象

重点在于如何实现单例模式:饿汉单例模式、懒汉单例模式~~~~~ ~

饿汉单例模式

  • 拿对象时,对象已经存在        //在用类获取对象的时候,对象已经提前为你创建好了。

设计步骤:

  • 定义一个类,把构造器私有
  • 定义一个静态变量存储一个对象
/** 1.定义一个单例类 */
public class SingleInstance {

    /**
    3.饿汉单例模式是在获取对象前,对象已经提前准备好了一个
        这个对象只能是一个,所以定义一个静态成员变量记住
     */
    public static Singlelnstance instance = new Singlelnstance();
    
    //2.必须把构造器私有
    private Singlelnstance(){

    }
}

 

懒汉单例模式

  • 要拿对象的时候,才开始创建一个对象                //在真正需要该对象的时候,才去创建一个对象(延迟加载对象)

设计步骤:

  • 定义一个类,把构造器私有化
  • 定义一个私有化的静态变量存储一个对象
  • 提供一个返回单例对象的方法
public class Singlelnstance {

    /**
     2.定义一个私有静态成员变量负责存储一个对象5
        只加载一次,在内存中只有一份
      */
    private static SingleInstance instance;

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

    }

    /**
    3.提供一个方法,对外返回单例对象
     */
    public static SingleInstance getInstance() {
        if(instance == null)
            //第一次来拿对象,此时需要创建对象
            instance = new SingleInstance();
        return instance;
    }
}

面向对象三大特征之二:继承

什么是继承

  • java允许一个类通过extends与另一个类建立起父子关系,这就是继承 
  • 格式:子类extends父类
  • 特点:当子类继承父类后,子类就可以使用父类的属性和行为
  • 优点:提高代码的复用性,减少代码冗余,增强类的功能扩展性
  • public class Student extends People { }
  • Studen称为子类或(派生类),People称为父类(基类或者超类)

继承的设计规范、内存运行原理

继承设计规范:

  • 子类们共用的属性和行为放在父类中定义
  • 子类独有的属于和行为定义放在子类自己里面

内存原理:

继承的特点

  • 子类可以继承父类的属性和行为,子类不能继承父类的构造器。   //因为子类有自己的构造器,父类构造器用于初始化父类对象
  • 子类可以继承父类的私有成员吗?  有争议,黑马认为可以,只是不能直接访问。
  • 子类可以直接用子类名访问访问父类静态成员。那么子类继承了父类静态成员吗?   黑马认为子类没有继承父类的静态成员,只是可以共享的去访问父类静态成员,共享并非继承。
  • Java是单继承模式:一个类只能继承一个直接父类。
  • Java不支持多继承、但是支持多层继承。      //多继承:子类不能同时继承多个父类(反证法)
  • java中所有的类都是Object类的子类。         //Java中所有类,要么直接继承Object,要么默认继承了Object,要么间接继承了Object,Object是祖宗类。

继承后

继承后:成员变量、成员方法的访问特点

就近原则:

  • 先子类局部范围找
  • 然后子类成员范围找
  • 然后父类成员范围找
  • 父类范围还没有找到则报错

this.子类自己的成员变量

子类方法中访问父类成员怎么办?   通过super关键字指定访问父类的成员      //场景:如果子父类中,出现了重名的成员,会优先使用子类的成员;

继承后:方法重写(申明不变,重新实现)

概念:

子类中写一个与父类申明一样的方法,覆盖父类的方法           //在继承体系中,子类中出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写方法

应用场景:

父类的该功能不满足子类的需求。                               //当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。

重写方法建议加上一个重写校验注解:@Override       

作用:重写方法错误,编译阶段会报错提示,提高了可读性

@Override是放在重写后的方法上,作为重写是否正确的校验注解

重写要求

  • 重写方法的名称和形参列表必须与父类被重写方法的名称和形参列表一致
  • 私有方法不能被重写
  • 父类静态方法不能被重写,重写的话报错
  • 重写方法的权限>=被重写方法的访问权限(缺省< protected < public)                  //子类重写父类方法时,访问权限必须大于或者等于父类

继承后:子类构造器的特点

  • 特点:子类的全部构造器默认都会先访问父类的无参构造器,再执行自己的构造器         
  • why? 因为先有爸爸才有儿子。先调用它爸爸的构造器初始化父类的数据,再调用自己的构造器初始化自己的数据。
  • 代码层面:默认子类构造器的第一行都有一个super()访问父类的无参构造器,写不写都有

 

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

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

怎么调用父类构造器的?

  • 子类构造器的第一行语句默认都是:super(),不写也存在;默认找父类的无参构造器执行*/

继承后:子类构造器访问父类的有参构造器

  • 通过调用父类的有参数构造器,初始化继承自父类的数据
  • super(.....) 根据参数调用父类的构造器

 

注意点:如果父类中没有无参构造器,只有有参构造器,会出现什么现象?  

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

 

如果解决?

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

this、super使用总结

  • this:代表本类对象的引用;  super:代表父类存储空间的标识。
关键字 访问成员 访问构造方法
this

this.成员变量/方法

访问子类当前对象的成员 

this(...)

访问本类构造器

super

super.成员变量/方法

在子类方法中指定访问父类父类的成员

super(...)

在本类构造器中指定访问父类的构造器

this(...)的作用:本类构造器中访问本类的兄弟构造器

public class Student {
     private String name;
     private String schoolName;

     public Student() {
     }
    
    //如果不填学校,默认这个对象的学校是黑马大学
     public Student(String name) {
         //借用本类兄弟构造器
          this(name,"黑马大学")
     }

     public Student(String name, String schoolName) {
          this.name = name;
          this.schoolName = schoolName;
     }
}

 this(...)和super(...)使用注意点:

  • 子类通过this(...)去调用本类的其他构造器,本类其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类的构造器的。
  • 注意: this(...)和super(...)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。

标签:设计模式,子类,成员,构造,访问,static,单例,父类
来源: https://www.cnblogs.com/liumeng-/p/16218766.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有