Java中的三大修饰符
abstract(抽象的)
概念:无法描述的,无法实例的
关键字:abstract
可以修饰:
方法
把一个方法声明为 abstract ,表示它是一个抽象方法,本身没有实现
任何方法语句
语法格式:
访问权限修饰符 abstract 返回值类型 方法名(形参列表);
注意:
1,抽象方法没有方法体
2,有抽象方法的类一定是抽象类
类
当用 abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是
它的 所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类
可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型
隐藏。
语法格式:
访问权限修饰 abstract class 类名{
属性
方法
构造函数
}
注意:
1,子类继承与抽象类,要么重写所有抽象方法,要么自己也是抽象类
2,抽象类无法直接创建对象
3,抽象类中不一定有抽象方法
final(最终的)
概念:不可修改的,最后的
关键字:final
修饰:
类
意义:最终类,不能被别的类继承
语法:
访问权限修饰符 final class 类名 extends 父类名{
属性
方法
构造函数
}
方法
意思:不可被重写
语法:
访问权限修饰符 final 返回值类型 方法名(形参列表){
方法体
return xxx;
}
属性
意思:不可被修改,称为常量,常量命名全大写
语法:
访问权限修饰符 final 数据类型 属性名;
final 修饰的变量就是常量
局部变量
意思:不可被修改,称为常量,常量命名全大写
语法:
final 数据类型 属性名;
final 修饰的变量就是常量
static(静态的)
概念:该类所有对象共有的,属于类
关键字:static
属性
语法:访问权限修饰符 static 数据类型 属性名;
static 修饰的属性称为静态成员变量
注意:
1,static 修饰的属性属于该类的所有对象,一个对象对其进行修改,所有
对象的该属性都将被修改
2,static 修饰的属性多了一种调用方式
语法:
类名.属性名;
类名.属性名 = 值;
原来:
对象名.属性名;
对象名.属性名 = 值;
静态变量和成员变量的区别
静态变量:
1. 调用方式:类名.属性名或对象名.属性名
2.属于该类所有的对象
成员变量:
1.调用方式:对象名.属性名
2.属于具体的某一对象
方法
语法:
访问权限修饰符 static 返回值类型 方法名(形参列表){
方法体
}
static 修饰的方法称为静态方法
注意:
1,静态方法中只能直接使用静态成员(静态属性,静态方法)
2,static 修饰的方法多了一种调用方式
语法:
类名.方法名(实参列表);
原来:
对象名.方法名(实参列表);
3,静态方法中不能使用 this 与 super
因为不论是使用 this 还是 super 本职上都是通过对象调用对象内部
的方法而在静态方法中看通过类名.方法名(实参列表)的形式调用静态方法,
而此时并为创建对象
this 与 super 在此时均未指明对象,因此在静态方法中不能使用非静
态的属性和方法。
代码块
概念:一块代码
语法:
{
代码
}
调用:
每次调用该类构造函数创建对象时,由系统调用该类的普通代码块,在执行
构造函数前调用
普通代码块:
类中,方法以外
与static结合使用
语法:
static{
}
调用:
类加载时调用,所以只会调用一次
类的加载时机:
第一种情况:第一次创建该类对象时
第二种情况:第一次创建子类对象时
第三种情况:使用类名调用本类静态属性
第四种情况:使用类名调用本类静态方法
第五种情况:使用第一次使用反射获取该类对象时
Class.forName("包名.类名");
注意:类只加载一次
一个类有静态与非静态属性,先加载静态属性
这是由Java的内存加载机制所决定的。
在类进行加载时类中的所有代码均会加载至内存中,此时类中的静态变量
和静态方法会分配至内存的常量区和静态方法区,此时该静态变量和方法均可
通过类名进行调用,而非静态方法和变量的代码虽然已经加载至相应的区域,
但由于没有对该类创建对象进行实例化没有在内存堆中对该分配空间,因此
无法调用类中的非静态方法和变量,只要通过 new 生成对象后才可对非静态
变量和方法进行调用,因此类中的静态属性要优先于非静态属性先加载。
在继承关系:先加载父类静态,在加载子类静态,之后是父类的非静态,最后是
子类的非静态