1 static
1.1 概念
是java中的一个关键字
用于修饰成员(成员变量和成员方法)
1.2 特点
1.static可以修饰成员变量和方法
2.被static修饰的资源称为静态资源
3.静态资源随着类的加载而加载,最先加载,优先于对象进行加载
4.静态资源可以通过类名直接调用,也被称作类资源
5.静态被全局所有对象共享,值只有一份
6.静态资源只能调用静态资源
7.静态区域内不允许使用this与super关键字
说明:
静态方的调用:
如果是自定义类那么在main方法里面可以使用 类名.静态方法名
调用
如果是在public修饰的公共类,在main方法里面可以直接使用 静态方法名()
调用
1.3 练习:static入门案例
创建包: cn.tedu.oop
创建类: TestStatic1.java
package cn.tedu.oop;
/*本类用作静态static的入门案例*/
/*0.被static修饰的资源统称为静态资源
* 静态资源是随着类加载而加载到内存中的,比对象优先进入内存
* 所以静态资源可以不通过对象,直接通过类名调用*/
public class TestStatic1 {
public static void main(String[] args) {
//5.通过类名直接调用静态资源
Fruit.clean();//我们可以通过类名直接调用静态方法,这个IDEA会提示
System.out.println(Fruit.kind);//我们可以通过类名直接调用静态属性,这个IDEA会提示
//4.创建水果类的对象
Fruit f1 = new Fruit();
Fruit f2 = new Fruit();
f1.grow();
f1.clean();//没有提示,需要自己写
System.out.println(f1.weight);
System.out.println(f1.kind);//没有提示,需要自己写
//6.修改普通变量的值
f1.weight = 6.6;
System.out.println(f1.weight);//6.6
System.out.println(f2.weight);//0.0
/*3.静态资源在内存中只有一份,而且会被全局所有对象共享
* 所以:不管我们使用哪种方式修改了静态变量的值,使用任何方式来查看
* 都是静态变量那个刚刚修改了的值*/
//7.修改静态变量的值
Fruit.kind = "苹果";
System.out.println(Fruit.kind);
System.out.println(f1.kind);
System.out.println(f2.kind);
f1.kind = "猕猴桃";
System.out.println(Fruit.kind);
System.out.println(f1.kind);
System.out.println(f2.kind);
f2.kind = "香蕉";
System.out.println(Fruit.kind);
System.out.println(f1.kind);
System.out.println(f2.kind);
}
}
//1.创建水果类
class Fruit{
//2.定义属性
/*1.可以用static修饰成员变量吗?--可以*/
static String kind;//品种
double weight;//重量
//3.定义方法
/*2.可以用static修饰方法吗?--可以*/
public static void clean(){
System.out.println("洗水果呀洗水果~");
}
public void grow(){
System.out.println("这个果子长的一看就很好吃~");
}
}
1.4 练习:static静态调用关系
创建包: cn.tedu.oopstatic
创建类: TestStatic2.java
package cn.tedu.oopstatic;
/*本类用于测试静态的调用关系*/
/*总结:
* 1.普通资源既可以调用普通资源,也可以调用静态资源
* 2.静态资源只能调用静态资源*/
public class TestStatic2 {
}
//1.创建老师类
class Teacher{
//2.定义普通属性与方法
String name;
public void teach(){
System.out.println("正在授课中...");
/*1.普通资源能否调用静态资源?--可以!!!*/
System.out.println(age);
ready();
}
//3.定义静态属性与方法
static int age;
public static void ready(){
System.out.println("正在备课中...");
/*2.静态资源能否调用普通资源?--不可以!*/
//System.out.println(name);
//teach();
}
public static void eat(){
System.out.println("正在吃饭中...");
/*3.静态资源能否调用静态资源?--可以!*/
System.out.println(age);
ready();
}
}
2 静态代码块、构造代码块、局部代码块
2.1 静态代码块格式
静态资源随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
特点: 被static修饰,位置在类里方法外
2.2 三种代码块的比较
静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
局部代码块:方法里的代码块,限制局部变量的范围
2.3 练习:几种代码块的关系
创建包: cn.tedu. block
创建类: TestBlock.java
package cn.tedu.oopstatic;
/*本类用于学习静态代码块*/
/*执行顺序:
* 静态代码块->构造代码块->构造方法【对象创建成功】->局部代码块*/
public class TestStaticBlock {
public static void main(String[] args) {
//6.创建对象进行测试
Person p = new Person();
Person p2 = new Person();
//7.触发局部代码块
p.play();
}
}
//1.创建Person类
class Person{
//8.创建静态代码块
/*位置:类里方法外
* 执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载
* 并且静态资源只会加载一次
* 作用:用于加载那些需要第一时间就加载,并且只加载一次的资源*/
static{
System.out.println("我是静态代码块");
}
//2.创建构造代码块
/*位置:类里方法外
执行时机:每次创建对象时被触发,并且优先于构造方法执行
作用:用于提取所有构造方法的共性功能*/
{
System.out.println("我是构造代码块");
}
//5.创建构造方法
public Person(){
System.out.println("我是无参构造");
}
//3.创建普通方法
public void play(){
System.out.println("我是一个普通方法");
//4.创建局部代码块
/*位置:方法里
* 执行时机:执行本局部代码块所在的方法时才会执行
* 作用:用于限制变量的作用范围*/
{
System.out.println("我是一个局部代码块~");
}
}
}
结论:执行顺序:静态代码块 --> 构造代码块 --> 构造方法 --> 局部代码块
3 final
3.1 概念
是java提供的一个关键字
final是最终的意思
final可以修饰类,方法,字段(属性)
初衷:java出现继承后,子类可以更改父类的功能,当父类功能不许子类改变时,可以利用final关键字修饰父类。
3.2 特点
被final修饰的类,不能被继承
被final修饰的方法,不能被重写
被final修饰的字段是个常量,值不能被修改
常量的定义形式:final 数据类型 常量名 = 值
3.3 练习:final入门案例
创建包: cn.tedu.oop
创建类: TestFinal.java
package cn.tedu.oop;
/*本类用于测试final关键字*/
public class TestFinal {
}
//1.定义父类
/*1.final可以用来修饰类,被final修饰的类是最终类,不可以被继承
* 可以把被final修饰的类看成树结构中的叶子节点*/
//3.测试类被final修饰
//final class Father2{
class Father2{
//4.定义父类的普通方法
/*2.final可以用来修饰方法,被final修饰的方法是这个方法的最终实现,不可以被重写*/
//6.测试方法被final修饰
//public final void work(){
public void work(){
System.out.println("在工厂里上班~");
}
}
//2.定义子类
class Son2 extends Father2{
final int C = 66;
//5.重写父类的方法
@Override//这个注解用来标记这是一个重写的方法
public void work(){
/*3.被final修饰的是常量,常量的值不可以被修改
* 注意:不管是成员位置还是局部位置,常量定义的时候必须赋值
* 注意:常量的名称必须是全大写,单词与单词之间使用_分割*/
final int B = 100;
//B = 200;//报错:常量的值不可以被修改
System.out.println("在互联网大厂上班~");
System.out.println(Integer.MAX_VALUE);
}
}