类修饰符:
类修饰符只能是public、abstract、final或默认的(friendly),注意,friendly只是默认的,什么都不写即可,不能直接写上friendly,否则编译报错。
访问修饰符:
1、public:公共类,可以被任何对象访问。
2、friendly:默认的,相同包下的对象才能访问。
修饰符:
3、abstract:抽象类,没有实现的方法,需要子类提供方法实现。类中只要有一个抽象方法,就必须定义为抽象类,但是抽象类中不一定必须有抽象方法。
4、final:最终类(非继承类),不能被其他类继承。如果类被声明为final,则表示类不能被继承,也就是说不能有子类。所以final类不能被声明为abstract抽象类。即final关键字和abstract关键字不能同时使用。
成员变量修饰符:
访问修饰符:
1、public:方法为公共的,所有对象都可访问。
2、private:私有的,只允许自己的类访问,其他任何类(包括子类)都不能访问。
3、protected:保护的,只允许自己的类和子类以及同一个包内的类访问,子类中可以覆盖此变量,若子类没有在同一个包下,也可以访问。
4、friendly:默认的(友好的),同一个包内对象可以访问,其他包中类不能访问。即使是子类,若没有在同一个包下,也不可以访问。
修饰符:
5、final:最终修饰符,此变量值不能变。
6、static:静态修饰符,变量被所有对象共享,所有实例都可以使用该变量,变量属于这个类。(静态变量和transient一样,都不可以被序列化)。
7、transient:过度修饰符,变量是系统保留的,暂无特别作用的临时性变量。告诉编译器,在类的对象序列化时,此变量不需要持久保存。(只能修饰变量,不能修饰方法和类)
一个对象只要实现了Serilizable接口就可以被序列化(序列化是指将对象转换为可以存储或者传输的形式),但是有时候有些属性不希望被序列化,比如银行卡账户,密码等信息,这时,只要将相应的属性定义为transient即可,例如:
定义一个user类(此类必须实现Serializable接口,否则不能序列化),将对象信息输出到文件中:
user u = new user();
u.setUsername("fengxiaotao");
u.setPassword("123456");
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("F:\\a\\user.txt"));
out.writeObject(u);
out.flush();
out.close();
这时可以将对象的账号和密码都输出,但是如果将password属性定义为transient,则password字段不会被传输到文件中:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("F:\\a\\user.txt"));
user u2 =(user) in.readObject();
System.out.println(u2.getUsername());
System.out.println(u2.getPassword());
输出为:
fengxiaotao
null
可见,反序列化时,没有从文件中获取到相应信息。如果username被static修饰,那么username也不可以被序列化,因为静态变量不管是否被transient修饰,都不可以被序列化。
说明:
若实现的不是Serializable接口,而是Externalizable接口,则默认所有属性都不可以序列化,与是否被transient修饰无关,需要在writeExternal方法中指定需要序列化的变量。
volatile:易失修饰符,变量可以同时被几个线程控制和修改。方法修饰符:
访问修饰符:
1、public:公共控制符
2、private:私有方法,只有自己的类能访问,其他类(包括子类)不可以访问。
3、protected:保护访问控制符,只可以被自己的类和子类以及同一个包内的对象访问,若子类没有在同一个包下,也可以访问。
4、friendly:缺省的,同一个包下才能访问。
修饰符:
5、final:该方法不能被重载。
6、static:该方法不需要实例化就可以使用
7、synchronize:同步修饰符,多线程中使用,运行前对方法加锁,运行后解锁。
8、native:本地修饰符,指该方法的方法体由其他语言在程序外实现。
特殊修饰符:
1、 static
例如类user中有
普通变量public Stringname="fxt";
和静态变量:publicstatic String pass="123";
a) static静态变量:
其他类访问静态变量时,不需要实例化那个类,就可以直接使用,例如user.pass,而普通变量需要实例化后使用:user u = new user(); u.name。
并且当本类中要使用某变量时,如果是普通变量,不能直接使用,需要实例化,而静态变量则可以直接使用。
b) static静态方法:
静态方法和静态变量类似,也是可以不实例化类就可以直接使用。
c) static静态块
static {
System.out.println("fxt");
}
当类加载时,类中静态块中的内容就会执行,例如实例化这个类:user u= new user();就会执行输出”fxt”内容的代码。
类加载说明:程序若要运行,首先要将代码加载到内存中,然后才能与CPU交互,Java中.class文件若要执行,首先要加载到内存,这一步就是类加载。当需要创建对象时new user(),首先要类加载,才能new对象,静态代码块在类加载时会被加载,然后整个应用程序的生命周期中不会再次被加载,所以也说明了静态块就执行一次,不会执行第二遍。