一, final
final:”不可更改的”,可以修饰非抽象类,变量或者方法。一旦将引用声明为final,就不可以改变这个引用了。
- final 修饰的常量只能被初始化一次,一旦初始化之后就不能再次重新赋值(重新指向其他对象)
final StringBuffer s = new StringBuffer("string");
//这里 s 指向的对象本身可以修改
s.append("add");
//s=new StringBuffer("new"); 错误。s 不可以再指向其他对象
对方法参数和方法内部变量加上final 作用相同,既是为了将它们传给内部类时保证调用的一致性。
- final 类不可以被继承(因此不可以修饰抽象类)
- final 方法不可以被子类的方法修改
- 原因:把方法锁定,防止任何继承类修改;高效。
/* * final 方法的重载 重写以及继承 * */ package com.something; public class Ch3_Final { public static void main(String[] args) { Change ch =new Change(); //test1可以被继承 ch.test1(); ch.test2(); //test1可以被重载 ch.test1("ok"); } } class Test { //final 方法 public final void test1(){ System.out.println("this is original test1"); } public void test2(){ System.out.println("this is original test2"); } } class Change extends Test { //final 方法不可以被重写 public void test2(){ System.out.println("this is test2"); } //final 方法可以被重载 overload public void test1(String s){ System.out.println("this is the overloaded test1---" + s); } }
二,static
static:”静态的”,用来修饰成员变量或者成员方法。也可以形成静态代码块。
- static 修饰变量
- static 修饰方法
- 所修饰的变量或者方法称为类方法或类变量,
被类的所有实例共享,不依赖于类特定的实例。可以直接用类名来访问,也可以构造实例来访问(不推荐)。注意,类方法不能操作对象,所以不能在类方法中访问实例域,但是类方法可以访问自身类中的静态域。
对于类变量任何对象对其修改都是修改的 同一个变量。
这里关于类方法和实例方法之间的访问。
- static修饰的代码块:静态代码块
- 静态代码块不在任何方法体内,JVM加载类时会执行这些静态代码块(静态代码块自动执行,静态方法被调用时才执行)。
Java 程序的执行顺序:
1. 静态块—是生成类之前初始化的,是最先初始化好的,每个代码块只执行一次,之后及时有该类的实例化也不会执行。
2. 块
3. 构造器
4. 父类构造器
Java 中的赋值顺序:
1. 静态块直接赋值
2. 块直接赋值
3. 父类集成的属性已赋值
4. 静态变量声明时赋值
5. 成员变量声明时赋值
6. 构造器赋值
三,public
public是访问控制修饰符,public,private决定的只是访问权限。所以public static,private static 中影响的只是权限的问题。
package com.something; public class Ch4_privateStatic { public static void main(String[] args) { TestStatic t1 = new TestStatic("book1"); TestStatic t2 = new TestStatic("book2"); //这里numBooks 读取不到,Test.numBooks 报错,因为是private System.out.println("numBooks is "+TestStatic.id + "; name1 is "+t1.name + ";name2 is "+t2.name ); } } class TestStatic{ //1,private static int numBooks=0; static int id=0; public String name; public TestStatic(String name){ //这里 numBooks 每次创建一个实例就会自增一次,且 private 在其他 class 中不可以被访问 //2,id=++numBooks; id++; this.name=name; } }
四类修饰符
public protected default private四类修饰符
- public:任何地方都可以访问,对访问没有限制
- protected:同一个包或者不同包内子类可以访问
- 默认 default:同一个包内可以访问
- private :只有本类可以访问,其他同包中包括类和子类都不可访问这些私有的成员
接口与抽象类
- 实现继承个数
- 抽象方法个数:接口中都是抽象方法
- 是否使用字段:常量字段,接口中只能是static final 类型的,抽象方法不限
- 方法的描述符:接口中方法必须是public
- 是否构造函数:接口中没有构造函数,抽象类中可以有