前言
写这个内容是因为我自己小看这个static和重写的学问了,在刚才笔试中出现了不少疑问选项,发现自己的知识盲区,所以在这里进行一个统一讲解。(内容可能有点杂)
static
static是静态的修饰符,可以修饰类,类的方法,类的属性。
static修饰类
static修饰类的话,只能够修饰内部类。
非static内部类众所周知,如果向在外部获取内部类的对象,必须通过外部类的一个方法间接获取,无法直接new出来。
static内部类的话,就可以直接new出来。但是针对于static内部类,直接new也分两种情况。
1.原生外部类(即包含static内部类的类),直接new 内部类()即可。
2.普通外部类(不包含),需要new y原生外部类.内部类()获取内部类对象。
public class Solution {
public void get() {
new Inner();
}
public static class Inner{ }
}
class hello {
public void get() {
new Solution.Inner();
}
}
static修饰方法
static修饰方法的话,方法内部只能使用类的static属性和方法内部定义的局部变量(即调用方法入栈,方法调用结束出栈)。
static修饰类属性
static修饰属性时,类的static方法和普通方法都能够使用。
众所周知被static修饰的属性时类所公有的,即一个类不管有多少个对象都只有这一个static属性。
注意:static属性不能够被类的对象直接使用,但是能够被类的对象通过调用方法间接使用。(但是static的方法却可以被类对象调用哦)
基本的样例就是下面
public class Solution {
public static int x = 0;
public void up() {
x++;
}
public static void main(String[] args) {
Solution solution1 = new Solution();
solution1.up();
Solution solution2 = new Solution();
solution2.up();
Solution solution3 = new Solution();
solution3.up();
System.out.println(Solution.x);
}
}
//输出结果为 = 3
继承重写问题
这也是个老生常谈的问题了,首先我先解释一下重写的概念和我的自己存在的误区(刚笔试中纠结的部分)。
在这里需要提一句一个重载的误区:返回值不同不叫重载。
重写是子类对父类的同名同参方法进行的,子类方法的修饰符级别一定要大于等于父类方法的优先级(不然就会报错)。
我个人在笔试中纠结的部分就是,如果子类方法修饰符级别小于父类方法,那一定不是重写父类方法,我这里认为是子类自己的方法,与父类无关。
这里就是我的错误,如果子类方法出现和父类同名同参,是一定要重写的,不能说什么的这是子类自己的方法,这是错误的思想。