一个初学者的笔记
-
1.类变量也叫静态变量,也就是在变量前加了static 的变量;
-
2.实例变量也叫成员变量,即没加static 的变量;
-
3.类变量和实例变量的区别在于: 类变量是所有对象共有,其中一个对象将它值改变, 其他对象得到的就是改变后的结果;
-
而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
直接上代码 注释写的挺详细 哈哈哈
第一个例子
public class Demo1 {
// 定义一个类变量/静态变量
static int x;
// 定义一个成员变量/实例变量/非静态变量
int y = 100;// 并赋予初值
// 静态代码块
static {
// 查看一下x的值
System.out.println("x-->" + x);
// y这里报错因为静态方法只能识别静态变量
// System.out.println("y-->"+y);
// 调用静态方法
f1();
f2();
// f3()不是静态方法 则无法调用
}
// 定义静态方法
public static void f1() {
System.out.println("---静态方法f1()--");
}
public static void f2() {
System.out.println("---静态方法f2()---");
}
// 实例方法/非静态方法/成员方法
public void f3() {
System.out.println("---成员方法f3() ---");
}
// 用static修饰的方法只能调用外部用static修饰的属性和方法
public static void f4() {
System.out.println("x--->" + x);
// System.out.println("y--->"+y);
f1();
f2();
// f3();
}
// 而实例方法/成员方法,可以调用所有的属性和方法除去main方法
public void f5() {
System.out.println("--这里是f5()成员方法--");
System.out.println("--可以调用所有的属性和方法除去main方法---");
System.out.println("x--->" + x);
System.out.println("y--->" + y);
f1();
f2();
f3();
}
public static void main(String[] args) {
//通过类名调用静态变量
//main也是静态方法所以类初始化时所以静态方法都会执行一遍
System.out.println(Demo1.x);
System.out.println("通过类名调用静态方法---");
Demo1.f1();
Demo1.f2();
System.out.println("通过创建对象调用静态方法---");
Demo1 demo1 = new Demo1();
//可以调用但会有警告
demo1.f1();
//调用成员方法 没有问题
demo1.f5();
}
}
运行结果如下
x-->0
---静态方法f1()--
---静态方法f2()---
0
通过类名调用静态方法---
---静态方法f1()--
---静态方法f2()---
通过创建对象调用静态方法---
---静态方法f1()--
--这里是f5()成员方法--
--可以调用所有的属性和方法除去main方法---
x--->0
y--->100
---静态方法f1()--
---静态方法f2()---
---成员方法f3() ---
上述结果可以看出
类初始化时先走静态变量,静态方法,然后呢再执行成员变量成员方法
但静态变量及其方法有加载类的时候初始化一次 也就是执行一次,第一次的结果就是下一次的初始值
成员方法可以调用静态方法也可以调用静态变量
下面我们看
第二个例子
public class Demo2 {
// 实例变量,成员变量,非静态变量
int x = 10;
// 类变量,静态变量
static int y = 10;
// 无参构造方法
public Demo2() {
x++;
y = 100;
}
public static void main(String[] args) {
// 创建对象
Demo2 demo2 = new Demo2();
// 打印成员变量
System.out.println("成员变量x -->" + demo2.x);
// 打印静态变量
System.out.println("静态变量y -->" + demo2.y);
System.out.println("=======================");
// 第二次创建一个对象
//对象初始化时就不走static int y = 10;了 只走一次
Demo2 demo3 = new Demo2();
System.out.println("成员变量x -->" + demo3.x);
System.out.println("静态变量y -->" + demo3.y);
System.out.println("类名调用静态变量");
System.out.println("------共享数据----------");
Demo2.y++;
System.out.println("demo2静态变量y -->" + demo2.y);
System.out.println("demo3静态变量y -->" + demo3.y);
System.out.println("---------------------------");
Demo2 demo4 = new Demo2();
System.out.println(demo4.y);//100
System.out.println(demo3.y);//100
System.out.println(Demo2.y);//100
}
}
运行结果如下
成员变量x -->11
静态变量y -->100
=======================
成员变量x -->11
静态变量y -->100
类名调用静态变量
------共享数据----------
demo2静态变量y -->101
demo3静态变量y -->101
---------------------------
100
100
100
可见
静态变量被所有的对象所共享,其中有一个变量将它的值改变,其他对象得到的就是改变后的结果,它只有在类加载时被初始化