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

Posted 敲代码的xiaolang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA小白要努力-----关于static的用法以及this与super的 “相爱相杀”相关的知识,希望对你有一定的参考价值。

一、在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小白要努力-----关于static的用法以及this与super的 “相爱相杀”的主要内容,如果未能解决你的问题,请参考以下文章

小白每天要努力-----Java入门简记

关于 Java 中的 static 关键字

关于java中静态常量的用法?

Position属性四个值:staticfixedabsolute和relative的区别和用法(转自博友 Newbie_小白)

java中static 与private的用法

新手小白学JAVA static final 静态/构造/局部代码块之间的关系