Java中的关键字(this,super......)

目录

一、this

二、super

三、static

四、final

五、finalize与fianlly


一、this

  1. 首先要知道,this是一个关键字,翻译为这个
  2. this是一个引用变量,所以它里面存放的是地址,但这是一个特殊的地址,它里面存放的是指向他自身的地址。
  3. package com.ThisTest;
    
    public class Student {
        private String name;
        public Student(String name) {
            this.name = name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void work(){
            System.out.println(this.getName()+"在工作");
        }
    }
    

    以上是一个student类,观察下面的测试类

    package com.ThisTest;
    
    public class TestMain {
        public static void main(String[] args) {
            Student s=new Student("张三");
            s.work();//输出结果为:张三在工作,因为s调用student中的work方法,s就是this
            Student s2=new Student("李四");
            s2.work();//输出结果为:李四在工作,因为s2调用student中的方法,s2就是this
        }
    }

    所以无论那个对象调用某个包含this的方法,this就代替哪个对象

  4. this只能出现在实例方法中,不能出现在静态方法中,即this不能出现在方法的修饰符列表上带有static关键字的方法中,如public static void main()这个方法中。

  5. 的大部分情况下this可以省略不写,但在用于区*部变量和实例变量的时候不能省略。一般在使用构造方法和set()时,无论使用idea还是eclipse基本都是自动生成的,所以可能会没有注意到这儿地方,所以大家要记住在构造方法和set中this是不可以省的。

二、super

  1. this和super的都是Java中的关键字,使用方法是差不多的,但是他不是一个引用变量(什么变量都不是),里面不存放地址,代表的是当前对象的父类特征。
  2. super不能出现在带有static关键字的方法中。在构造方法的第一行,Java会默认提供一个super(),也可以用super(实参)手动调用父类中的方法,如果在构造方法中手动加一个super()的话,一定要写在构造方法第一行。
  3. package com.SuperTest;
    
    //customer为父类
    
    public class Customer {
        private String name;
        private int age;
        public Customer(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
        public void setAge(){
            this.age=age;
        }
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        public void welcome(){
            System.out.println("你好!");
        }
    }
    
    package com.SuperTest;
    
    //vip为子类
    
    public class Vip extends Customer {
        public Vip(String name) {
            super(name);//super用法之一:super(实参)
        }
        public void show(){
            System.out.println(this.getName()+"你好");//前面的this一般是会省略的
            System.out.println(super.getName()+"你好");//super用法之二:super.属性名
            super.welcome();//super用法之三:super.方法名
        }
    }
    
    package com.SuperTest;
    
    public class TestMain {
        public static void main(String[] args) {
            Vip v=new Vip("张三");
            v.show();
    
        }
    }
    

    最后的输出结果为张三你好、张三你好、你好!。customer为父类,VIP为子类,在父类中写一个name属性,在子类即VIP中继承下来,所以给子类中的name赋值之后,再在子类中用super,就会赋值给父类中的name属性。

  4. 总结以下super的用法:
  • super(实参):用在构造方法的第一行,用来调用父类构造方法
  • super.属性名:访问父类中的属性
  • super.方法名:访问父类中的方法

三、static

物体A和物体B有共同的特性,将这些共同的特性抽象出来行一个模板、一个概念,就形成了一个类。比如说中国人张三和李四,他俩的共同特性:都有姓名,年龄,性别,国籍......可以将他们构成一个类Chinese,到时候在通过new构造方法创建张三李四等不同的对象,每创建一个对象就会占用一块内存空间(姓名,年龄,国籍等占用空间)。这里面有一个属性的值是所有对象都一样的(国籍),都是中国人,如果在调用构建构造方法的时候,每创建一个对象就对国籍赋一次值,会浪费不必要的内存空间。所以此时可以将国籍提升为一个模板,这时就需要加一个static关键字了,同时赋值。即private static String country="中国",这样就不用再创建对象时再给国籍赋值了,也减少了不必要的内存的浪费

四、final

  1. final是一个关键字,表示最终的
  2. 被final修饰的类不能被继承
  3. 被final修饰的方法不能被重写
  4. 被final修饰的属性的值一旦确定了不能被修改
  5. final和static一起使用用来定义常量

public final class A{  }//被final修饰的类不能被继承

public class B extends A{ }   //错误  ,因为A被final修饰


public class C{ public final void m(){......} }    //被final修饰的方法不能被重写                                     

public class D extends C{ public  void m(){......} }      //错误,因为m被final修饰


public class Test{

        public static void main(string[]args){

            fianl int a=10;   //被final修饰的属性的值一旦确定了不能被修改

             a=21;       //  错误,因为a被final修饰  

               public static final String COLRE="red";//final和static一起使用用来定义常量

        }

}

五、finalize与fianlly

1、finalize

fianllize是object类中的一个方法,源码是:

protected void finalize()throws Throwable{

}

里面没有任何代码,只有一个方法体,这个方法在什么时候会被调用呢?当Java中的对象成为垃圾时,jvm就会自动启用垃圾回收器,垃圾回收器自动调用fianlize这个方法,不需要程序员手动调用,fianlize()其实是sun公司为Java程序员提供的一个垃圾销毁时机,希望在垃圾销毁时需要执行一段代码的话,就需要写在这个地方就可以,就相当于人在和这个美丽的世界说拜拜之前留下的遗言,所有的类都是直接或间接继承object类,所以我们只需要讲这个fianlize()进行重写就可以了。但垃圾回收器不会轻易启动,但可以通过System.gc()这个方法,提高启动的效率,效率只是提高了而已,并不是就会启动。

2、finally

finally子句中的代码都是最后执行的,而且是一定会执行的,finally必须和try一起使用,和try一起使用的时候可以没有catch,但不可以只和catch使用。即使try{。。。}catch{。。。}语句中的代码出现了异常也一定汇之星finally里面的语句块,所以在fianlly中一般完成资源的释放和关闭。

package com.SuperTest;

public class TestMain {
    public static void main(String[] args) {
        try {
            System.out.println("我是第一步执行的");
            return ;//第三步执行return语句
            
        }finally {
            //如果以下这段代码块不放在finally语句中,那么下面这句话就不会执行了
            System.out.println("我是第二步执行的");
        }

    }
}

上一篇:局部内部类


下一篇:flutter 仿网易云音乐(2)