static(静态)
静态的特点
1.static可以修饰变量和方法;
2.被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享;
3.在类被加载的时候,就会去加载被static修饰的部分;
4.被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。
应用示例
定义类:属性 行为
所有的student类所有的对象共享teacherName
直接调用
static是一个java的修饰符
静态变量
被static修饰的成员变量,叫做静态变量
特点:被该类所有的对象共享
调用方式:
1.类名调用(推荐)
2.对象名调用
静态变量是随着类加载而加载的,优于对象出现
方法执行完毕 出栈
通过对象s2调用方法show
去堆内存里的静态区找
静态区的变量是各个对象共享的,谁要 用谁去拿
静态区的变量在内存里只有一份
静态对象属于类
简单来说,静态对象就是在程序运行期间一直存在的一个对象,它不会随着函数或方法的调用而创建或销毁,而是随着程序的启动而创建,随着程序的结束而销毁。静态对象通常被用于保存全局状态或者提供共享的资源,可以通过类名直接访问,而无需创建类的实例。例如,在Java中,我们可以定义一个静态变量表示某个类的实例个数,每次创建该类的实例时,静态变量的值就会递增,因为静态变量属于类,而非对象。
类:类是一种抽象的概念,它定义了对象的属性和行为。类可以看作是对象的模板或蓝图,描述了对象应该具有的特征和行为。
对象:对象是类的一个实例,它是类的具体化。当我们根据类创建一个具体的实例时,这个实例就是一个对象,拥有了类所定义的属性和行为。
因此,其他对象不是类,而是基于类创建的实例。类是用来定义对象的模板,而对象是根据模板创建出来的具体实体。在面向对象编程中,我们通过定义类来描述对象的特征和行为,并通过创建对象来使用这些特征和行为。
在Java等静态类型语言中,类的加载通常发生在程序运行之初,但在动态语言或一些特殊场景下,类的加载可能会更加灵活和动态。
总的来说,类的加载是在程序运行期间动态发生的,根据程序运行时的需要来进行。
静态方法
被static修饰的成员方法,叫做静态方法
成员方法 getter setter
多用在测试类和工具类中
javaBean类:
用来描述一类事物的类
例 Student Dog Cat
测试类:
用来检测其他类是否正确
带有main方法 是程序的主入口
工具类:
帮我们做一些事情,但不描述任何事情(例如数组求和)
1.类名见名知意
2.私有化构造方法
3.方法定义为静态
javabean类中很少用
静态方法很少用
1.类名调用(推荐)
2.对象名调用
工具类
遍历数组
求总分和平均数
测试类
创建工具类 求集合中的学生年龄的最大值
首先定义javabean类 存储学生对象 放入属性
再用工具类进行定义方法
最后在测试类中调用工具类中的方法
注意事项
1.静态方法只能访问静态变量和静态方法
2.非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和成员方法
3.静态方法中没有this关键字
静态方法的调用方式是通过类名直接调用,不需要先创建类的实例。这也说明了为什么静态方法中没有this关键字,因为在没有实例的情况下,不存在当前对象实例的引用。
this表示当时方法调用者的地址值
this由虚拟机赋值
谁调用当前方法,this就 地址值
内存图
this在形参的最前面 是隐含的
非静态和对象相关,必须要有this;
成员变量 成员方法
静态的是共享的,和每一个对象无关,所以无this
静态 随着类加载而加载
非静态 跟对象有关
重新认识main方法
public class Helloworld{ public static void main(String[] args){ System.out.println("HelloWorld"); } }
public:权限修饰符 被虚拟机调用 访问权限足够大
static:被虚拟机调用 不用创建对象,直接类名访问
因为main方法是静态的,所有测试类的其他方法也需要是静态的
void:被虚拟机调用,不需要给虚拟机返回值
main:虚拟机只能识别main
String[] args:以前是接收数据,现在没用
包
什么是包
包是文件夹,用来管理不同功能的java类,方便后期代码维护 分门归类
包名规则:
公司域名反写+包的作用,需要全部英文小写,见名知意
packet com.ithema.domain
使用同一个包中的类时,不需要导包
使用导包在什么时候
1.使用java.lang包中的类时,不需要导包
2.其他情况都需要导包
3.如果同时使用两个包中的同名类,需要用全类名
4.使用其他其他包里面的类时要用全类名
final关键字
表示 最终的 不可被改变
一个 修饰符
应用于 方法:表明该方法时最终方法,不能被重写
应用于 类 :表明该类是最终类,不能被继承
应用于 变量:叫做常量,只能被赋值一次
写在类中防止值改变
例:
math类中的成员变量PI(π)
public static final double PI=3.1415926 5358979 323846
常量
在实际开发中,常量一般为系统的配置信息,方便维护,提高可读性
和final关键字一起用
命名规范
单个单词:全部大写
多个单词:全部大写 单词之间用下划线隔开
细节(重点)
final修饰的变量是基本类型,那么变量存储的数据值不能发生改变
final修饰的变量是引用数据类型,那么变量存储的地址值不能发生改变,对象内部的可以该改变
实例操作
权限修饰符
控制一个成员能被访问的范围
可以修饰成员变量,方法,构造方法,内部类
private 只能自己用
默认(空着不写) 只能在本包中
protectes 受保护的 其他包里的子类也能用
public 都能用
实际开发中一般只用private 和 public
原则
成员变量私有
方法公开
如果方法是抽取其他方法中共性代码,要私有
代码块
局部代码块
写在方法里面的单独代码
回收内存 不浪费空间
不过现在硬件水平提高了,内存空间很大 实际开发中已经不再使用这种方式写代码
public class Dduo{ public static void main(String[] args){ { int a=10; } System.out.printf(a); } }//输出结果为0
构造代码块
写在成员位置的代码块,可以优先于成员方法执行
成员方法中共性的可以抽出来放在方法前写入构造代码块
private String name; private int age; { System.out,println("开始创建对象喽") } public Student(){ }
只要创建对象 就会先执行构造代码块(必定执行) 再执行构造方法
不过现在也不用了,因为不灵活
静态代码块
static{}
需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次 第一次
在类加载的时候,随着类的加载使用
初始化数据 提高代码效率