Java 第14天 面向对象(下) static 关键字的使用

写在前言 : 学习资源B站是最好的也是很全面。
1 、现在出去面试,面试官老是会问你一句话Java 怎么样?
不管是大数据岗位还是数据库都会问一句。 回来痛下决心,决定探索下这门语言的精髓,大数据很多框架也都是Java 写的,的确懂一门语言,比较稳妥。路也宽敞!!!不然就和吃饭没筷子,那么尴尬。把每天学习到的 Java知识分享到这里会。直到能自己写个复杂一点Dome得出来。
2、为了监督自己探索这门语言的动力与决心。特此这段话放到前面!!!
3、挑战下自己 到底是笨 还是学不会,还是不想学。 好运

一、 概念:
1、static :静态的
2、static 可以用来修饰:属性、方法、代码块、内部类
3、使用static 修饰属性:静态变量

3.1、属性:按是否使用static 修饰,又分为:静态属性VS 非静态属性(实例变量)

实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值被修改。

静态变量:我们创建了类的多个对象,多个对象共享一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
3.2、static 修饰属性的其他说明:
①静态变量随着类的加载而加载。可以通过类.静态变量的方式进行调用。
②静态变量的加载早于对象的创建。
③由于类只会加载一次,则静态变量在内存中只存在一份。存在方法的静态域中。

4、使用static 修饰方法:静态方法

①:随着类的加载而加载.可以通过 “类.静态方法” 的方式进行调用。
②:类.静态方法 、对象. 静态方法 、对象.非静态方法
类.非静态方法是无法调用的。
③:静态方法中,只能调用静态的方法或者属性
非静态方法中,既可以调用非静态方法或属性:也可以调用静态的方法或属性。

5、static 使用注意点:

在静态方法内,不能使用this 关键字、super 关键字、

6、开发中如何确定一个属性是否要声明为static的?

属性是可以被多个对象所共享的,不会随着对象的不同而不同的。

7、开发中,如何确定一个方法是否要声明为static的?

1、操作静态属性的方法,通常设置为static的。
2、工具类中的方法,习惯上设置为static的。比如:math、Arrays…

二、栗子:

在这里插入图片描述
package com.work_ZQ3;

/** 单例模式

  • 饿汉式
  • 线程安全的、
    */
    public class SingletonTest1 {
    public static void main(String[] args) {
    Bank b1 = Bank.getinstance();
    Bank b2 = Bank.getinstance();
    System.out.println(b1==b2);
    }
    }
    class Bank{
    // 1、私有化类的构造器
    private Bank(){
    }
    //2、创建私有化类的对象
    private static Bank instance = new Bank();
    //3、提供公共的静态方法,返回类的对象
    public static Bank getinstance(){
    return instance;
    }
    }

package com.work_ZQ3;

/**单例模式:

  • 懒汉式
    */
    public class SingletonTest2 {
    public static void main(String[] args) {
    Order order1=Order.getInstance();
    Order order2=Order.getInstance();
    System.out.println(order1==order2); // true :比较地址值
    }
    }
    class Order{
    //1、私有化类的构造器
    private Order(){

    }
    //2、声明当前类对象、没有初始化
    private static Order instance = null;
    //3、声明为public、static 当前类对象的方法
    public static Order getInstance(){
    if(instance == null){
    instance = new Order();
    }
    return instance;
    }
    }

单例设计模式—应用场景

在这里插入图片描述

三:类中代码块结构的使用:

1、代码块的作用:用来初始化类、对象

2、代码块如果有修饰的话,只能使用static修饰

3、分类:静态代码块VS 非静态代码块

4、静态代码块:
> 内部可以有输出语句
> 随着类的加载而执行,而且只执行一次。
>作用:初始化类的信息
> 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行。
>静态代码块的执行要优先于非静态代码块的执行。
>静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构。

5、非静态代码块

1、内部可以有输出语句
2、随着对象的创建而执行
3、每创建一个对象,就执行一次非静态代码块
作用:可以在创建对象时,对对象的属性等进行初始化。
4、如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行。
5、非静态代码块内可以调用静态的属性,静态的方法,或非静态的属性、非静态的方法。

6、对属性可以赋值的位置:
1、默认初始化
2、显示初始化 / 5、在代码块中执行。
3、构造器中初始化
4、有了对象以后,可以通过“对象.属性”或“对象.方法”方式。进行赋值。

执行的顺序:1–>2/5–>3–>4

在这里插入图片描述

四、总结:

/**

  • 它们之间的区别主要如下:
    *静态代码块在虚拟机加载类的时候就执行(只执行一次),而非静态代码块每一次new的时候都会执行一次。
    *由于静态代码块在虚拟机加载类的时候就执行,因此在非静态代码块在静态代码块后执行

  • 静态代码块是以static修饰的代码块,反之没有用static修饰的代码块为非静态代码块,如下所示:

  • 静态代码块不能放在main 方法中,会编译错误。。。。。
    */
    package com.work_ZQ2;
    class Person2{
    Person2 p = new Person2();

    static {
    System.out.println(“我是静态代码块被执行。。。。。。。。。”);
    }

    {
    System.out.println(“我是非静态代码块。。。。。。。。。”);

    }
    }
    public class MyTest extends Person2 {
    public static void main(String[] args) {

     System.out.println("myclass constructor");
    

    }

}
在这里插入图片描述

【转载注明出处,还望尊重原创 】

  写于:2020-7-12 魔都

【作者水平有限,如有错误欢迎指正 .】

如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值