java中子类与父类中隐含的this引用的分析

/*
    看一下下面的程序,看是否你的答案和运行的答案是否一致!
*/
class Parent{

    public int x;
    public Parent p;
     public Parent(){}
     public Parent(int x){
           this.x=x;
           p=this;
    }

     public void f(){
            System.out.println("Parent::f()");
     }

      public void g(){
            System.out.println("Parent::g()");
     }

     public void h(){
            System.out.println("Parent::h()");
            f();
            g();
            y();
            System.out.println("LOOK HERE: " + x);
     }

     private void y(){
            System.out.println("Parent::y()");
     }
};

class Child extends Parent{
    public int x;

    public Child(){}
    public Child(int x){
            super(x+5);
            this.x=x;
    }

    public void f(){
            System.out.println("Child f()");
    }

    public void g(){
            System.out.println("Child g()");
    }
};

public class ThisDemo {

    public static void main(String[] args) {
            Child ch=new Child();
            ch.h();
            System.out.println();
            ch=new Child(5);
            ch.h();
            System.out.println();
            ch.p.h();
    }

}

其实c++this思想和java中的this思想差不多,就是在多态的情况下有一些不同,c++基类中的方法如果没有有virtual修饰,那么派生类的重写该方法时就不是覆盖,不会具有包含多态(c++多态的种类:强制多态、重载多态、类型参数化多态、包含多态(就是通过用virtual))!然而在java中,如果子类中重写了父类的方法,那么就是覆盖,就会产生像c++使用virtual的多态!

c++样例请点击这里:here!
输出结果:
/*
Parent::h()
Child f()
Child g()
Parent::y()
LOOK HERE: 0

Parent::h()
Child f()
Child g()
Parent::y()
LOOK HERE: 10//输出的是父类中的x

Parent::h()
Child f()
Child g()
Parent::y()
LOOK HERE: 10//输出的是父类中的x
*/
 
时间: 2024-12-18 23:11:33

java中子类与父类中隐含的this引用的分析的相关文章

java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构 Cat继承Animal Runner里包含main函数,程序入口 Sing类主要用来打印执行顺序的序列号 二.代码 public class Animal { Sing s1=new Sing(1,"animal\tnot static field"); static Sing s2=new Sing(2,&q

Java中子类和父类的构造函数?

这篇文章总结了关于Java构造的常见??问题. 1)为什么创建一个子类对象要也需要调用父类的构造函数? class Super { String s; public Super(){ System.out.println("Super"); } } public class Sub extends Super { public Sub(){ System.out.println("Sub"); } public static void main(String[] a

子类对父类中的属性和字段的改写

子类对父类中的属性和字段的改写 刚开始听老师讲,字段要用private来修饰,属性用public来修饰,通过属性来控制字段,字段存储数据. 那为什么要用private来修饰字段呢??? 原因:防止外部人员通过子类来改写父类中的属性以及字段,从而破坏了项目的初衷,造成严重的后果. 例子: 父类及成员: class Bea { public Bea(int age,string name) { this.Name = name; this.Age = age; } public int _age;

java中子类继承父类程序执行顺序问题

Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public class FatherTest { private String name; FatherTest(){ System.out.println("--父类的无参构造函数--"); } FatherTest(String name){ this.name=name; System.out

java中子类继承父类时是否继承构造函数

来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.html --------------------- java继承中对构造函数是不继承的,只是调用(隐式或显式). 以下是例子: public class FatherClass { public FatherClass() {       System.out.println(100); } public FatherClass(int age) {      Syst

[转]Java中子类调用父类构造方法的问题分析

在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下:    当你new一个子类对象的时候,必须首先要new一个父类的对像出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,这是规定,要new父类对象出来,那么肯定要调用其构造方法,所以: 第一个规则:子类的构造过程中,必须调用其父类的构造方

java中子类重写父类方法的思想本质

java语言中,在子类中定义与父类同返同名同参的方法将会出现"重写(覆写)",子类将屏蔽父类的相同方法,调用子类的方法将不会调用到父类的该方法. 许多初学者也许会被"覆写"一词迷惑,以为覆盖掉了父类的方法,其实这两种方法是同时独立存在的,只是子父类调用该方法的入口不一样,彼此互不干扰. 1 /* 2 需求:设计一个简单的java程序,证明子类重写父类方法的过程 3 思路: 1.创建父类对象,通过父类对象调用该方法 4 2.创建子类对象,通过父类对象调用该方法 5 3

java中子类覆盖父类方法所必须满足的条件

一.描述 子类重写(覆盖)父类的方法必须满足的条件: 1.父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为private类型的,那么子类则无法继承,也无法覆盖. 2.子类和父类的方法必须是实例方法,如果父类是static方法而子类是实例方法,或者相反都会报错. 如果父类和子类都是static方法,那么子类隐藏父类的方法,而不是重写父类方法. 3.子类和父类的方法必须要具有相同的函数名称.参数列表,并且子类的

【Simple Java】关于JAVA中子类和父类的构造方法

本篇文章总结了一些关于Java构造方法的常见问题. 为什么创建了一个子类对象会调用其父类的构造方法 如下代码示例: package simplejava; class Super { String s; public Super() { System.out.println("Super"); } } class Sub extends Super { public Sub() { System.out.println("Sub"); } } public clas