下面就提出一些面向对象中用到的关键字
那我们为什么要加这个关键字呢,他有什么作用呢
当我们在设计类的时候 发现多个对象中有共享数据的时候 我们就可以把这个共享的数据 定义为静态的
name age虽然每个对象都有 但是值不一定一样,这个就和成员变量分开了,一个是特有数据,一个是公有
所以我们说成员变量创建在堆内存中,那么加了static关键字后,就等于说是静态的东西从堆中对象空间抽取出来了,放在了静态方法区
当前成员函数如果不访问任何成员变量的情况下 这个函数就可以定义为静态的
这也就是说,静态函数不能直接调用当前类中的成员变量 无法从上下文引用非静态
这就是为什么主函数是静态的了
因为主函数是程序的入口,优于其他运行,假设主函数是非静态的,那么必须先创建对象才能调用主函数,那么创建对象时的代码执行怎么开始呢?这就是原因
下面谈一下类都有哪些
实体类:
就是为了描述一个事物 Person Point
类中内容基本上都是成员函数/成员变量
也会而存在一个静态成员
工具类:
提供一些已经被实现好的功能 向外部供应
所以工具类中基本上全都是静态函数
类.Xxx 类.Xxx() Math Arrays
为啥工具类中都是静态?
1.共有的
2.长时间存在
3.加载一次 后期随便使用
如果工具类可以被创建对象 是不是就想用的时候去创建
效率较低,所以就提供一些已经实现好的功能。
主类:
主要用于运行/测试代码
这个类中会有主函数的存在
实体类是可以存在主函数的 但是不推荐
工具类一般不会存在主函数
这里为了避免出现后期的检查与修改和阅读,建议一个类一个java文件
1.javac 将Java源代码进行编译 生成字节码文件
2.java 将字节码文件加载进虚拟机中 开始运行程序
字节码具体被加载在方法区里面
方法区可以大致分为 非静态方法区/静态方法区
所有非静态的代码(二进制)内容加载进非静态去
所有静态的代码(二进制)内容加载进静态区
JVM接下来会根据参数(java 字节码文件名(类名)) 去静态区找主函数
将主函数代码加载进虚拟机栈 开始运行
3.后面的和之前一样
1.生命周期
成员变量随着对象的创建而创建 随着对象的消亡而消亡
静态变量随着类的加载而创建 随着程序结束而消失
2.调用方式
成员变量必须先创建对象 在通过对象去调用
静态变量可以被对象调用 也可以直接用类调用
3.存储位置
成员变量存在于堆内存中对象的所属空间里
静态变量存在于静态方法区中类的所属空间里
4.命名
成员变量-对象的特有属性
静态变量-对象的共有属性 类成员
代码块分为局部代码块,构造代码块,静态代码块
局部代码块:
存在于函数当中(包括函数) for(){...} if(){...}
构造代码块:
直接在类中出现的{...}
当对象创建一次 构造代码块执行一次
作用等同于构造函数
静态代码块:
直接在类中出现的static{...}
当类被加载的时候 仅且只执行一次
作用于 对类进行一些初始化操作 JDBC
这个模式很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一,独苗的意思,因为你的思维是独一份的,古代这种例子好比皇帝,我们认为皇帝就是个单例模式,每天参拜的皇帝是一样的。所以它是绝对的单例模式。
那么这种方法是具体怎样实现的呢
1.既然只能创建一个对象的话 就得不能让外界去创建对象
限制使用new不现实
只能从对象的创建流程中考虑 只要有一个步骤不行 对象就创建不出来
开辟空间分配地址 是由计算机底层决定 我们也控制不了
构造函数执行 只需要将构造函数私有化即可
2.既然外界不能创建对象 我们还得保证对象的创建
所以我们只能在类内部创建对象
Single s=new Single();
能否写成 成员变量的形式?
所以private static
3.内部创建出对象 还得向外界提供
因为private 外界不能直接访问 所以见解 向外界提供一个函数 外界通过调用函数获取对象