欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA小白要努力-----关于static的用法以及this与super的 “相爱相杀”

程序员文章站 2022-07-14 16:44:28
...

一、在java里面,什么时候用static,什么时候不用static,对于初学者而言是个让人很头大的问题,笔者查阅了大量资料,自己加以归纳总结,希望能帮助到大家。

按照大多数人的理解,如果你的对象里出现了数据共享,那么就要加一个static,大家谁都可以调用,但是如果我们都加上static,那么我们的java就会由面向对象编程转换为面向过程编程。
我们看一个栗子

class Person{
        String name;
        int age;
        static String location;
    }


 public class StaticTest {

    public static void main(String[] args) {

        Person c1 = new Person();
        c1.name = "张三";
        c1.age = 18;

        c1.location = "西西伯利亚";

        Person c2 = new Person();
        c2.name = "李四";
        c2.age = 2;

        c2.location = "米奇妙妙屋";

        System.out.println(c1.location);
    }
}

这个的运行结果是“米奇妙妙屋”,这里也就体现出了静态变量与非静态变量的区别,如果我们使用静态变量,当我们创建了类的多个对象的时候,多个对象就会共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的,这就是为什么输出的不是“西西伯利亚”。

那么什么时候用?什么时候不用呢?
我们先看一下static在java里面有什么作用:

  1. 首先是静态的,毋庸置疑
  2. 那么它可以修饰属性,方法,代码块,内部类。
  3. 当我们用static修饰属性的时候,那就把其称作为“静态变量”。
  4. 当我们创建了类的多个对象,那么每一个对象都应独立的拥有一套类中的非静态属性。当我们修改一个对象的非静态属性时,是不会导致其他对象中的此属性值发生改变。
  5. 那么我们如果把创建的这多个类的对象,让这些对象共享同一个静态变量。当我们再次通过某一个对象修改静态变量的时候,就会导致此变量的值发生改变。
  6. 我们的静态变量是随着类的加载而加载,我们使用类.静态变量的方式调用。
  7. 我们需要知道,在静态方法里,只能调用静态的方式或属性。但是在我们的非静态方法里,我们是既可以调用非静态的方法或属性,也可以调用静态的方法或者属性。
  8. 我们知道类是可以调用类变量的,我们的对象也可以调用类变量,当然对象也可以调用实例变量,但是我们的类是不能调用实例变量的
  9. 那么我们的类是可以使用静态方法的,对象也可以使用静态方法,对象也是可以调用非静态方法的,但是类是无法调用非静态方法的
  10. 需要注意,在静态方法里,是不能使用this关键字的,也不能使用super关键字。

上面十点,请务必掌握。
那么我们怎么判断一个属性是否声明为static?

属性是可以被多个对象所共享的,并且不会随着对象的不同而不同。

那么怎么判断一个方法是否为static的类型?

当我们操作静态属性的方法,基本上是要设置为static的。
在工具类中,习惯上为static,比如:Math,Arrays,Collections等等。

二、super和this的相爱相杀
super 和 this 的注意点:

  1. super如果调用父类的构造方法,必须在构造方法的第一个。
  2. super 必须只能出现在子类的方法或者构造方法中。
  3. super和this不能同时调用构造方法。
  4. 两者代表的对象不同,this指本身调用者的这个对象。而super代表父类对象的应用。
  5. this 在没有继承的条件下,也是可以使用的。而super只能在继承条件下才能使用。
  6. 在构造方法里,this()表示本类的构造,而super()表示父类的构造。

我们先来看看this的用法:

this代表当前对象的一个引用。当前对象,就是指调用类中方法或属性的那个对象。
this只能在方法内部使用,表示对“调用方法的那个对象”的引用。
this不能用于静态方法。main方法也是静态的,所以this也不能用于main方法。
用this关键字调用重载构造方法。只能在构造方法中用,并且必须位于构造方法的第一句。

//菜鸟教程上提供了这么一个栗子:
class Person {
    private int age = 10;
    public Person(){
    System.out.println("初始化年龄:"+age);
}
    public int GetAge(int age){
        this.age = age;
        return this.age;
    }
}
 
public class test1 {
    public static void main(String[] args) {
        Person Harry = new Person();
        System.out.println("Harry's age is "+Harry.GetAge(12));
    }
}       

答案:

初始化年龄:10
Harry’s age is 12

关于this的详细说法,可以参考此文章:Java中this关键字的详解,此文中对“this()必须是构造方法中的第一条语句”有着详细说法,大家可以参考。

super的用法

1、调用父类被子类重写的方法;
2、调用父类被子类重定义的字段(被隐藏的成员变量);
3、调用父类的构造方法;

//菜鸟教程上的实例,子类中的成员变量或方法与父类中的成员变量或方法同名
class Country {
    String name;
    void value() {
       name = "China";
    }
}
  
class City extends Country {
    String name;
    void value() {
    name = "Shanghai";
    super.value();      //调用父类的方法
    System.out.println(name);
    System.out.println(super.name);
    }
  
    public static void main(String[] args) {
       City c=new City();
       c.value();
       }
}
/*
输出结果:
Shanghai
China
*/

可知,我们的super在这里既调用了父类的方法,也调用了父类的变量。
对于super,引入一位大佬的文章,我觉得你的老师未必都能讲得这么好,希望大家仔细阅读:Java笔试面试题整理第七波

然后看一下他俩的区别(参考菜鸟教程):

  • super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。
    this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。
  • super() 从子类中调用父类的构造方法。
    this() 在同一类内调用其它方法。
  • super() 和 this() 均需放在构造方法内第一行。
  • this 和 super 不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有 super 语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
  • this() 和 super() 都指的是对象,所以,均不可以在 static 环境中使用。
  • super: 它引用当前对象的直接父类中的成员。 this:它代表当前对象名
  • this 是一个指向本对象的指针, 然而 super 是一个 Java 关键字。

总结了JAVA里面的static的使用,以及this与super的区别,文中笔者推荐的两篇大佬文章请一定阅读,写的很详细。文中若有错误,请在评论区留言,感谢你的支持。

念念不忘,必有回响。

相关标签: JAVA基础 java