static关键字及编程题目解析

一、static:

1、static基础知识点:

类的五个成员:属性、方法、构造函数、初始化块、内部类。

 

 

 

static,静态的,可以用来属性、方法、*代码块(或初始化块)、*内部类。

class SportsMan{

//  实例变量

    String name;

    int age;

//  类变量(大家都共用)

    static String nation;

}

SportsMan s=new SportsMan();

SportsMan.nation;s.nations.name;s.age;可以。但SportsMan.name;SportsMan.age;不行。

 

A、static修饰属性(类方法):

1、由类创建的所有对象,都共用这一个属性。

2、当其中一个对象对此属性进行修改,会导致其他对象对此属性的一个调用。VS 实例变量(非static修饰的属性,各个对象各自拥有一套副本);静态的变量是共用的。

3、类变量:只要加载了这个类,这个变量就会加载。(类变量在没有实例对象时是不在内存中的;而实例变量是所有对象都共有的,即使没创建对象实例时,实例变量也在内存中)。

4、实例变量必须通过对象调用并赋值;而类变量可直接用”类名.实例变量名”。

5、类变量的加载早于对象。(所以当有对象以后,可以用“对象.类变量”;但是”类.实例变量” 是不可以的)实例变量是随着对象的加载而加载的;而类对象是只要类加载了,类对象就加载。

6、类变量存在于静态域中。

 

 

B、static修饰方法(类方法):

1、随着类的加载而加载,在内存中也是独一份。

2、可以直接通过”类.静态类方法名”的方式调用。而普通的方法不可以用“类.普通方法名”来调用。

3、在静态方法内部可以调用静态的属性或静态的方法,而不能调用非静态的属性或方法;反之,非静态的方法是可以调用静态的属性或静态的方法的。

4、构造器没有静态与非静态之说,构造器类似于方法,内部可以引用静态与非静态两种结构的属性、方法等。

       à静态的方法里面不可以由this或super关键字

注:静态的结构(static类型的属性、方法、代码块、内部类)的生命周期都要早于非静态的结构,同时被回收也要晚于非静态结构。

 

实例代码讲解:

package com.atguigu.cn03;



public class TestSportsMan {

    public static void main(String[] args) {

        SportsMan s1=new SportsMan("金龙",23);

        SportsMan s2=new SportsMan("银龙",21);

        s1.age=34;

        s1.nation="China";

        System.out.println(s1);

        System.out.println(s2);

        System.out.println(SportsMan.nation);

//      --------------------------------------------

//      SportsMan.show();  此形式不正确。有错误。普通方法调用不可以用"类.普通方法名"

        s1.show();

        SportsMan.show1(); //静态方法可以用"类.静态方法名"调用。

       

    }

}

class SportsMan{

//  实例变量

    String name;

    int age;

//  类变量(大家都共用)

    static String nation;

    public SportsMan(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    @Override

    public String toString() {

        return "SportsMan [name=" + name + ", age=" + age + ", nation=" + nation + "]";

    }

   

    public void show() {

//      非静态的方法是可以调用静态的属性或静态的方法的。

        System.out.println("age:"+this.age+",nation:"+nation);

        info();

        System.out.println("我是一个来自于中国的运动员。");

    }

    public static void show1() {

//      在静态方法内部可以调用静态的属性或静态的方法。

        info();

        System.out.println("我是一个来自于中国的运动员2号。");

    }

   

    public static void info(){

        System.out.println("我是被调的静态的方法。");

    }

}

注:依赖于具体的对象的话就不可以声明为静态的,

 

2、static编程练习题:

误解:

package com.atguigu.cn03;

提示://使用静态的变量可以实现累加的效果,因为静态的变量在内存中独一份。

public class TestAccount {

    public static void main(String[] args) {

        Account a1=new Account("abc123",1000);

        Account a2=new Account("abc456",2000);

        System.out.println(a1);

        System.out.println(a2);

    }

}



class Account{

    private int id;//账号--账号递增(自增)

    private String password;//密码

    private double balance;//余额

    private static double rate;//利率

    private static double minBalance;//最小余额

    private int init=1000; // private static int init=1000; 



   

    public Account(String password,double balance) {

        this.id=init++;

        this.password=password;

        this.balance=balance;

    }

    //gettters and setters方法

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    public double getBalance() {

        return balance;

    }

    public void setBalance(double balance) {

        this.balance = balance;

    }

    public static double getRate() {

        return rate;

    }

    public static void setRate(double rate) {

        Account.rate = rate;

    }

    public static double getMinBalance() {

        return minBalance;

    }

    public static void setMinBalance(double minBalance) {

        Account.minBalance = minBalance;

    }

    //toString方法

    @Override

    public String toString() {

        return "Account [id=" + id + ", password=" + password + ", balance=" + balance + "]";

    }

}

结果:(未能实现id自增即累加)

Account [id=1000, password=abc123, balance=1000.0]

Account [id=1000, password=abc456, balance=2000.0]

改正:应将init(初始账号)设置为static类型的变量,这样才能实现自增累加。

提示://使用静态的变量可以实现累加的效果,因为静态的变量在内存中独一份。

 

猜你喜欢

转载自blog.csdn.net/qq_39044046/article/details/94188226
今日推荐