JAVA笔记八,关键字static、final和代码块详解

一 static关键字

  • 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类方法。
  • 如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。

1.1 使用范围:

  • 在Java类中,可用static修饰属性、方法、代码块、内部类
  • 被修饰后的成员具备以下特点:
    • 随着类的加载而加载
    • 优先于对象存在
    • 修饰的成员,被所有对象所共享。
    • 访问权限允许时,可不创建对象,直接被类调用

1.2 静态变量和实例变量的区别

  • 实例变量
    • 如果创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
  • 静态变量
    • 如果创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。

1.3 静态属性的其他说明:

  • 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
  • 静态变量的加载要早于对象的创建。
  • 由于类只会加载一次,静态变量在内存中也只会存在一份,存在方法区的静态域中。

1.4 静态方法

  • 没有对象的实例时,可以用类名.方法名()的形式访问由static修饰的类方法。
  • 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
  • 因为不需要实例就可以访问static方法,因此static方法内部不能有this,也不能有super
  • static修饰的方法不能被重写

1.5 练习

  1. 编写一个类实现银行账户的概念。
  • 包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,定义封装这些属性的方法。
  • 账号要自动生成。
  • 编写主类,使用银行账户类,输入、输出3个储户的上述信息。
  • 考虑:哪些属性可以设计成static属性。
  public class Test1 {
    public static void main(String[] args) {
        Account acc1 = new Account("123",5000);
        Account acc2 = new Account("1234",55000);
        System.out.println(acc1);
        System.out.println(acc2);
    }
}
class Account {
    private int id;
    private String password;
    private double surplus;// 存款余额
    private static double rate = 0.0045;// 利率
    private static double minSurplus;
    private static int total = 1000;

    public Account() {
        id = total++;
    }

    public Account(String password, double surplus) {
        this();
        this.password = password;
        this.surplus = surplus;
    }

    public int getId() {
        return id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double getSurplus() {
        return surplus;
    }

    public void setSurplus(double surplus) {
        this.surplus = surplus;
    }

    public static double getRate() {
        return rate;
    }

    public static void setRate(double rate) {
        Account.rate = rate;
    }

    public static double getMinSurplus() {
        return minSurplus;
    }

    public static void setMinSurplus(double minSurplus) {
        Account.minSurplus = minSurplus;
    }

    @Override
    public String toString() {
        return getClass()+"["+id+"---"+surplus+"----]";
    }    
}

二 代码块

2.1 代码块的作用

对Java类或对象进行初始化

2.2 代码块的分类:

  • 一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(static block)
  • 没有使用static修饰的,为非静态代码块。
  • static代码块通常用于初始化static的属性
class Person {
    public static int total;
    static {
        total = 100;//为total赋初值
    }
}

2.3 静态代码块

  1. 可以有输出语句。
  2. 可以对类的属性、类的声明进行初始化操作。
  3. 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
  4. 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
  5. 静态代码块的执行要先于非静态代码块。
  6. 静态代码块随着类的加载而加载,且只执行一次。

2.4 非静态代码块

  1. 可以有输出语句。
  2. 可以对类的属性、类的声明进行初始化操作。
  3. 除了调用非静态的结构外,还可以调用静态的变量或方法。
  4. 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
  5. 每次创建对象的时候,都会执行一次。且先于构造器执行。

2.5 变量赋值的执行顺序

  1. 成员变量的默认初始化,基本数据int0,double0.0,boolean(false),引用数据类型null
  2. 显式初始化、多个初始化块依次被执行(同级别下按先后顺序执行)
  3. 构造器再对成员进行初始化操作
  4. 通过“对象.属性”或“对象.方法”的方式,可多次给属性赋值

2.6 练习

public class Test2 {
    public static void main(String[] args) {
        System.out.println("************************");
		new Son();
		System.out.println("************************");

		new Son();
		System.out.println("************************");
		new Father();
/*输出
************************
11111111111
44444444444
22222222222
33333333333
55555555555
66666666666
************************
22222222222
33333333333
55555555555
66666666666
************************
22222222222
33333333333 
*/
    }
}
class Father {
	static {
		System.out.println("11111111111");
	}
	{
		System.out.println("22222222222");
	}

	public Father() {
		System.out.println("33333333333");

	}

}

class Son extends Father {
	static {
		System.out.println("44444444444");
	}
	{
		System.out.println("55555555555");
	}
	public Son() {
		System.out.println("66666666666");
    }
}

三 final关键字

  • 在声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”。
  • final标记的类不能被继承。提高安全性,提高程序的可读性。如String类、System类、StringBuffer类
  • final标记的方法不能被子类重写。
  • final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。
  • final标记的成员变量必须在声明时或在每个构造器中或代码块中显式赋值,然后才能使用。
  • 使用final修饰形参时,表明此形参是一个常量。当调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值。
  • static final:全局常量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值