1 static
1.1 概念
是java中的一个关键字
用于修饰成员(成员变量和成员方法)
1.2 特点
- 可以修饰成员变量与成员方法
- 随着类的加载而加载,优先于对象加载
- 只加载一次,就会一直存在,不再开辟新空间, 直到类消失才一起消失
- 静态资源也叫做类资源,全局唯一,被全局所有对象共享
- 可以直接被类名调用
- 静态只能调用静态,非静态可以随意调用
- static不能和this或者super共用,因为有static时可能还没有对象
1.3 练习:static入门案例
创建包: cn.tedu.oopstatic
创建类: TestStatic1.java
package cn.tedu.oopstatic;
/**本类用于测试静态的入门案例*/
public class Test_Static1 {
//4.创建程序的入口函数main()
public static void main(String[] args) {
/**3.静态资源可以通过类名直接调用*/
/**4.静态资源是优先于对象进行加载的,随着类的加载而加载
* 比对象先加载进入内存,没对象时也可以被类名直接调用
* */
//9.通过类名直接调用静态资源进行测试
System.out.println(Student.name);
Student.study();
//5.创建Student类对象进行测试
Student s = new Student();
//6.更改并查看name属性的值
s.name = "黄桃罐头";
System.out.println(s.name);
//7.调用学生类的方法
s.study();
s.speak();
//8.创建多个对象进行测试
Student s2 = new Student();
/**5.静态全局共享*/
System.out.println(s2.name);
System.out.println(Student.name);
}
}
//1.创建学生类
class Student{
/**1.可以通过static关键字将普通资源修饰成静态资源*/
/**2.static可以用来修饰成员变量和方法,一般写在权限修饰符之后*/
//2.定义属性--成员变量--无需手动初始化
int sno;
static String name;
//3.定义方法--修饰符 返回值类型 方法名(参数列表){方法体}
public static void study() {
System.out.println("别闹~学JAVA呢~");
}
public void speak() {
System.out.println("大声说出来~");
}
}
1.4 练习:static静态调用关系
创建包: cn.tedu.oopstatic
创建类: TestStatic2.java
package cn.tedu.oopstatic;
/**本类用于测试静态的调用关系*/
//总结:
//1.静态资源只能调用静态资源
//2.非静态资源既可以调用静态资源,也可以调用非静态资源
public class Test_Static2 {
}
//1.创建Teacher类
class Teacher{
//2.定义普通资源
//2.1定义普通属性
String name;
//2.2定义普通方法
public void teach() {
/**1.普通资源能否调用静态资源?--可以!!!*/
System.out.println(age);//普通资源可以调用静态属性
sleep();//普通资源可以调用静态方法
System.out.println("正在教学ing...");
}
/**Ctrl+O 查看类结构信息*/
//3.定义静态资源
//3.1定义静态属性
static int age;
//3.2定义静态方法
public static void eat() {
System.out.println("扶朕起来,还能干饭~~~");
}
public static void sleep() {
/**2.静态资源能否调用普通资源--不可以!!!*/
// System.out.println(name);
// teach();
/**3.静态资源能否调用静态资源?--可以!!!*/
System.out.println(age);//静态资源可以调用静态属性
eat();//静态资源可以调用静态方法
System.out.println("再累也要好好休息哦~~~");
}
}
2 静态代码块、构造代码块、局部代码块
2.1 静态代码块格式
静态资源随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
特点: 被static修饰,位置在类里方法外
2.2 三种代码块的比较
- 静态代码块:在类加载时就加载,并且只被加载一次,一般用于项目的初始化
- 构造代码块:在创建对象时会自动调用,每次创建对象都会被调用,提取构造共性
- 局部代码块:方法里的代码块,限制局部变量的范围
2.3 练习:几种代码块的关系
创建包: cn.tedu. block
创建类: TestBlock.java
//代码块
// 1.静态代码块
// 位置:类里方法外,格式:static{ }
// 执行时机:随着类的加载而加载,优先与对象加载,并且只加载一次
// 作用:用于加载一些需要第一时间就加载并且只加载一次的资源
// 2.构造代码块
// 位置:类里方法外,格式:{ }
// 执行时机:创建对象时触发,优先于构造方法执行
// 作用:用于提取所有构造方法的共性功能
// 3.局部代码块
// 位置:方法里,格式:{ }
// 执行时机:调用当前所处方法时才触发
// 作用:用来控制变量的作用范围,变量的作用范围越小越好
// 4.执行顺序:
// 静态代码块->构造代码块->构造方法【创建好对象】->调用局部代码块所处的普通方法
// 5.为什么是这样的顺序呢?
// 静态代码块它也是静态资源,静态资源随着类的加载而加载,优先于对象的创建
// 静态资源只加载一次,并且一直存在,直到类消失,它才会消失
package cn.tedu.block;
/*本类用于测试代码块之间的关系*/
public class TestBlock {
public static void main(String[] args) {
//7.创建对象进行测试
/*1.在创建对象之前,会先自动执行静态代码块,而且此静态代码块只执行一次*/
/*2.每一次创建对象时,都会调用构造代码块与构造方法,构造代码块先执行*/
Person p = new Person();
Person p2 = new Person();//再次创建对象,静态代码块也不会执行了,只执行一次
/*3.当对象调用方法时,如果方法里有局部代码块,局部代码块才会被触发*/
p.sleep();
}
}
//1.抽象封装形成一个Person类
class Person{
//2.创建静态代码块
/*静态代码块:
位置:类里方法外
触发时机:静态代码块也是静态资源,随着类的加载而加载,优先于对象加载,并且只加载一次
作用:用于加载一些需要第一时间就加载,并且只加载一次的资源
* */
static{
System.out.println("我是静态代码块~");
}
//3.创建构造代码块
/*构造代码块:
位置:类里方法外
触发时机:创建对象时触发,而且要优先于构造方法执行
作用:用于提取所有构造方法的共性功能
* */
{
System.out.println("我是构造代码块~");
}
//4.创建构造方法
/*构造方法是与类同名且没有返回值类型的方法,用于创建对象,在创建对象时触发*/
public Person(){
System.out.println("我是构造方法~");
}
//5.创建普通方法
public void sleep(){
System.out.println("我是普通方法~快醒醒,起来嗨~");
//6.创建局部代码块
/*局部代码块
位置:方法里
执行时机:调用本方法时触发
作用:用来控制变量的作用范围,变量的作用范围越小越好
* */
{
System.out.println("我是局部代码块~");
}
}
}
结论:执行顺序:静态代码块 --> 构造代码块 --> 构造方法 --> 局部代码块
3 final
3.1 概念
- 是java提供的一个关键字
- final是最终的意思
- final可以修饰类,方法,成员变量
初衷:java出现继承后,子类可以更改父类的功能,当父类功能不许子类改变时,可以利用final关键字修饰父类。
3.2 特点
- 被final修饰的类,不能被继承
- 被final修饰的方法,不能被重写
- 被final修饰的变量是个常量,值不能被改变
- 常量的定义形式:final 数据类型 常量名 = 值
3.3 练习:final入门案例
创建包: cn.tedu.oopfinal
创建类: TestFinal.java
package cn.tedu.oopfinal;
/*本类用作final的入门案例*/
public class TestFinal {
public static void main(String[] args) {
//6.创建子类对象进行测试
Son s = new Son();
s.work();
//s.workOld();
//s.name = "干饭人";
System.out.println(s.name);
}
}
//1.创建父类
/*1.final表示最终,可以用来修饰类
* 但是被final修饰的类无法被继承
* 也就是没有子类,它自己就是最终类
* */
//7.1使用final修饰类
//final class Father{//报错:Son类不能继承被final修饰的Father类
class Father{
//3.创建成员变量
/*3.final可以用来修饰成员变量,被final修饰的变量值不可以被修改--常量*/
/*注意:常量在定义的时候就需要赋值,否则报错*/
final String name = "打工人";
//4.创建普通方法
//7.2 使用final修饰方法
//final public void work(){//报错:子类不可以重写父类中被final修饰的方法
/*2.final可以用来修饰方法,被final修饰的方法是方法的最终实现,不能被重写*/
public void work(){
System.out.println("Father...打工人,打工魂");
}
}
//2.创建子类,并与父类建立继承关系
class Son extends Father{
//5.创建子类重写父类的work方法
// public void workOld(){
// super.work();
// }
public void work(){
System.out.println("Son...现在的打工人要用计算机打工~");
}
}