static笔记
1. static概括
当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余,我们可以通过static关键字来实现。static它是静态修饰符,一般用来修饰类中的成员
被静态修饰的数据,不再属于对象的特有内容,而是对象的共享内容
2. static特点
1. 被static修饰的成员变量属于类,不属于这个类的某个对象。
也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量
2.被static修饰的成员可以并且建议通过类名直接访问
class Demo {
//静态成员变量
public static int num = 100;
//静态方法
public static void method(){
System.out.println("静态方法");
}
}
class Test {
public static void main(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
3. static注意事项
1. 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区
原因:this表示本类的对象引用,静态优先于对象,没有对象this什么?super也是同理(表示父类的对象)
简单来说,把 静态比喻为前人或先人,非静态比喻为后人,后人可以使用前人留下来的技术,但前人并不知道后人会有什么技术,关键点就在于生命周期的不同。
2. static 修饰到底什么时候使用?该应用与什么场景?
static可以修饰成员变量和成员方法
-
成员变量加static:根据具体事物,具体分析问题
例如在定义事物的时候,多个事物之间是否有共性的数据,如果有请你将共性的数据定义为静态的成员变量。
-
成员方法加static:跟着变量走
如果方法,没有调用过非静态成员,就应该将方法定义为静态。
3. 定义静态常量
定义格式(变量名要全大写):
public static final 数据类型 变量名 = 值;
例如:
public static final String CNBLOGS_NAME = "薄荷叶cc";
4. static面试题
面试题一
问:static 关键字是什么意思?Java 中是否可以覆盖(override) 一个 private 或者是 static 的方法?
答案:
static关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。简单来说就是:方便在没有创建对象的情况下来进行调用其方法或变量。
Java 中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。
解析:
答案就是概括一下static和static的生命周期
面试题二
这个static面试题是我从CSDN上面找的,觉得挺有参考价值——原链接
问:以下代码输出的结果为?
public class Test {
Person person = new Person("Test");
static{
System.out.println("test static");
}
public Test() {
System.out.println("test constructor");
}
public static void main(String[] args) {
new MyClass();
}
}
class Person{
static{
System.out.println("person static");
}
public Person(String str) {
System.out.println("person "+str);
}
}
class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
}
答案:
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor
解释:
首先加载Test类,因此会执行Test类中的static块。(test static)
接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。
在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类(若没有加载,要先加载完父类),那么就会执行MyClass类的中的static块。(myclass static)
在加载完之后,就通过构造器来生成对象。
而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person()
而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块(person static),接着执行父类的构造器。
完成了父类的初始化(person Test+test constructor),然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person()
最后执行MyClass的构造器。(person MyClass+myclass constructor)
5. 心得体会
这个本人的第一篇博客,写博客的主要目的是为了分享和记录自己学习的成果,为了写这一篇博客,我第一次了解到markdown,为了使用markdown,下载了Typora,还特意去简书上弄了一个自己的图床,在笔记已经写好的情况下花了一晚上时间,整个学习过程让我受益良多。
该篇用于记录和分享我总结的笔记,若有不正之处,希望谅解并欢迎批评指正。