面向对象

一、static关键字

1、static修饰成员变量

static修饰的成员变量,叫静态成员变量,又叫做类变量

实例成员变量(对象变量)

2、static修饰成员变量内存中执行原理

方法区开辟一块空间加载student字节码文件,student中的类静态变量加载,并在堆内存开辟一块静态变量区域,默认初始值为0;main方法进入栈内存,加载实例变量,,堆内存开辟一块空间存放类的信息产生一个地址值返回给实例化,除方法外(存的是地址);,堆内存加载实例变量,去方法区寻找,指向方法区地址,并赋值。

3、成员方法的执行原理

方法区加载test字节码文件,main返回发进去占内存,调用Student.方法,方法区加载Student字节码文件,执行静态方法,printHelloworld();栈中加载student 变量 将实例化赋给他,同时在堆内存开辟一块空间,加载对象属性初始化,并返回给栈中地址,同时堆内存中方法地址指向方法区prinntHelloWorld调用方法,输出结果值;printpass方法同理。

mian方法String[] args;接收参数 java 文件名字 紧跟 参数

4、工具类

里边的方法都是静态方法,(不建议实例化方法)需要私有化,防止外界实例化

5、静态关键字注意事项

6、代码块

(1)静态代码块:类加载而加载,自动触发只执行一次

static{}

(2)实例代码块(构造代码块):每次创建对象,调用构造器时候调用,构造器之前执行。

作用:初始化构造资源;

{}

注意:

java静态代码块,构造方法,构造代码块的执行先后顺序

1、执行顺序

静态代码块>构造代码块>构造方法

原因:

静态代码块(static{})在类加载的时候执行一次,是最早被执行的。

构造代码块({}内的部分)在每一次创建对象时执行,始终在构造方法前执行。

构造方法在新建对象时调用( 就是new的时候 )。

注意:

静态代码块在类加载的时候就执行,所以它的优先级高于入口main()方法。

当三种形式不止一次出现,同优先级是按照先后顺序执行。

程序代码示例:

package com.shizian.test;

/**
* @author 施子安
* @version 1.0
* @date 2023/2/20 16:29
* @Description 静态代码块,构造代码块执行先后顺序
*/
public class StaticTest {
public static StaticTest t1 = new StaticTest();
public static StaticTest t2 = new StaticTest();
{
System.out.println("构造块");
} public StaticTest(){
System.out.println("无参构造");
}
static {
System.out.println("静态块");
} public static void main(String[] args) {
StaticTest t = new StaticTest();
}
}

执行main方法打印结果:

为什么会出现这种打印结果?

拓展知识点:静态域

静态域:分为静态变量,静态方法,静态块。当执行到静态域时,按照静态域的顺序加载。并且静态域只在类的第一次加载时执行。

注意:加载了静态域的一部分,这时候不能再加载另一个静态域了,静态域必须当成一个整体来看待,否则加载会错乱。比如上面的代码,有静态变量和静态代码块儿,当加载了静态变量后,就不能加载静态代码块儿了。

根据代码执行顺序:

(1)执行程序入口main方法时,首先加载类StaticTest

注意:加载类时并不会调用构造块和构造方法,只有静态域会执行

(2)加载类StaticTest,执行静态域的第一个静态变量,StaticTest t1 = new StaticTest();,输出构造块和构造方法(空)。打印出构造块。

(3)由于每次new对象时,会执行一次构造块和构造方法,构造块总是在构造方法前执行,(当然,第一次new时,会先执行静态域,静态域〉构造块〉构造方法)所以执行StaticTest t1 = new StaticTest();时,执行了下面代码:

{
System.out.println("构造块");
}

(4)同理,StaticTest t1 = new StaticTest();加载完后,以此执行第二个静态变量StaticTest t2 = new StaticTest();,执行构造块代码块。

(5)执行static静态块,完成对整个静态域的加载

(6)最后,再执行main方法,new StaticTest();,执行构造块。

附加:代码中添加了构造方法

执行main方法的打印结果:

总结:

1、每调用一次构造方法,则执行一次构造块

