从零开始学Java(七) private this static

private

java 语言中封装的步骤应该是这样的:需要被保护的属性使用 private 进行修饰,给这个私有的属性对外提供公开的 set get 方法,其中 set 方法用来修改属性的值, get 方法 用来读取属性的值。
 
其中 set 方法有一个参数,用来给属性赋值, set 方法没有返回值,一般在 set 方法内部编写安全控制程序, 因为 set 方法是修改内部数据的,而 get 方法不需要参数,返回值类型是该属性所属类型。
 
set 方法和 get 方法都不带 static 关键字,不带 static 关键字的方法称 为实例方法,这些方法调用的时候需要先创建对象,然后通过“引用”去调用这些方法,实例 方法不能直接采用“类名”的方式调用。
public class MobilePhone {

    private double voltage;

    public MobilePhone() {
    }

    public void setVoltage(double _voltage) {
        if(_voltage < 3 || _voltage > 5) {
            throw new RuntimeException("Exception!");
        }
        voltage = _voltage;
    }

    public double getVoltage(){
        return voltage;
    } 
}

public class MobilePhoneTest {
    public static void main(String[] args) {
        MobilePhone phone = new MobilePhone();
        phone.setVoltage(3.7);
        System.out.println("voltage:" + phone.getVoltage());
        phone.setVoltage(100);
        System.out.println("voltage:" + phone.getVoltage());
    } 
}

this

this 不能使用在 static 的方法中,可以使在实例方法中,代表当前对象,多数情况下 this 是可以省略不写的,但是在区分局部变量 和实例变量的时候不能省略,
 
在实例方法中可以直接访问当前对象实例变量以及实例方 法,在 static 方法中无法直接访问实例变量和实例方法。
public class ThisTest {
    int i = 10;
    public static void main(String[] args) {
    System.out.println(i);
    //会报错,无法从静态上下文引入非静态变量i
    } 
}
public class ThisTest {
    public static void main(String[] args) {
        doSome();
        //会报错,无法从静态上下文中引入非静态方法
    }
    public void doSome(){
        System.out.println("do some...");
    } 
}
this 还有另外一种用法,使用在构造方法第一行(只能出现在第一行),通过当前构造方法调用本类当中其它的构造方法,其目的是为了代码复用。调用时的语 法格式是: this( 实际参数列表 )
 
public class Date {
    private int year;
    private int month;
    private int day;

    public Date(){
        this(1970 , 1, 1);
    }
    public Date(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    } 
}

static

static java 语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。在 java 语言中凡是用 static 修饰的
 
都是类相关的,不需要创建对象,直接通过“类名”即可访问,即 使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关。
 
 
java 中的变量包括:局部变量和成员变量,在方法体中声明的变量为局部变量,有效范围很小,只能在方法体中访问,方法结束之后局部变量内存就释放了,在内存方面局部变量存储 在栈当中。
 
在类体中定义的变量为成员变量,而成员变量又包括实例变量和静态变量,当成员 变量声明时使用了 static 关键字,那么这种变量称为静态变量,没有使用 static 关键字称为实 例变量,实例变量是对象级别的,
 
每个对象的实例变量值可能不同,所以实例变量必须先创建 对象,通过“引用”去访问,而静态变量访问时不需要创建对象,直接通过“类名”访问。
 
例变量存储在堆内存当中,静态变量存储在方法区当中。实例变量在构造方法执行过程中初始 化,静态变量在类加载时初始化。

所有实例相关的,包括实例变量和实例方法,必须先创建对象,然后通过“引用”的方式去访问,如果空引用访问实例相关的成员,必然会出现空指针异常。
 
所有静态相关的, 包括静态变量和静态方法,直接使用“类名”去访问。 但实际上使用“引用”也可以访问,并且空引用访问静态变量和静态方法并不会出现空指针异 常。
 

静态代码块

静态代码块在类加载时执行,并且只执行一次。
 
一个类当中可以编写多个静态代码块(尽管大部分情况下只编写一个),并且静态代码块遵循自上而下的顺序依次执行,
 
所以有的时候放在类体当中的代码是 有执行顺序的(大部分情况下类体当中的代码没有顺序要求,方法体当中的代码是有顺序要求 的,方法体当中的代码必须遵守自上而下的顺序依次逐行执行),
 
另外静态代码块当中的代码 main 方法执行之前执行,这是因为静态代码块在类加载时执行,并且只执行一次。
 
public class StaticTest02 {
    static{
        System.out.println("静态变量 i = " + i);
        //会报错,非法前向引用i
    }
    static int i = 100;
}

静态方法

当方 法体中需要直接访问当前对象的实例变量或者实例方法的时候,该方法必须定义为实例方法, 因为只有实例方法中才有 this ,静态方法中不存在 this
 
在实际的开发中,“工具类”当中的方法一般定义为静态方法,因为工具类就是为了方便大家的使用,将方法定义为静态方法,比较方便调用,不需要创建对象,直接使用类名 就可以访问。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值