public class ExtendsDemo {
public static void main(String[] args) {
SubClass sub = new SubClass();
System.out.println("\n=================================\n");
SuperClass su = new SuperClass(99, 99);
}
}
/**
* 静态代码块—>非静态代码块—>初始化成员变量—>[父类的构造方法]—>构造方法
* 子类在调用父类构造方法时,整个过程中的this(Class实例)都是指向子类(包括父类的成员变量中的this)
*
* @author XuJinnan
*
*/
class SuperClass{
int a=1;
int b=1;
Foo foo = new Foo("SuperClass", this);
public SuperClass(int a,int b){
//this.b=b;
this.test();
//this.getClass()得到子类的Class实例,this.属性得到父类的属性
System.out.println("SuperClass Constructor's object:"+this.getClass().getSimpleName()+"\tthis.b:"+this.b);
}
public void test(){
System.out.println("SuperClass's test a:"+a+"\tSuperClass's test b:"+b);
}
}
class SubClass extends SuperClass{
int b=2;
private Foo foo = new Foo("SubClass", this);
public SubClass(){
super(4,5);
}
public void test(){
System.out.println("SubClass'test a:"+a+"\tSubClass'test b:"+b+"\t");
}
}
class Foo{
public Foo(String str, Object obj){
System.out.println(str+"类的Foo成员变量:this为"+obj.getClass().getSimpleName());
}
}
public static void main(String[] args) {
SubClass sub = new SubClass();
System.out.println("\n=================================\n");
SuperClass su = new SuperClass(99, 99);
}
}
/**
* 静态代码块—>非静态代码块—>初始化成员变量—>[父类的构造方法]—>构造方法
* 子类在调用父类构造方法时,整个过程中的this(Class实例)都是指向子类(包括父类的成员变量中的this)
*
* @author XuJinnan
*
*/
class SuperClass{
int a=1;
int b=1;
Foo foo = new Foo("SuperClass", this);
public SuperClass(int a,int b){
//this.b=b;
this.test();
//this.getClass()得到子类的Class实例,this.属性得到父类的属性
System.out.println("SuperClass Constructor's object:"+this.getClass().getSimpleName()+"\tthis.b:"+this.b);
}
public void test(){
System.out.println("SuperClass's test a:"+a+"\tSuperClass's test b:"+b);
}
}
class SubClass extends SuperClass{
int b=2;
private Foo foo = new Foo("SubClass", this);
public SubClass(){
super(4,5);
}
public void test(){
System.out.println("SubClass'test a:"+a+"\tSubClass'test b:"+b+"\t");
}
}
class Foo{
public Foo(String str, Object obj){
System.out.println(str+"类的Foo成员变量:this为"+obj.getClass().getSimpleName());
}
}
输出:
SuperClass类的Foo成员变量:this为SubClass
SubClass'test a:1 SubClass'test b:0
SuperClass Constructor's object:SubClass this.b:1
SubClass类的Foo成员变量:this为SubClass
=================================
SuperClass类的Foo成员变量:this为SuperClass
SuperClass's test a:1 SuperClass's test b:1
SuperClass Constructor's object:SuperClass this.b:1
实例2
public class Test {
public static void main(String[] args) {
Foos foo = new Bar();
foo.addFive();
System.out.println("foo Value: " + foo.a);
Bar bar = (Bar)foo;
System.out.println("bar Value: " + bar.a);
/*
* SubClass addFive() //调用的是子类的方法(父类方法被覆盖),子类的a属性值已变化
* foo Value: 3 //父类引用类型的实例,无法引用到子类的同名属性
* bar Value: 13 //强转后可以得到子类的属性引用,其值是一直存在于内存中的,就是说,堆中有两个a属性,一个是父类的,一个是子类的
*/
}
}
class Foos {
public int a;
public Foos() {
a = 3;
}
public void addFive() {
a += 5;
System.out.println("SuperClass addFive()");
}
}
class Bar extends Foos {
public int a;
public Bar() {
a = 8;
System.out.println("SubClass addFive()");
}
public void addFive() {
this.a += 5;
}
}
public static void main(String[] args) {
Foos foo = new Bar();
foo.addFive();
System.out.println("foo Value: " + foo.a);
Bar bar = (Bar)foo;
System.out.println("bar Value: " + bar.a);
/*
* SubClass addFive() //调用的是子类的方法(父类方法被覆盖),子类的a属性值已变化
* foo Value: 3 //父类引用类型的实例,无法引用到子类的同名属性
* bar Value: 13 //强转后可以得到子类的属性引用,其值是一直存在于内存中的,就是说,堆中有两个a属性,一个是父类的,一个是子类的
*/
}
}
class Foos {
public int a;
public Foos() {
a = 3;
}
public void addFive() {
a += 5;
System.out.println("SuperClass addFive()");
}
}
class Bar extends Foos {
public int a;
public Bar() {
a = 8;
System.out.println("SubClass addFive()");
}
public void addFive() {
this.a += 5;
}
}