一、修饰符分为俩类:访问修饰符 非访问修饰符
修饰符用来定义类、方法或变量(放在语句的最前端)
public class Dog {
//....
private boolean myFlag;
static final double weeks=9.5;
protected static final int BOXWIDTH=42;
public static void main(String[] args) {
//方法体
}
}
二、访问控制
三、默认访问修饰符 不使用任何关键字、变量和方法的声明不使用任何修饰符
实例:
String version ='1.2'
boolean processOrder(){
return true;
}
四、私有访问修饰符 private
被声明为private的方法、变量和构造方法只能被所属类访问 类和接口不能声明为private
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
解读:实例中,Logger 类中的 format 变量为私有变量,所以其他类不能直接得到和设置该变量的值。为了使其他类能够操作该变量,
定义了两个 public 方法:getFormat() (返回 format的值)和 setFormat(String)(设置 format 的值)
五、公有访问修饰符 public
声明为public的类、方法、构造方法和接口都可以被任何其他类访问
Java的main方法必须设为公有 不然Java解释器不能运行该类
六、受保护的访问修饰符 protected
不能修饰类和接口、方法和成员变量能够声明为protected 但是接口的成员变量和成员方法不能声明为protected、子类能访问protected修饰符声明的方法和变量
七、访问控制和继承
父类声明为public方法在子类也为public
父类声明为protected的方法 子类要么声明为protected 要么声明为public 不能声明为private
父类中声明为private的方法 不能够被继承
八、非访问修饰符
static修饰符 用来修饰类方法和类变量
final修饰符 用来修饰类、方法和变量 final修饰的类不能够被继承、修饰的方法不能被继承重新定义
修饰的变量为常量、是不可修改的
Abstract 用来创建抽象类和抽象方法
synchronize和volatile 主要用于线程的编程
九、static修饰符
静态变量:
无论一个类实例化多少对象、它的静态变量只有一份拷贝、静态变量也称为类变量
局部变量不能被声明为static变量
非静态变量:
静态方法不能使用类的非静态变量
static修饰符用来创建类方法和类变量:
public class InstanceCounter {
private static int numInstances = 0;
protected static int getCount() {
return numInstances;
}
private static void addInstance() {
numInstances++;
}
InstanceCounter() {
InstanceCounter.addInstance();
}
public static void main(String[] arguments) {
System.out.println("Starting with " + InstanceCounter.getCount() + " instances");
for (int i = 0; i < 500; ++i) {
new InstanceCounter();
}
System.out.println("Created " + InstanceCounter.getCount() + " instances");
}
}
十、final修饰符
final方法:类中final方法可以被子类继承、但是不能被子类修改
public class Test{
public final void changeName(){
// 方法体
}
}
final方法:不能被继承
public final class Test {
// 类体
}
十一、Abstract修饰符:
抽象类:不能用来实例化对象 一个类不能同时被Abstract和final修饰 如果一个类包含抽象方法 那么该类一定要声明抽象类、抽象类可以包含抽象方法和非抽象方法
abstract class Caravan{
private double price;
private String model;
private String year;
public abstract void goFast(); //抽象方法
public abstract void changeColor();
}
抽象方法:不能被声明为final和static 子类继承必须实现父类的所有抽象方法
一个类包含若干抽象方法、那么该类必须声明为抽象类 抽象类可以不包含抽象方法
抽象方法声明以分号结尾 例如:public abstract sample();
实例:
public abstract class SuperClass{
abstract void m(); //抽象方法
}
class SubClass extends SuperClass{
//实现抽象方法
void m(){
………
}
}
十二、Java修饰符总结:
Java的类(外部类) 有2种访问权限:public和default
方法和变量有4种:public default protected 和private
public:任何地方的类都可以访问
default:同一个包的类可以访问
protected:同一个包的类可以访问、其他包的该类的子类也可以访问
private:表示只有自己类能访问
修饰符:abstract static final
abstract:表示是抽象类 使用对象:类 接口 方法
static:不用先实例化一个外部类、可以当做普通类使用 使用对象:类 变量 方法 初始化函数
final:表示类不可以被继承 使用对象:类 变量 方法
十三、静态变量并不是说其不能改变、不能改变值的量叫常量、其拥有的值是可变的 而且会保持最新的值 说其静态、是因为它不会随着函数的调用和退出而发生变化 即上次调用函数的时候 如果我们给静态变量赋予某个值的话 下次函数调用时、这个值保持不变
关于static修饰符的理解
静态变量是一个类的公有属性 静态方法只能使用类的静态变量
十四、transient修饰符(序列化)
//定义一个需要序列化的类
class TransientPeople implements Serializable { //需要实现相应接口的所有方法
String name; // 姓名
transient Integer age; // 年龄
public TransientPeople(String name, int age) {
this.name = name; //this相当于类本身
this.age = age;
}
public String toString() {
return "姓名 = " + name + " ,年龄 = " + age;
}
}
public class TransientPeople{
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
TransientPeople a = new TransientPeople("李雷", 30);//实例化并传入参数
System.out.println(a); // 打印对象的值
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d://people.txt"));
os.writeObject(a);// 写入文件(序列化)
os.close();
ObjectInputStream is = new ObjectInputStream(new FileInputStream("d://people.txt"));
a = (TransientPeople) is.readObject();// 将文件数据转换为对象(反序列化)
System.out.println(a); // 年龄 数据未定义
is.close();
}
}
十五、final变量
1.用final修饰的成员变量表示常量、值一旦给定就无法改变
2.final修饰的变量有三种:静态变量 实例变量和局部变量,final变量定义的时候可以先声明
而不给初值
final和final static修饰的变量初始化方式
成员变量:
方式一 在定义变量时直接赋值
private final int i = 3;
方式二 声明完变量后在构造方法中为其赋值,用这种方式每个构造方法中都要有j赋值的语句
private final int j;
public FinalTest() {
j = 3;
}
方式三 声明完变量后在构造代码块中为其赋值,这样的话就不能在构造方法中为其赋值
如果在构造函数中再次赋值会造成final变量的重复赋值
private final int k;
{
K = 4;
}
类变量(静态变量)
方式一:在定义类变量时直接赋值
public final static int p =3;
方式二:在静态代码块中赋值、成员变量可以在构造函数中赋值,但是类变量是不可以的
成员变量是属于对象独有的,每个对象创建时只会调用一次构造函数,而类变量是该类的
所有对象共有,每个对象创建时都会对该变量赋值,这样会造成变量的重复赋值
public final static int q;
static{
Q = 3;
}