java初始化顺序,final使用,override等

在java中分为基本类型和引用类型,基本类型在初始化时被自动的初始化为0,而引用类型则是被初始化成了null,在编译初始化变量的地方主要有:
1.定义这个变量的地方,它在对象构造器被调用之前被初始化,这里也是最常用的初始化变量的地方
2.构造器当中
3.在真正使用实例之前,这个也称作惰性或者延时初始化,单例模式可能会用到
4.使用初始化块进行初始化
    override是指在子类中重新实现了父类中的方法,该方法与其父类的方法有相同的名称和参数列表,对于返回类型,也必须是一样的。对于访问权限,子类 中访问权限应该不小于父类的,在项目中我们经常遇到两个不同的模块代码不在同一个包中,一个模块需要访问另一个模块的代码,由于这个方法是 protected的,所以可以创建子类重新重写这个方法,并且将方法的访问权限提升到public的,关于方法的异常声明,子类要么不声明异常,要么声 明的异常是父类方法的异常或者该异常的子类。
    还有个有趣的问题,方法可以重写,那么属性可不可以?,答案是否定的,方法的重写是Java多态性的表现,多态性还要拜java的动态绑定所赐,动态绑定 是指在运行时确定要调用的方法,而属性,早在N年前在编译期时候就被编译器搞定了,根本不可能有多态,也没有重写和覆盖一说了。
    现在看看继承类的初始化顺序:
   
package extend;

public class Person {
    
private static String name ;
    
static {
        name 
="super static class :i am john";
        System.out.println(name);
    }
    
    
private int age =10;
    
private String description ="i am   a man" ;
    {
        System.out.println(
"super class age before:"+this.age);
        System.out.println(
"super class description before:"+this.description);
    }
    
    
public Person (int age,String description){
        
this.age=age;
        
this.description =description;
        System.out.println(
"super class age after:"+this.age);
        System.out.println(
"super class description after:"+this.description);
        
    }
}
   
package extend;

public class Student extends Person{
    
private static String name ;
    
static {
        name 
="sub static class :i am lilei";
        System.out.println(name);
    }
    
private int age =20;
    
private String description ="i am  a  student " ;
    
    {
        System.out.println(
"sub class age before:"+this.age);
        System.out.println(
"sub class description before:"+this.description);
    }

    
public Student(int age, String description) {
        
//super() must be the first line
        super(age, description);
        
this.age=age;
        
this.description =description;
        System.out.println(
"sub class age after:"+this.age);
        System.out.println(
"sub class description after:"+this.description);
        
    }

    
public static void main(String[] args) {
        Person p 
= new Student(30,"test");
    }

}
   输出的结果为:
 
super static class :i am john
sub static class :i am lilei
super class age before:10
super class description before:i am   a man
super class age after:30
super class description after:test
sub class age before:20
sub class description before:i am  a  student 
sub class age after:30
sub class description after:test
  所以初始化的顺序为:
  父类的静态变量,静态初始化块--->子类的静态变量,静态初始化块--->父类变量,初始化块--->父类
  构造器--->子类变量,初始化块--->子类构造器 

  类的清理一般和类创建的顺序相反。
-----------------------------------------------------
   final
   fianl可以用在类,变量,方法上面;作用在类代表不能被继承,在方法上代表不能覆盖,在变量上代表不能修改,在早期的jdk实现里面,final使得一部分代码在编译的时候进行了内联,优化了速度,在新的jdk当中本身的速度已经到了一定高度上,为了优化速度而用final反而显得不值得,必须在必要的时候才用final

posted on 2010-05-22 01:05 nod0620 阅读(635) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