目录
static关键字
成员变量+static=静态变量 主要是解决成员变量重复的问题
class Chinese{
static int momo;
static boolean kaka;
String name;
String age;
static String country="China";
//无法从静态上下文中引用非静态
public void show(){
String name="旺财";
System.out.println(name+age+country);
}
public static void haha(){
System.out.println("哈哈");
}
public static void main(String[] args){
}
每个对象中都有“name 、age、country”,但是每个对象中的“country”都是一样的,所以现在这样写有点浪费空间,所以当我们在设计类的时候,发现多个对象中有共享数据的时候,我们就可以把这个共享的数据定义为静态的。这时将“country”单独拿出来,原先三个对象就不用再定义“country”,如果每个对象想调用“country”时,去相应的位置寻找即可。
静态的东西从堆中对象的空间里抽取出来,放到---------静态方法区
举个例子:如果你要喝水,选择水杯或水壶------特有 饮水机-------共有
上述可以知道:共有的数据存在于一个特定的空间------>静态方法区
你去学校上课,学校的饮水机在;你下课回家,学校的饮水机还在。说明一个问题----->共有的数据存活的周期比对象长
成员函数+static=静态函数
先想一个问题:静态函数意味着就是对象的共有行为吗?不是的
class StaticDemo{
public static void main(String[] args){
Chinese c1=new Chinese();
Chinese c2=new Chinese();
Chinese c3=new Chinese();
//通过 对象.变量
//1.先去堆内存中对象的所属空间里找
System.out.println(c1.name); //成员变量
//2.再去静态方法区中该对象所属类的空间里找
System.out.println(c1.country); //静态变量
//通过 对象.函数
//1.先去非静态方法区中该对象所属类的空间里找
c1.show();
//2.再去静态方法区中该对象所属类的空间里找
c1.haha();
System.out.println(Chinese.country);
Chinese.haha();
//Chinese.show();
System.out.println(Chinese.momo);
System.out.println(Chinese.kaka);
}
}
class Chinese{
static int momo;
static boolean kaka;
String name;
String age;
static String country="China";
//无法从静态上下文中引用非静态 public static void show()
public void show(){
String name="旺财";
/*
成员函数内部在调用变量时的顺序:
1.先找局部变量
2.去堆中对象空间中找
3.去静态区该对象所属类的空间里找
我要喝水 水从哪里来
1.如果你的嘴里已经有水 直接喝
2.如果你的嘴里没水 杯子里有水 拿杯子喝
3.如果你的嘴里没水 杯子没水 去饮水机
(先不考虑继承的情况下)
*/
System.out.println(name+age+country);
}
public static void haha(){
System.out.println("哈哈");
}
public static void main(String[] args){
}
}
静态是优先于对象存在的,静态也称之为是类的成员,我们可以直接通过类去调用 类.静态成员
为什么主函数是静态的?主函数是程序的入口,优于其它运行
假设主函数是非静态的,那么必须先创建对象,才能调用主函数。
类的分类
- 实体类:
- 就是为了描述一个事物 Person Point
- 类中内容基本上都是成员函数/成员变量
- 也会而存在一个静态成员
2. 工具类:
- 提供一些已经被实现好的功能 向外部供应
- 所以工具类中基本上全都是静态函数
- 类.Xxx 类.Xxx() Math Arrays
- 为啥工具类中都是静态?
1.共有的
2.长时间存在
3.加载一次 后期随便使用
说一个道理:当我们钉一个钉子的时候,找榔头,是造一个榔头,还是用已存在的榔头?如果工具类可以被创建对象,是不是就想用的时候去创建---------效率较低
3.主类/测试类
- 主要用于运行/测试代码
- 这个类中会有主函数的存在
- 实体类是可以存在主函数的,但是不推荐
- 工具类一般不会存在主函数
建议:一个类一个.java文件
对象的内存图解
1.javac 将Java源代码进行编译 生成字节码文件
2.java 将字节码文件加载进虚拟机中 开始运行程序
字节码具体被加载在方法区里面
方法区可以大致分为 非静态方法区/静态方法区
所有非静态的代码(二进制)内容加载进非静态去
所有静态的代码(二进制)内容加载进静态区
JVM接下来会根据参数(java 字节码文件名(类名)) 去静态区找主函数
将主函数代码加载进虚拟机栈,开始运行3.后面的和之前一样