JavaSE:static和final

268 阅读2分钟

001.static

/**
*static + 属性 :类变量  静态变量
*static + 方法 : 静态方法  类方法
*static + {}  :静态代码块
*/
public class StaticTest {

	private String name;  //成员属性  成员变量  实例变量
	
	private static int age=20; //静态属性 静态变量 类变量
	
	/**
	 * static + 方法
	 * 静态方法 类方法
	 */
	private static void getName(){
//		getAge();  静态方法中不能直接访问同一个类中的非静态成员
//		this.name="mingming"; 静态方法中不能使用this(this此时代表对象实例,static代表类共享)
		
//		StaticTest st = new StaticTest();
//		st.getAge();  //只有对象实例后,对象.成员方法的方式访问非静态成员
		System.out.println("static方法的getName");
	}
	
	/**
	 * 成员方法
	 */
	public void getAge(){
		getName();  //成员方法可以直接访问静态成员
		System.out.println("成员方法");
	}
	
	/**
	 * 类代码块
	 * static + {}
	 */
	static{
		System.out.println("这是静态代码块");
	}
	
	//构造代码块
	{
		System.out.println("构造代码块");
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StaticTest st = new StaticTest();
		st.getAge();  //对象引用名.方法
		System.out.println(StaticTest.age); //类名.属性
	}
}

0011.总结:

  • 静态成员的生命周期:类加载时产生,销毁时释放;
  • 访问:
    • 静态方法中不能直接访问类中非静态成员,但成员方法可以直接访问类中静态成员;
    • 静态方法中,只有对象实例后,对象.成员的方式访问非静态成员;
  • Static不能修饰类、局部变量和构造方法;
  • 静态方法中不能用this 和 super;
  • 类对象共享Static成员;
  • 静态成员访问方式:(推荐)1.类名.成员 2.对象名.成员;
  • 静态成员只执行一次,而对象实例化可以执行多次;
  • 只希望代码执行一次,可以考虑放在静态代码块中;

002.final

0021.final的影响

  • 修饰变量:不允许修改;
    • 基本数据类型:初始赋值后则不能更改;
    • 引用数据类型:初始化之后不能再指向另一个对象,但对象的内容是可以修改的;
  • 修饰方法:该方法不能被子类重写,但可以被子类继承使用;
  • 修饰类:不能被子类继承;
//修饰引用类型时-->(引用地址可以发生改变?属性值是否可以改变)
public void eat(){
    final Animal animal = new Animal("ming");
//  animal = new Animal(); 报错,引用地址是不可以发生改变的
    animal.name = "lili"; //但对象的属性值是可以修改的
}
//该方法不能被子类重写,但可以被子类继承使用
//父类
public class Animal 

    private String name = "Animal";
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
    
    public final void eat(){
    	System.out.println(this.getName()+"在吃东西");
    }
}
//子类
public class Dog extends Animal{
		
	/*这时,子类eat方法是不能重写父类eat方法的
	public void eat(){	
		System.out.println("Dog 重写了 eat");
	}
	*/		
}
//测试类
public class TestDemo {
    public static void main(String[] args) {
    	Dog dog = new Dog();
    	dog.setName("Dog");
    	dog.eat();
    }
}

//输出
Dog在吃东西

0022.注意

  • final不能修饰构造方法;