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里面有什么作用:
- 首先是静态的,毋庸置疑
- 那么它可以修饰属性,方法,代码块,内部类。
- 当我们用static修饰属性的时候,那就把其称作为“静态变量”。
- 当我们创建了类的多个对象,那么每一个对象都应独立的拥有一套类中的非静态属性。当我们修改一个对象的非静态属性时,是不会导致其他对象中的此属性值发生改变。
- 那么我们如果把创建的这多个类的对象,让这些对象共享同一个静态变量。当我们再次通过某一个对象修改静态变量的时候,就会导致此变量的值发生改变。
- 我们的静态变量是随着类的加载而加载,我们使用类.静态变量的方式调用。
- 我们需要知道,在静态方法里,只能调用静态的方式或属性。但是在我们的非静态方法里,我们是既可以调用非静态的方法或属性,也可以调用静态的方法或者属性。
- 我们知道类是可以调用类变量的,我们的对象也可以调用类变量,当然对象也可以调用实例变量,但是我们的类是不能调用实例变量的。
- 那么我们的类是可以使用静态方法的,对象也可以使用静态方法,对象也是可以调用非静态方法的,但是类是无法调用非静态方法的。
- 需要注意,在静态方法里,是不能使用this关键字的,也不能使用super关键字。
上面十点,请务必掌握。
那么我们怎么判断一个属性是否声明为static?
属性是可以被多个对象所共享的,并且不会随着对象的不同而不同。
那么怎么判断一个方法是否为static的类型?
当我们操作静态属性的方法,基本上是要设置为static的。
在工具类中,习惯上为static,比如:Math,Arrays,Collections等等。
二、super和this的相爱相杀
super 和 this 的注意点:
- super如果调用父类的构造方法,必须在构造方法的第一个。
- super 必须只能出现在子类的方法或者构造方法中。
- super和this不能同时调用构造方法。
- 两者代表的对象不同,this指本身调用者的这个对象。而super代表父类对象的应用。
- this 在没有继承的条件下,也是可以使用的。而super只能在继承条件下才能使用。
- 在构造方法里,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的区别,文中笔者推荐的两篇大佬文章请一定阅读,写的很详细。文中若有错误,请在评论区留言,感谢你的支持。
念念不忘,必有回响。
上一篇: Handler发送消息小结
下一篇: 后端与前端input date的相爱相杀