Java基础之三个修饰符
三个关键字 抽象的(abstract) 静态(static) 最终的(final)
一、抽象
1.1 什么是抽象
似是而非的,像却又不是;具备某种对象的特征,但不完整。
二、 抽象的(abstract)
2.2 不该被创建的对象
程序是用来模拟现实世界、解决现实问题的;
现实世界中存在的都是“动物”具体的子类对象,并不存在“动物”对象,所以,Animal不应该被独立创建成对象。
如何限制这种对象的创建?
三、抽象类、抽象方法
3.1 抽象类
应用:abstract修饰类,此类不能new对象。
被abstract修饰的类,称为抽象类。
抽象类意为不够完整的类、不够具体的类,
抽象类对象无法独立存在,即不能new对象。
3.2 抽象类的作用
作用:
可被子类继承,提供共性属性和方法。
可声明为引用,更自然的使用多态。
经验:
抽象父类,可作为子类的组成部分。
依附于子类对象存在。
由父类共性 子类独有组成完整的子类对象。
3.3 不该被实现的方法
需求:
Dog中的eat()应输出“狗在狗粮”。
Cat中的eat()应输出“猫在猫粮”。
3.4 抽象方法
public class Test {public static void main(String[] args) {//Animal animal=new Animal();Animal dog=new Dog();Animal cat=new Cat();dog.eat();cat.eat();}}//动物类(父类)abstract class Animal {String breed;//品种int age;//年龄String sex;//性别//吃(抽象方法)public abstract void eat();//睡public void sleep() {System.out.println("睡觉觉...");}}//狗类(子类)继承父类class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗吃狗粮");}}//猫类(子类)继承父类class Cat extends Animal{@Overridepublic void eat() {System.out.println("猫吃猫粮");}}
四、静态的(static)
4.3 什么是静态
概念:
静态(static)可以修饰属性和方法。
称为静态属性(类属性)、静态方法(类方法)。
静态成员是全类所有对象共享的成员。
在全类中只有一份,不因创建多个对象而产生多份。
不必创建对象,可直接通过类名访问。
4.4 课堂案例
练习:统计一个类的对象被创建过多少次?
//创建一个学生类public class Student { static int count; public Student() { //count用于统计被创建的次数 count ; }public static void main(String[] args) {//创建对象Student a= new Student();new Student();new Student();new Student();new Student();new Student();new Student();new Student();System.out.println(a.count);}
五、静态方法、类加载
5.1 静态方法
5.2 静态的特点
静态方法允许直接访问静态成员。
静态方法不能直接访问非静态成员。
静态方法中不允许使用this或是super关键字。
静态方法可以继承,不能重写、没有多态。
5.3 动态代码块
示例:
public class xxx {public static void main(String[] args) {new test();}}class test {int b = 200;{System.out.println(b);System.out.println("这是动态代码块");}}
5.4 类加载
JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件。
将.class文件中对类的描述信息加载到内存中,进行保存。
如:包名、类名、父类、属性、方法、构造方法…
加载时机:
创建对象。
创建子类对象。
访问静态属性。
调用静态方法。
主动加载:Class.forName(“全限定名”);
5.4 静态代码块
示例:
public class xxx {public static void main(String[] args) {new test();}}class test {static int a = 100;int b = 200;{System.out.println(b);System.out.println("这是动态代码块");}static {//静态代码块System.out.println(a);System.out.println("静态代码块");}public test() {System.out.println("这是构造方法");}}
运行结果:
观察输出顺序
六、最终的(final)
6.1 什么是最终
概念:最后的,不可更改的。
final可修饰的内容:
类(最终类)
方法(最终方法)
变量(最终变量)
6.2 final类
final修饰类:此类不能被继承。
String、Math、System均为final修饰的类,不能被继承。
final修饰方法:此方法不能被覆盖。
意为最终方法,不支持子类以覆盖的形式修改。
6.3 final变量

final修饰变量:此变量值不能被改变(常量)。
所有final修饰的变量只能赋值一次,值不允许改变。
6.4 实例常量

实例常量不再提供默认值,必须手动赋予初始值。
赋值时机:显示初始化、动态代码块、构造方法。
注意:如果在构造方法中为实例常量赋值,必须保证所有的构造方法都能对其正确赋值。
6.5 静态常量

静态常量不再提供默认值,必须手动赋予初始值。
赋值时机:显示初始化、静态代码块。
6.6 总结
final修饰类:此类不能被继承。
final修饰方法:此方法不能被覆盖。
final修饰变量:此变量值不能被改变。(无初始值、只允许赋值一次)。
局部常量:显示初始化。
实例常量:显示初始化、动态代码块、构造方法。。
静态常量:显示初始化、静态代码块。
实例常量:显示初始化、动态代码块、构造方法.静态常量:显示初始化、静态代码块.
基本类型常量:值不可变。
引用类型常量:地址不可变。地址里面的内容可以改变
示例:
public class text {public static void main(String[] args) {final int [] a= {7,8,9};System.out.println("赋值前:");for(int i=0;i<a.length;i ) {System.out.print(a[i] "\t\t");a[i]=i;}System.out.println();System.out.println("赋值后:");for(int j:a) {System.out.print(j "\t\t");}}}
运行结果:
