【Java】—— Java面向对象高级:关键字static的使用

目录

1. 关键字:static

1.1 类属性、类方法的设计思想

1.2 static关键字

1.3 静态变量

1.3.1 语法格式

1.3.2 静态变量的特点

1.4 静态方法

1.4.1 语法格式

1.4.2 静态方法的特点

1.5 练习


1. 关键字:static

        回顾类中的实例变量(即非static的成员变量)

class Circle{
	private double radius;
	public Circle(double radius){
        this.radius=radius;
	}
	public double findArea(){
        return Math.PI*radius*radius;
    }
}

        创建两个Circle对象:

Circle c1=new Circle(2.0);  //c1.radius=2.0
Circle c2=new Circle(3.0);  //c2.radius=3.0

        Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,c1中的radius变化不会影响c2的radius,反之亦然。

如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(或类属性)!

1.1 类属性、类方法的设计思想

        当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。例如,所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。

        此外,在类中声明的实例方法,在类的外面必须要先创建对象,才能调用。但是有些方法的调用者和当前类的对象无关,这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

        这里的类变量、类方法,只需要使用static修饰即可。所以也称为静态变量、静态方法

1.2 static关键字

  • 使用范围:

    • 在Java类中,可用static修饰属性、方法、代码块、内部类

  • 被修饰后的成员具备以下特点

    • 随着类的加载而加载

    • 优先于对象存在

    • 修饰的成员,被所有对象所共享

    • 访问权限允许时,可不创建对象,直接被类调用

1.3 静态变量

1.3.1 语法格式

        使用static修饰的成员变量就是静态变量(或类变量、类属性)

1.3.2 静态变量的特点
  • 静态变量的默认值规则和实例变量一样。

  • 静态变量值是所有对象共享

  • 静态变量在本类中,可以在任意方法、代码块、构造器中直接使用

  • 如果权限修饰符允许,在其他类中可以通过“类名.静态变量”直接访问,也可以通过“对象.静态变量”的方式访问(但是更推荐使用类名.静态变量的方式)。

  • 静态变量的get/set方法也静态的,当局部变量与静态变量重名时,使用“类名.静态变量”进行区分。

1.4 静态方法

1.4.1 语法格式

        用static修饰的成员方法就是静态方法。

1.4.2 静态方法的特点
  • 静态方法在本类的任意方法、代码块、构造器中都可以直接被调用

  • 只要权限修饰符允许,静态方法在其他类中可以通过“类名.静态方法“的方式调用。也可以通过”对象.静态方法“的方式调用(但是更推荐使用类名.静态方法的方式)。

  • 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。

  • 静态方法可以被子类继承,但不能被子类重写。

  • 静态方法的调用都只看编译时类型

  • 因为不需要实例就可以访问static方法,因此static方法内部不能有this,也不能有super。如果有重名问题,使用“类名.”进行区别。

1.5 练习

练习:

编写一个类实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,定义封装这些属性的方法。账号要自动生成。

编写主类,使用银行账户类,输入、输出3个储户的上述信息。

Account类

package exer1;

/**
 * ClassName:IntelliJ IDEA
 * Description:
 *   编写一个类实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,
 *   定义封装这些属性的方法。`账号要自动生成
 * @Author zyjstart
 * @Create:2024/9/3 21:43
 */
public class Account {
    private int id;             // 账户
    private String password;    // 密码
    private double balance;     // 余额

    // 静态变量
    private static double interestRate; // 利率,使用static修饰,共享
    private static double minBalance = 1.0; // 最小余额

    private static int init = 1001; // 用于自动生成id的基数

    // 构造器
    public Account() {
        this.id = init;
        init++;
        password = "000000";
    }
    // 由于id要自动生成,所以这里不需要添加id的参数
    public Account( String password, double balance) {
        this.password = password;
        this.balance = balance;
        this.id = init;
        init++;
    }

    //get、set方法


    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 getInterestRate() {
        return interestRate;
    }

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

    public static double getMinBalance() {
        return minBalance;
    }

    public static void setMinBalance(double minBalance) {
        Account.minBalance = minBalance;
    }

    // alt + insert快速生成toString()方法
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", password='" + password + '\'' +
                ", balance=" + balance +
                '}';
    }
}

AccountTest类

package exer1;

/**
 * ClassName:IntelliJ IDEA
 * Description:
 *  编写主类,使用银行账户类,输入、输出3个储户的上述信息。
 * @Author zyjstart
 * @Create:2024/9/3 21:51
 */
public class AcountTest {
    public static void main(String[] args) {

        Account acc1 = new Account();
        System.out.println(acc1);

        Account acc2 = new Account("123456",20000.0);
        System.out.println(acc2);

        // 通过类名去调用静态属性
        Account.setInterestRate(0.0123);
        Account.setMinBalance(10);
        System.out.println("银行存款的利率为:" + Account.getInterestRate());
        System.out.println("银行最小存款额度为:" + Account.getMinBalance());
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值