在Java中提供了很多的修饰符,修饰符可以用来修饰类,接口,方法,变量的信息;不同的修饰符,可以控制不同的访问权限;
以我们第一次接触的java中main方法来说:
public static void main(String[] args) {……}//主程序,这个一个公共的静态方法
public:(公共的)访问权限,可以修饰类,接口,变量,方法;public所修饰的内容,在当前类,同一个包,其他包都可以访问,全范围内都可以使用;
static:(静态的)是一个修饰符,用于修饰成员(成员变量和成员函数),使用static修饰变量的时候,这个变量在内存中只有一份,也就是说无论这个类有多少个对象,都使用同一个内存空间,也就是说每个对象所访问该变量的值都是一样的,如果有一个对象将这个值进行了修改,那么其他对象访问这个值也就相应的进行了修改;使用static修饰方法,使用static修饰的方法为静态方法,静态方法中不可以调用没有static的非静态方法;
静态成员随着类的加载而加载。
静态成员优先于对象存在。
静态成员被所有对象所共享
静态成员多了一个中调用方式,可以被类名直接调用。
静态使用的注意事项。
静态方法只能访问静态成员, 非静态方法既可以访问静态又可以访问非静态。
静态方法中不可以定义this,super关键字。因为this代表是对象。而静态存在时,有可能没有对象。所以静态方法运行时,this是没有任何对象代表的。
简单说,先进内存的数据不可以访问后进内存的数据,可是后进内存数据可以访问先进内存的数据
静态的优缺点
优点: 静态成员多了一种调用方式。可以直接被类名调用 格式 :类名.静态成员。也可以被对象调用。
缺点 : 静态方法只能访问静态成员,出现了访问局限性。
当成员变量被静态修饰后,和非静态成员变量的区别:
静态变量也称为类变量,也就是直接可以被类名调用的变量。这个变量是所属于类的。非静态变量成为成员变量,或者实例变量,是被对象调用的,是所属具体对象的。
静态变量随着类的加载而加载,也意味着随着类的消失而消失。生命周期最长。实例变量,随着对象的创建而加载,随着对象的消失而消失。按照对象的生命周期而存在。
静态变量存储在方法区的静态区中。 实例变量存在于对象所属的堆内存中。
静态变量数据,被所有对象所共享。 实例变量是对象中的特有数据。
protected:(受保护的)可以修饰变量、方法,不可修饰外部类;使用该修饰符修饰的类型可以当前在所在类、同一包内的其他类、其他包内的子类都可以访问;其他包内非子类不可以访问;
protected Integer a;//这是一个受保护的Integer变量
default:(默认)可以修饰类、接口、变量、方法。使用该修饰符修饰的类型可以当前在所在类、同一包内的其他类、其他包内的子类都可以访问;其他包内非子类不可以访问;
int thisIsDefault;//这是一个默认的int变量
private:(私有的)可以修饰变量、方法。不能修饰外部类;被private修饰的属性和方法,不能被其他类访问,子类不能继承也不能访问。只能在所在类内部访问。
private Integer thisIsPrivate ;//这是一个私有的Integer变量
final:(最终)使用final修饰的变量,初始化之后,不可以再次修改这个变量的值,也就说当给这个变量赋值之后,就不能再重新赋值;被final修饰的变量,当定义的时候,给他初始化了;final修饰的方法,可以防止这个方法被子类重写修改;
final 变量:
变量一旦赋值后,不能被重新赋值。
final 修饰符通常和 static 修饰符一起使用来创建类常量。
final 方法:
父类中的 final 方法可以被子类继承,但是不能被子类重写。
final 类:
final 类不能被继承,没有类能够继承 final 类的任何特性。
final int THISISFINAL=10;//这是一个不能更改的int常量
abstract:(抽象)可以修饰的类型有类和方法;当修饰类的时候,表示这个类是一个抽象的类;抽象类不可以实例化对象,只能被继承;当抽象类的子孙类不是抽象类的时候,才可以被实例化;当abstract修饰方法的时候,表示这个方法是抽象方法,一个抽象类里面可以没有抽象方法,但是当一个类里面有抽象方法的时候,那么这个类是抽象类;
public abstract thisIsAbstract();//这是一个抽象的方法
一个类不能同时被 abstract 和 final 修饰。
抽象方法:
①抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
②抽象方法不能被声明成 final 和 static。
③任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
④包含抽象方法的类必须声明为抽象类,但抽象类可以不包含抽象方法。
⑤抽象方法的声明以分号结尾
(默认修饰符,没有指定访问修饰符的,默认是default)
变量或者方法前没有访问修饰符时,可以被所在类访问,可以被同一包内的其他类访问 或者继承。但是不能被其他包访问。