Java:static关键字,this关键字

static关键字

static翻译为“静态的”。
所有static关键字修饰的都是类相关的,类级别的。
所有static修饰的,都是采用“类名.”的方式访问。
static修饰的变量:静态变量
static修饰的方法:静态方法
变量根据声明的位置进行划分:
在方法体当中声明的变量叫做:局部变量。
在方法体外声明的变量叫做:成员变量。
成员变量又可以分为:实例变量和静态变量
静态的都是类相关的,访问时采用“类名.”的方式访问。不需要new对象。
不需要对象的残血即可访问,没有空指针异常的发生。
实例相关的,必须先有对象,才能访问,可能会出现空指针异常。
静态变量在类加载时初始化,不需要new对象,静态变量的空间开出来了。
静态变量存储在方法区。

 

什么时候变量声明为实例的,什么时候声明为静态的?
如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。
一个对象一份的是实例变量。
所有对象一份的是静态变量。
实例的:一定需要使用“引用.”来访问。
静态的:建议使用“类名.”来访问,但使用“引用.”也行(不建议使用“引用.”)。
静态的如果使用“引用.”来访问会让程序员产生困惑:程序员以为是实例的呢。
空指针异常只有在“空引用”访问“实例”相关的,都会出现空指针异常。
关于方法来说,什么时候定义为实例方法,什么时候定义为静态方法?
此方法一般都是描述了一个行为,如果说该行为必须由对象去触发。那么该方法定义为实例方法。
参考标准:
当这个方法体当中,直接访问了实例变量,这个方法一定是实例方法。
我们以后开发中,大部分情况下,如果是工具类的话,工具类当中的方法一般都是静态的。(静态方法有一个优点,是不需要new对象,直接采用类名调用,极其方便,工具类就是为了方便,所以工具类中的方法一般都是static的。)
工具类就是为了方便编程开发的一些类。

静态代码块

使用static关键字可以定义:静态代码块
静态代码块,语法:
static {
java语句;
java语句;
}
static静态代码块在类加载时执行,并且只执行一次,静态代码块有这样的特征/特点。
注意:静态代码块在类加载时执行,并且在main方法之前执行。
静态代码块一般是按照自上而下的顺序。
静态代码块有什么用?
第一:静态代码块不是那么常用 。(不是每一个类当中都要写的东西。)
第二:静态代码块这种语法机制实际上时SUN公司给我们java程序员的一个特殊的事课/时机。
这个时机叫做:类加载时机。
静态代码块和静态变量都是在类加载的时候执行的,时间相同,执行的顺序还是要看代码的先后顺序来决定谁先谁后。
到目前为止,遇到的所有的java程序,有哪些是有顺序要求的?
第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下的顺序执行。
第二:静态代码块1和静态代码块2是由先后顺序的。
第三:静态代码块和静态变量是有先后顺序的。

实例代码块

除了静态代码块之外,还有实例语句块。
实例语句块在类加载时并没有执行。
实例语句块语法:
{
java语句;
java语句;
}
只要是构造方法执行没必然在构造方法执行之前,自动执行“实例语句块”中的代码。
实际上这也是SUN公司为Java程序员准备一个特殊的时机,叫做对象构建时机。

this关键字

this是一个关键字,全部小写。是一个引用,保存内存地址指向自身。
一个对象一个this。
this是一个变量,是一个引用。this保存当前对象的内存地址,指向自身。
所以,严格意义上来说,this代表的就是“当前对象”
this存储在堆内存当中对象的内部。

this只能使用在实例方法中。谁调用这个实例方法,this就是谁。所以this代表 的是当前对象。
“this.”在大部分情况下是可以省略的。
this可以使用在实例方法中,不能使用在静态方法中,因为,this代表当前对象,静态方法中不存在当前对象。
在实例方法中,或者构造方法中,为了区分局部变量和实例变量,这种情况下:this. 是不能省略的。
this除了可以使用在实例方法中,也可以使用在构造方法中。
新语法:通过当前的构造方法去调用零一个本类的构造方法,可以使用以下格式:
this(实际参数列表);
this();的作用是,代码复用
通过一个构造方法1去调用构造方法2,可以做到代码复用。
但需要注意的是:“构造方法1”和“构造方法2”都是在同一个类中 。
对于this()的调用只能出现在构造方法的第一行。

