zoukankan      html  css  js  c++  java
  • static、final、this、super关键

    1、static
       static关键字修饰的变量或者函数是属于整个类的,调用方式,类名.变量/方法
       静态函数中,只能调用静态的变量或者函数
       静态的变量只会运行一次

       public class Test {
        public static void main(String[] args)  {
                MyClass myClass1 = new MyClass();
                MyClass myClass2 = new MyClass();

                System.out.println(myClass1.j);
                System.out.println(myClass2.j);
     
        }
       }
     
       class MyClass {
        public static double j = Math.random();
       }

       两次的j的值相同

    2、final

       1.修饰类
       当用final修饰一个类时,表明这个类不能被继承

       2.修饰方法
       把方法锁定,以防任何继承类修改它的含义

       3.修饰变量
       ①对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改

       当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了

       ②如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象

       当用final修饰引用变量时
       public class Test {
        public static void main(String[] args)  {
            final MyClass myClass = new MyClass();
            System.out.println(++myClass.i);
     
         }
       }
     
       class MyClass {
        public int i = 0;
       }

       输出结果为1

       这说明引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的

       ③final和static

       static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变

       public class Test {
        public static void main(String[] args)  {
                MyClass myClass1 = new MyClass();
                MyClass myClass2 = new MyClass();
                System.out.println(myClass1.i);
                System.out.println(myClass1.j);
                System.out.println(myClass2.i);
                System.out.println(myClass2.j);
     
        }
       }
     
       class MyClass {
        public final double i = Math.random();
        public static double j = Math.random();
       }

       运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的

       ④使用final修饰方法参数的目的是防止修改这个参数的值,同时也是一种声明和约定,强调这个参数是不可变的
    3、this关键字
       this:当前对象
       this():当前类的无参构造方法,也可以指定有参的构造方法this(a)
       1、如果一个类的方法需要访问该类本身的成员变量或其它方法,可以使用this引用
       2、每个对象可以使用this关键字引用它本身,如:
          我们可以将this引用作为参数给一个方法,通过这种方式,一个对象可以将它本身的引用传给其它对象
       3、可以在构造方法中调用本类的其它构造方法,但是必须放在构造方法的第一行

    4、super关键字
       super:直接父类对象
       super():直接父类的无参构造方法,也可以指定有参构造方法super(a)

       1、当子类成员变量b覆盖父类成员变量b时,使用super.b调用父类被隐藏的成员变量
       public class Person {

        String  name = "张三";

       }
       public class Teacher extends Person{

        String name = "李四";

        public Teacher() {
            System.out.println(name);     //name = "李四"
            System.out.println(super.name);  //super.name = "张三"
        }
       }

       2、当子类重写了父类方法method时,使用super.method()调用父类被隐藏的方法

       3、实例化子类对象时,必定会调用父类构造方法,如果没有写super(),则默认调用父类构造方法
          如果父类谢了有参构造方法,编译器就不会为父类创建无参构造方法,此时super()没有被定义,则必须在子类构造方法中写明super(参数),或在父类中显示的写出父类的无参构方法(一般使用这种方法)
          
       public class Person {

        String  name;

        public Person(String name) {
            this.name = name;
        }
       }

       在编写一个类去继承Person类的时候会产生编译错误
       解决方法一:在子类构造方法中编写super(参数),且必须放在子类构造方法的第一行

       public class Teacher extends Person{

        String name;

        public Teacher(String name) {
            super(name);
            System.out.println(name);
        }
       }

       解决方法二:在父类中显示的写出父类的无参构方法(一般使用这种方法)
       public class Person {
        String  name;
        public Person() {}

        public Person(String name) {
            this.name = name;
        }
       }

  • 相关阅读:
    程序员面试中有几大法则
    实现立方体旋转
    为什么技术与产品沟通起来总是那么痛苦
    移动互联网下半场的面试真经,让你进入 BAT 不再是梦
    Javascript+H5实现打小地鼠游戏
    Python多进程应用
    Python数据分析笔记:聚类算法之K均值
    给新手程序员的16个工作必备小妙招,省下时间去LOL吧!
    MySQL数据库开发常见问题及优化
    java中的四种引用类型
  • 原文地址:https://www.cnblogs.com/snzd9958/p/9446474.html
Copyright © 2011-2022 走看看