static & final

static
静态关键字,可以修饰属性方法代码块内部类

1.static修饰的属性称为静态属性(类变量,静态属性),它的存在不需要对象。当你所声明的一个变量可以被所有对象共享时可以声明其为静态的。
2.static修饰的方法称为静态方法(类方法),当你声明的方法与调用者无关时,可以声明其为静态的。
3.static可以修饰代码块,这一块代码块称为静态代码块,它的作用是初始化类,可以利用静态代码块给类进行初始化,相当于构造器的作用。
当类被载入时,静态代码块会执行,且执行一次,由JVM自动执行。

当类被载入时,类属性的声明和静态代码块按照先后顺序执行,且只被执行一次。

与静态代码块相对的是动态代码块(没有被static修饰的代码块),它在对象创建的时候无条件执行一次,动态代码块比构造器先执行。
4.static修饰内部类,之后写。

static修饰的属性和方法,代码块,保存在类模板中,他们在类模板中并不仅仅是声明一下,他们有着各自的内存空间。

static修饰后具有的特点:
a.随着类的加载而加载
b.优先于对象存在
c.修饰的成员可以被对象共享
d.访问权限允许时,可不创建对象,直接调用
调用方法: 类名.方法/属性(本类中不需要加类名)

注意事项:
1.非静态环境下可以访问静态方法/成员
2.在静态环境下this,super被禁止,也不能直接访问非静态
3.子类不能继承static方法/属性,但是可以访问(因为子类中有父类模板的标记)

final(最终的)
final可以声明:类,变量,方法

注意事项:
1.final修饰的类不能被继承,方法不能被重写,变量只能被赋值一次(清0操作不算赋值)
2.在类中可以声明空final量,但是必须尽快赋值,且只能赋值一次。
可以利用语句块对其赋值。
public static final 全局常量
3.建议final修饰的变量全部大写

利用static/final关键字写个程序:代码中有详细的注释,这里就不啰嗦了。

/**
    1)Frock类,包含尺寸(大小),颜色,价格等属性
      覆盖toString()方法(返回frock的详细信息)
    2)在Frock类中声明serialNumber属性,并提供对应的get方法
    3)在Frock类中声明静态语句,语句块中奖currentNum的初始值设为150000,
    作为衣服出厂序列号的起始值,并打印输出
    4)在Frock类中声明公有的静态常量INCREMENT,值为100,修改静态方法getNextNum
    用INCREMENT常量代替原有的增量值100。
    5)将Frock类中的serialNumber属性改为空final变量,并且仍然在构造器中为其赋值
*/

public class Frock {
    /*
        类级别,只是调用的时候不用创建对象而已
        static (静态属性)类变量,它的存在不需要对象(若是一个变量可以被所有对象共享,那么这个变量可以声明为static)
                静态方法同样的道理,静态的东西调用不需要创建对象,只需要使用类名.(属性名)/(方法名)即可完成调用
        用static修饰的变量/方法的特点:
                随着类的加载而加载(保存在类模板中,有空间,不仅仅是定义)
                优先于对象存在
                修饰的变量/方法可以被对象共享,调用只与类名有关(本类中不需要加类名)
                子类不能继承static方法/属性,但是可以访问(因为有类标记)
    */
    //声明公有的静态常量INCREMENT
    public static final int INCREMENT;
    //声明私有静态属性currentNum,并设置初始值为100000,currentNum作为序列号初始值,
    //所有对象可以共享这个属性,因此设置为static型
    private static int currentNum = 100000;
    /*
        静态代码块(可以用于初始化类,相当于类的构造器)
        当类被载入时,静态代码块会被执行,且执行一次,由JVM自动执行
        允许有多个静态代码块,这些代码块之间顺序执行
    */
    //利用static代码块给static型的变量进行赋值
    static{
        INCREMENT = 100;
        currentNum = 150000;
        System.out.println("衣服出厂序列号起始值" + currentNum);
    }
    //静态属性必须由静态方法来访问
    //声明公有的静态方法getNextNum(),作为上衣唯一序列号的方法。
    //每调用一次,将currentNum增加100,并作为返回值
    public static int getNextNum() {
        currentNum += INCREMENT;
        return currentNum;
    }
    //衣服的属性
    private int size;
    private String color;
    private double price;
    //序列号每件衣服都是唯一的,因此可以使用final修饰,不允许改变,可以先声明空final量,但是很危险,必须尽快进行
    //第一次赋值,清0不算赋值
    private final int serialNumber;

    /*
        动态代码块
        在对象创建的时候无条件执行一次,优先于构造器
        也可以存在多个,多个之间顺序执行
    */
    //利用动态代码块的特点(在对象创建的时候无条件执行一次,优先于构造器)给 final型的serialNumber变量进行第一次赋值,
    //调用getNextNum方法,获取唯一序列号
    {
        serialNumber = getNextNum();
    }
    //因为利用动态代码块在对象创建的时候已经对空final量进行处理,因此在构造器中不需要对final量进行处理
    public Frock() {
        //this(0, "未知", 0);
    }
    public Frock(int size, String color, double price) {
        this.size = size;
        this.color = color;
        this.price = price;
        //serialNumber = this.getNextNum();
    }
    //给序列号提供一个公共的获取方法
    public int getSerialNumber() {
        return serialNumber;
    }

    public void setSize(int size) {
        this.size = size;
    }
    public int getSize() {
        return size;
    }

    public void setColor(String color) {
        this.color = color;
    }
    public String getColor() {
        return color;
    }

    public void setPrice(double price) {
        this.price = price;
    }
    public double getPrice() {
        return price;
    }

    //重写toString
    //int size, String color, double price
    @Override
    public String toString() {

        return "序列号:" + serialNumber +  "尺寸:" + size + ",颜色:" + color + ",价格:" + price;
    }
}
/**
    Frock测试类
*/
public class FrockTest {

    public static void main(String[] args) {

        //分两次调用getNextNum()获取序列号并打印输出
        System.out.println("序列号:" + Frock.getNextNum());
        System.out.println("序列号:" + Frock.getNextNum());

        //int size, String color, double price
        Frock frock1 = new Frock(4, "黑色", 45.4);
        Frock frock2 = new Frock(6, "红色", 85.4);
        Frock frock3 = new Frock(9, "蓝色", 35.4);

        System.out.println(frock1);
        System.out.println(frock2);
        System.out.println(frock3);
    }
}

加油!努力!
努力让自己更优秀!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值