以后的代码都是封装,所有的类都是属性私有化,对外提供setter和getter方法。
构造方法无参数构造方法和有参数构造方法都定义。

对面向对象这的内容做一下总结:

/*
    到目前为止一个类当中可以出现的:
    类体{
        实例变量;
        实例方法;

        静态变量;
        静态方法;

        构造方法;

        静态代码块;
        实力语句块;

        方法(){
            局部变量
        }
    }
*/
public class ZongJie{
    //类加载机制中,是这样的:在程序执行之前,凡是需要加载的类全部加载到JVM当中。
    //先完成加载才会执行main方法。
    static{
        System.out.println("ZongJie类加载时执行!");
    }
    //入口
    //静态方法
    public static void main(String[] args){
        //局部变量
        int i = 100;

        //完成一个对象的一连串动作。
        //一个学生在教室先学习,学习完成后去餐厅吃饭。
        Student s1 = new Student();

        //先学习,所以调用学习这个实例方法。
        s1.study();

        Student s2 = new Student();
    }
}

//学生类
class Student{
    //静态代码块
    static{
        System.out.printlc("Student类加载时执行!");
    }

    //学号
    private int no;//实例变量
    //姓名
    private String name;//实例变量
    //静态变量 类级别的谁能够
    static String job = "学习";

    //实例语句块
    {
        System.out.println("实例语句块,构造方法执行一次,这里就执行一次!");
    }

    //构造方法
    //无参数构造方法
    public Student(){
        //假设调用无参数的构造方法,默认创建的学生学号是100,名字是张三
        this(100,"张三");//这里使用了this()
    }
    //有参数构造方法
    public Student(int no,String name){
        this.no = no;
        this name = name;
    }

    //封装
    //setter and getter 方法
    public void setName(String name){
        this.name = name;
    }
    public String getName(String name){
        return name;
    }
    public void setNo(int no){
        this.no = no;
    }
    public int getNo(int no){
        return no;
    }

    //提供两个实例方法
    public void study(){
        //私有的是可以在本类中访问的。在其他类中必须使用set和get方法。
        //System.out.println(this.name + "正在努力学习!");
        //System.out.println(name + "正在努力学习!");

        //在实例方法中调用本类的其他实例方法
        System.out.println(this.getName() + "正在努力学习!");
        //System.out.println(getName + "正在努力学习!");

        //方法执行到此处表示学习完成了,接下来去吃饭。
        //this.eat();
        //this. 可以省略
        //编译器检测到eat()方法是实例方法,会自动在eat()方法前添加this.
        eat();
    }

    public vodi eat(){//实例方法
        System.out.println(this.getName() + "在餐厅吃饭呢!");

        //调用静态m1()方法
        //静态方法使用“类名.”的方式访问
        //Student. m1()

        //类名. 可以省略么?可以
        //java编译器会自动在m1()方法之前加“类名.”,因为检测到m1()方法是一个静态方法
        m1();
    }

    //提供两个静态方法
    public static void mi(){
        System.out.println("Student's m1 method execute!");
        //调用m2方法
        //Student.m2();
        m2();
    }
    public static vodi m2(){
        System.out.println("Student's m2 method execute!");
        System.out.println("工作性质:" + job);
        //编译器检测到job是一个静态变量,所以这里会自动在job前添加:Student.
        //System.out.println("工作性质:" + Student.job);
    }


}

程序再怎么变化,万变不离其宗,有一个固定的规律:
所有的实力相关的都是先创建对象,通过“引用.”来访问。
所有的静态相关的都是直接采用“类名.”来访问。

只要负责调用的方法a和被调用的方法b在同一个类当中:
this. 可以省略
类名. 可以省略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值