java知识11 修饰符【多测师】
一、修饰符分为俩类:访问修饰符 非访问修饰符 修饰符用来定义类、方法或变量(放在语句的最前端) 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; }