ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-12 16:03:13  阅读:131  来源: 互联网

标签:Java name ...... public void static super final


目录

一、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("我是第二步执行的");
        }

    }
}

标签:Java,name,......,public,void,static,super,final
来源: https://blog.csdn.net/m0_66088782/article/details/122446499

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有