JAVASE学习总结(10)

生命周期 (过长)

属性为static,方法也要声明为static,它俩声明周期应该一样

在某个方法中重写tostring方法,tostring方法默认输出自己私有的属性,默认不输出static的属性。

也可以通过对象去调静态的结构

同一包下不能写两个同名的类

Arguments代表参数的意思

当你使用类,类(静态方法,静态属性)就会加载在内存中

属性中不能有操作(比如int i;i=2;)但(int i = 2;)可以

方法体中是按先后顺序执行的,在一个类中,结构无所谓谁先谁后,代码块放最前面也行

一。static关键字的使用

1)static:静态的

2)static可以用来修饰属性,方法,代码块,内部类

3)使用static修饰属性,静态变量(类变量:该类所有的对象共享的变量)

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

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

                静态变量:创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此变量时,是修改过后的

        3.2其他说明

                     (1)静态变量随着类的加载而加载,可以通过“类.静态变量”的方式进行调用

                   (2)静态变量的加载要早于对象的创建(生命周期)

                   (3)由于类只会加载一次,则静态变量在内存中也只会存在一份,存在在方法区的静态域中

(4)               类变量                实例变量

                类        yes                        no

            对象        yes                         yes        

  3.3    静态属性举例:System.out;   Math.PI;

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

        (1)随着类的加载而加载,可以通过“类.静态方法”进行调用

         (2)

                             静态方法                非静态方法

                  类        yes                        no

              对象        yes                         yes        

        (3)静态方法中,只能调用静态的方法或属性

                  非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性

 5)static的注意点:

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

        5.2关于静态属性和静态方法,可以从生命周期的角度去理解

6)如何确定一个属性是否要声明为static的?

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

    如何确定一个方法是否要声明为static的?  

        操作静态属性的方法,通常设置为static的

        工具类中的方法,习惯上声明为static的。比如Math,Arrays

class Circle{
    private double radius;
    private id;
    
    public Circle(){
        id = init++;
        total++;
}

private static int total;//记录创建的个数

private static int init = 1001;//static声明的属性被所有对象共享  

public double findArea(){
    return PI*radius*radius;    
    }
}
//这里如果创建了两个圆,第一个就是1001,第二个是1002;


  

package com.atguigu5.java;

public class Account {
     private int id;//自动赋值
     private String pwd = "000000";
     private double balance;//余额

     private static double interestRate;

     private static double minMoney = 1.0;
     private static int init = 1001;

     public Account(){
         id = init++;
     }
     public Account(String pwd,double balance){
         id = init++;
         this.pwd = pwd;
         this.balance = balance;
         //static的属性一般不会在构造器里声明,
         // 不然一个改了其他都要跟着改。一般都是对象自己有的属性

     }
    public String getPwd(){
        return pwd;
    }
    public void stePwd(String pwd){
        this.pwd = pwd;
    }

    public static double getInterestRate() {
        return interestRate;
    }

    public static void setInterestRate(double interestRate) {
        Account.interestRate = interestRate;
    }

    public static void setMinMoney(double minMoney) {
        Account.minMoney = minMoney;
    }

    public static double getMinMoney() {
        return minMoney;
    }

    public int getId() {
        return id;
    }

    public double getBalance() {
        return balance;
    }



}

二。static的应用:单例设计模式

 设计模式与数据结构一样,独立于语言之外

1)类的单例设计模式,就是采取一定的方法保证在整个的系统软件中,对某个类只能存在一个对象实例

2)如何实现?

        饿汉式 vs 懒汉式

3)区分饿汉式和懒汉式

       饿汉式:

                坏处:对象加载在内存中的时间过长

                 好处:饿汉式是线程安全的

        懒汉式:

                好处:延迟对象的创建

                坏处:线程不安全(可以改)

懒汉式:
class Order{

    //1.私有化类的构造器
       private Order(){

}

   //2.声明当前类对象,没有初始化
   //4.此对象也必须声明为static的

    private static Order instance = null;

  //3.声明public,static的返回当前类对象的方法
    public static Order getInstance(){
    
        if(instance == null){
            instance = new Order();
}
        return instance;

    }

}


饿汉式:
    class Bank(){
    //1.私有化类的构造器
    private Bank(){
        }
    //2.内部创建类的对象
    //4.要求此对象也必须声明为静态的
    private static Bank instance = new Bank();

    //3.提供公共的静态的方法,返回类的对象
    public static Bank getInstance(){
        return instance;
    
    }

}

 

三。main方法的使用说明

1.main()方法作为程序的入口

2.main()方法也是一个普通静态方法(如果一个包中有多个main,编译器会问你先执行哪个)

3.main()方法可以作为我们与控制台的交互方式(之前使用的是scanner)

先编译在传,或运行时传(控制台cmd)

public是因为JVM在运行时,不在这个包,不在这个类中执行,权限要尽可能大

static是因为main也是通过类调的,如果想通过对象调的话,但对象也在main方法里

void就是不需要返回值

四。代码块Block(类的成员之四)

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

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

3.分类: 静态代码块 vs 非静态代码块

4静态代码块

>内部可以有输出语句

>随着类的加载而加载,且只加载一次

>作用:初始化类的信息

>如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行

>静态代码块的执行要优先于非静态代码块的执行

>静态代码块内只能调用静态的属性静态的方法 不能调用非静态的结构

5非静态代码块

>内部可以有输出语句

>随着对象的创建而执行

>每创建一个对象,就执行一次非静态代码块

>作用:在创建对象时,对对象的属性等进行初始化

>如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行

>非静态的代码块内可以调用静态的属性静态的方法。非静态的属性或方法也可以调用

代码执行顺序:

原则:由父及子,静态先行

调用main方法时(也是通过类调的),先把main在的此类中所有静态的代码块执行了(子类继承了父类,父类先调/生命周期的原因 只执行一次即可),在执行父类中的代码块,之后执行父类的构造器,再执行子类的代码块,构造器(super())。

属性赋值的先后顺序

默认初始化->显式初始化/在代码块中赋值(谁放前面谁先赋值,默认代码块放后面)->构造器中初始化->有了对象以后,通过“对象.属性”或“对象.方法”的方式进行赋值。       

猜你喜欢

转载自blog.csdn.net/qq_61551764/article/details/121706129
今日推荐