码迷,mamicode.com
首页 > 编程语言 > 详细

java的继承

时间:2016-03-26 12:15:36      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

我总是记不住继承是怎么个机制,今天我来彻底的总结一下。

 感谢海子,给出他的链接http://www.cnblogs.com/dolphin0520/p/3803432.html

 

先了解一下初始化的顺序

当程序执行时,需要生成某个类的对象,java执行引擎会先检查是否加载了这个类,如果没有加载,则先执行类的加载再生成对象,如果已经加载,则直接生成对象。

类加载的过程中,类的static成员变量会被初始化,类的static语句块会被执行。

java中类是按需加载,只有当用到这个类的时候才会加载这个类,并且只会加载一次

看看这个例子

public class T{
    public static void main(String[] args){
        Shape shape1 = new Shape();
        Shape shape2 = new Shape();
    }
}

class Shape{
    
    static{
        System.out.println("static is cout");
    }
    
    public Shape(){
        System.out.println("shape is cout");
    }

}

 

会输出什么?

技术分享
static is cout
shape is cout
shape is cout
View Code

解释:在类加载时会执行static块,而且只执行一次。创建了两个Shape实例,所以shape的构造器被调用两次

 

再来看看

在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。

public class T{
    public static void main(String[] args){
        new Circle();
    }
}

class Shape{
    
    public Shape(){
        System.out.println("shape is cout");
    }

}

class Circle{
        
    public Circle(){
        System.out.println("circle is cout");
    }
    
    Shape shape=new Shape();
}

结果:

技术分享
shape is cout
circle is cout
View Code

上面标记的字体已经解释清楚了

再来看看下面这个例子

public class Test{
    public static void main(String[] args){
        Shape shape=new Circle();
        System.out.println(shape.name);
        System.out.println(shape.age);
        shape.printType();
        shape.printName();
    }
}

class Shape{
    public String name="shape";
    public static int age=10;
    
    public Shape(){
        System.out.println("shape 的构造器");
    }
    
    public void printType(){
        System.out.println("this type shape");
    }
    
    public static void printName(){
        System.out.println("this name shape");
    }
}

class Circle extends Shape{
    public String name="Circle";
    public static int age=18;
    
    public Circle(){
        System.out.println("Circle 的构造器");
    }
    
    public void printType(){
        System.out.println("this type Circle");
    }
    
    public static void printName(){
        System.out.println("this name Circle");
    }
}

 

想想结果是什么?

技术分享
shape的构造器
Circle的构造器
shape
10
this type Circle
this name shape
View Code

 解释一下:

 

其实这总结出来三句话

1、父类的构造器调用以及初始化过程一定在子类的前面

2、类中的变量会在任何方法调用之前得到初始化

3、子类覆盖父类,会调用子类的方法;父类成员和方法如果是static,final的会隐藏子类的同名成员和方法

 

再来看看这个

public class T{
    public static void main(String[] args){
        Circle circle=new Circle();
        System.out.println(circle.name);
        System.out.println(circle.age);
        circle.printType();
        circle.printName();
    }
}

class Shape{
    public String name="shape";
    public static int age=10;
    
    public Shape(){
        System.out.println("shape 的构造器");
    }
    
    public void printType(){
        System.out.println("this type shape");
    }
    
    public static void printName(){
        System.out.println("this name shape");
    }
}

class Circle extends Shape{
    public String name="Circle";
    public static int age=18;
    
    public Circle(){
        System.out.println("Circle 的构造器");
    }
    
    public void printType(){
        System.out.println("this type Circle");
    }
    
    public static void printName(){
        System.out.println("this name Circle");
    }
}

 

想想运行结果

技术分享
shape的构造器
Circle的构造器
Circle
18
this type Circle
this name Circle
View Code

 我们可以看到,这里除了调用了shape中的构造方法,其他的都是circle里面的。应该挺好理解的吧。

 

java的继承

标签:

原文地址:http://www.cnblogs.com/wabi87547568/p/5322469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!