一、static:静态的
成员变量包括:实例变量(无static修饰,属于对象,储存在堆中,有几个对象就有几份,通过对象点来访问)and 静态变量(有static修饰,属于类,存储在方法区中,只有一份,通过类名点来访问);
1. 静态变量
1.1 由static修饰
1.2 属于类,储存在方法区,只有一份
1.3 常常通过类名点进行访问
1.4 何时使用:所有对象所共享的数据(图片、音频、视频等)
2. 静态方法
2.1 由static修饰
2.2 属于类,储存在方法区,只有一份
2.3 常常通过类名点进行访问
2.4 静态方法中无隐式的this.传递,故静态方法无法直接访问实例变量
2.5 何时使用:方法的操纵与对象无关时(极少)
double b=Math.sqrt(25);//静态方法
//假设sqrt不是静态的
Math m1=new Math();
double d=m1.sqrt(25);//5
Math m2=new Math();
double d=m1.sqrt(25);//5
Math m3=new Math();
double d=m1.sqrt(25);//5
//无论m1、m2、m3、、、m100中哪一个对象,去sqrt(25),最终结果都是5,说明sqrt()的操纵与对象无关
** 3. 静态块**
3.1 由static修饰 { }——_(static{ }为静态块)
3.2 在类被加载期间,自动执行,因为类只被加载一次,故静态块只执行一次
3.3 何时使用:初始化/加载静态资源(图片、音频、视频等),
二、static final 常量:应用率高
- 必须声明时同时初始化
- 通过类名点进行访问,不能被改变
- 建议:常量名所有字母全都大写,多单词之间使用下划线_进行分隔
- 编译期在编译时会将常量直接替换为具体的值(效率高)
- 何时使用:数据永远不变、经常使用
package oop_day06;
//static final demo
public class StaticFinalDemo {
public static void main(String[] args) {
System.out.println(Doo.PI);//常量通过类名进行访问
//Doo.PI=3.1415926;//编译错误,常量不允许修改
System.out.println(Eoo.num);
//加载Eoo.class到方法区;静态变量num一并储存在方法区
//到方法区中获取num并输出
System.out.println(Eoo.COUNT);
//编译期在编译时会自动将常量替换为具体的值,效率高
//相当于System.out.print("5");
}
class Doo{
public static final double PI=3.14159;
//public static final int NUM;//编译错误,常量必须声明同时初始化
}
class Eoo{
public static int num=5;//静态变量
public static final int COUNT=5;//常量
}
}
三、抽象方法:
- 前加abstract修饰,
- 只有方法的定义,无具体实现其后**{方法体}**统统不用写
四、抽象类:
- 类前要加abstract修饰
- 包含抽象方法的类必须是抽象类
- 抽象类不能被实例化(不可以new对象,但类是个数据类型,只要是数据类型就可以声明引用或者声明数组)
- 抽象类是需要被继承的,派生类:
4.1 重写所有的抽象方法————变不完整为完整(当使用向上造型时,可以通过超类的引用点出来,但调用出的方法为重写的方法)
4.2 也声明抽象类————不常用 - 抽象类的意义
5.1 封装派生类所共有的属性和行为————代码复用
5.2 为所有派生类提供统一的类型————向上造型
5.3 可以包含抽象方法,其本身无意义,但可以为所有派生类提供统一的入口,派生类的具体实现不同,但入口一致
设计规则:
7. 将派生类所共有的属性和行为,抽到超类中————抽共性
8. 如果所有派生类的行为都一样,设计为普通方法;
如果所有派生类的行为都不一样,设计为抽象方法;
9.