2、静态块只在类加载的时候加载一次

3、有多个静态变量或块时,按声明顺序加载

2、java中父类和子类代码执行顺序

父类和子类代码执行顺序:

父类静态代码块 =》 子类静态代码块 =》 父类代码块 =》 父类构造方法 =》 子类代码块 =》 子类构造方法

  • 程序代码如下:
    1、创建Father和Son类,让Son继承Father
    2、编写Father和Son的代码 /**
    父类(抽象类)
    */
    public abstract class Father { static {
    System.out.println("父类静态代码执行了");
    } {
    System.out.println("父类非静态代码执行了");
    } public Father() {
    System.out.println("父类构造函数代码执行了");
    } public static void main(String[] args) {
    Son son = new Son();
    }
    }

* ```java
/**子类(具体类)
*/
public class Son extends Father { static {
System.out.println("子类静态代码执行了");
} {
System.out.println("子类非静态代码执行了");
} public Son() {
System.out.println("子类构造函数代码执行了");
}
}

打印结果:

注意:由于代码的执行顺序不同,经常通过执行顺序进行后端初始化。

————————————————

版权声明:本文为CSDN博主「CUIYD_1989」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_58680865/article/details/124956871

设计模式

分三种模式:创建型模式、结构型模式、行为型模式

●创建型:主要就是创建对象的时候隐藏创建的逻辑,不采用new来实例化,主要有5种模式(单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式)

●结构型:通过类和接口间的继承引用来实现复杂的对象创建结构模式。共7种常用(适配器模式、过滤器模式、组合模式、代理模式等)

●行为型:通过对象之间不同的通信方式实现不同行为,共有11种(模板方法模式、策略模式、迭代器模式等)

其中spring中创建对象bean默认采用单例模式,beanfactory创建对象采用工厂模式,aop面向切面编程采用代理模式,底层是动态代理,springmvc中处理适配器采用适配器模式找到多用适配器,Mybatis中的Jdbc Template使用了模板方法模式等等

单例模式

一个类只能创建一个对象,懒汉式 饿汉式 线程安全的懒汉式单例判断当前对象是否为空为空创建

●饿汉式单例,类加载的时候就实例化,构造方法私有化,对外只提供一个实例化

●懒汉式单例,调用时候实例化,构造方法私有化

●线程安全懒汉式单例,加一个synchronized,构造方法私有化,对外只提供一个实例

package com.shizian.test;

/**
* @author 施子安
* @version 1.0
* @date 2023/2/20 17:17
* @Description 单例模式
*/
public class SingleInstance {
//构造方法私有化
private SingleInstance(){System.out.println("这里是无参构造");}
//定义一个静态变量存储对象,完成实例化
private static SingleInstance s = new SingleInstance(); //对外提供一个静态方法,返回实例
public static SingleInstance getInstance(){
return s;
}
}
/**
懒汉式单例,调用对象的时候才加载实例,构造方法私有化,对外只提供一个创建对象的方法
*/
public class SingleIntance{
//静态变量定义
private static SingleIntance s;
//构造方法私有化
private SingleIntance(){
System.out.println("这里是无参构造");
} //对外提供实例化,判断当前变量是否初始化,
public static getIntance(){
if(s == null){
s = new SingleIntance();
return s;
}
return s;
}
}
/**
测试类
*/
public class Test{
SingleIntance.getIntance(); }

继承

1、执行原理

2、继承特点

java单继承,java可以多层继承,都是object的子类(直接或者间接继承)

重写方法:声明不变,重新实现

子类不能重写父类的静态方法

重点:**父类只有有参构造,子类构造器如何调用?**

子类调用父类有参构造器采用super(参数);

或者父类声明一个无参构造

子类构造器首先加载父类无参构造器(必须)

this()调用本类中的构造器

第一章 static、单例与继承的更多相关文章

  1. 008单例、继承、final

    内容:单例,类继承,final #################################################################################### ...

  2. JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

    public class Main { { //构造块(在构造对象时调用,先于构造方法执行) System.out.println("我是构造块!"); } static{ //静 ...

  3. Spring深入浅出(二)IOC的单例 ,继承,依赖,JDBC,工厂模式以及自动装载

    IOC的单例模式--Bean Spring中的bean是根据scope来决定的. scope有4种类型: 1.singleton:单例模型,表示通过Spring容器获取的该对象是唯一的.常用并且默认. ...

  4. 有关线程安全的探讨--final、static、单例、线程安全

    我的代码中已经多次使用了线程,然后还非常喜欢使用据说是线程不安全的静态方法,然后又看到很多地方最容易提的问题就是这个东西线程不安全   于是我不免产生了以下几个亟待解决的问题: 什么样的代码是天生线程 ...

  5. static实现单例的隐患

    1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...

  6. Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践

    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践 背景 很多开发者或者有经验的老手都会建议尽量不要用单例模式,这是有原因的. 单例模式是设计模式中最简单的也是大家通常最先接触的一种设计 ...

  7. 十次艳遇单例设计模式(Singleton Pattern)

    1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...

  8. Java公开课-06.单例

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  9. 【Java】设计模型-五种单例模型

    一. 什么是单例模式 只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在. 单例模式有很多好处,它能够 ...

  10. Spring的单例实现原理-登记式单例

    单例模式有饿汉模式.懒汉模式.静态内部类.枚举等方式实现,但由于以上模式的构造方法是私有的,不可继承,Spring为实现单例类可继承,使用的是单例注册表的方式(登记式单例). 什么是单例注册表呢, 登 ...

随机推荐

  1. Web _Servlet(url-pattern)的配置与优先级

    url-pattern的配置方式有三种: 1.完全路径匹配:以  '/'  开始 例: /ServletDemo1  , /aaa/ServletDemo2 , /aa/bb/ServletDemo3 ...

  2. Qt滚动条样式

    Qt手动设置滚动条的qss样式 QScrollBar:vertical { width: 14px; margin: 16px 0 16px 0; background: #eaeaea; } QSc ...

  3. MySql 字符串时间转换

    MySql中经常遇到字符串格式时间转换成时间类型的情况: SELECT STR_TO_DATE('Jul 20 2013 7:49:14:610AM','%b %d %Y %h:%i:%s:%f%p' ...

  4. 11、jmeter配置元件--计数器

    前面学过csv和变量 csv里面的数据是固定的  如果里面的数据不够  线程要么就停止要么就需要重头再来 不太灵活 用到固定化的数据,比如说多少个用户等等 如果有一些是变动的 随着线程数增加   数据 ...

  5. 循环文件夹汇总所有下载发票的Excel文件数据

    Dim a As String, n As Integer, wbs As Workbook ThisWorkbook.Sheets(1).Cells.Clear a = Dir(ThisWorkbo ...

  6. ggplot2: display every nth value on discrete axis

    every_nth = function(n) { return(function(x) {x[c(TRUE, rep(FALSE, n - 1))]}) } ggplot(mpg, aes(x = ...

  7. revit转tileset 3dmax转tileset cesium展示

    使用revit软件导出fbx模型: 使用glTFExport导出gltf模型,导出的gltf模型具有属性.但是此处导出gltf模型,不是为了在cesium中加载该gltf模型,主要目的是获取组件属性信 ...

  8. 5.3dmax轴相关

    # 知识点: 转换为可编辑的样条线(spline) chamfer 切角 Fillet 圆角 车削命令 书柜案例2 样条线(从图形到多边形) 1.在平面视图中选择矩形并创建一个矩形,将矩形转化为可编辑 ...

  9. 上位机-串口通信详解(以RS232为例))

    1.什么是串口通信? 写这个的时候我在想应该怎么解释串口通信,因为串口通信很多朋友不了解的原因是涉及到硬件的知识,对于没有相关专业知识的朋友很难理解串口通信.所以我这里只做部分的解释,需要了解更多硬件 ...

  10. 自定义DOM事件函数封装

    非原生DOM触发,个性化定制的自定义事件. currentTarget(DOM对象):要触发事件的元素节点. type(字符串):触发的事件类型,例如"keydown". bubb ...