面向对象个人总结一些易错知识

来源:互联网 发布:网络用语fu是什么意思 编辑:程序博客网 时间:2024/05/29 16:30

一、类的加载

(1)同一类的加载顺序

     先加加载静态代码块(随着类的加载而加载)

 再加载构造代码块(用于多个构造方法中相同的代码)

 最后构造方法

(2)若一个子类继承一个父类,则在new子类对象的时候会先加载父类构造器,用super...)调用,写在子类构造方法的第一行(不写默认为无参构造),。

例子:

class Fu {

static {

System.out.println("静态代码块Fu");

}

 

{

System.out.println("构造代码块Fu");

}

 

public Fu() {

System.out.println("构造方法Fu");

}

}

 

class Zi extends Fu {

static {

System.out.println("静态代码块Zi");

}

 

{

System.out.println("构造代码块Zi");

}

 

public Zi() {

System.out.println("构造方法Zi");

}

}

 

class ExtendsTest2 {

public static void main(String[] args) {

Zi z = new Zi();

}

}

结果是:

静态代码块Fu

静态代码块Zi

构造代码块Fu

构造方法Fu

构造代码块Zi

构造方法Zi

二、继承中子类方法访问成员变量,成员方法的特点

      (1)直接使用this和super关键字分别访问子类或父类成员。

       (2)若没有使用关键字

          子类的方法会先在子类的成员范围找,有就使用,没有就再去父类的成员范围找。这也就意味着当子类有和父类同名的成员变量或成员方法(重写),若不使用super关    键字,会使用子类的成员。

三、多态

 (1)多态的三要素

*继承或实现结构

*方法重写

*向上转型

 (2)多态作用

    *提高代码的维护性(继承体现)

*提高代码的扩展性(多态体现)

(3)理解多态

  例:

class  Father{

int age;

void enjoy(){

System.out.println(“看电视”);

}

        }

Class Son extends Father{

Int age;

void enjoy(){

System.out.println(“踢球”);

}

}

   进行向上转型用父类引用指向之类对象,Father f=new Son(),按照之前的理解,父类引用f应该只能访问到子类对象中的父类构造器那一部分,所以f只能调用父类有的变量和方法。

然而在实际使用过程中,f在调用成员变量age时调用的确实是父类Fatherage,但在调用enjoy()方法时却是调用子类重写的方法,会出现这种情况也是重写和多态的意义所在

(4)动态绑定机制

  为什么会产生这样的上述的情况。

  首先方法和成员变量不同,方法存在于方法区中,当父类引用f找到子类中的父类构造器后,在父类构造器中会有一个指向方法区中父类Fatherenjoy()方法的指针,但是在程序运行期间当在new Son()对象的时候,指向Fatherenjoy()方法的指针会根据对象本身去寻找子类是否有重写该方法,有则该指针指向重写后的方法。这就是动态绑定机制。

2 0
原创粉丝点击