-
1.class Foo { 2. public int a; 3. 4. public Foo() { 5. a = 3; 6. } 7. 8. public int addFive() { 9. a += 5; 10. return a; 11. } 12. 13. public int getA() { 14. return a; 15. } 16.} 17. 18.public class Bar extends Foo { 19. public int a; 20. 21. public Bar() { 22. a = 8; 23. } 24. 25. public int addFive() { 26. this.a += 5; 27. return a; 28. } 29. 30. public int getA() { 31. return a; 32. } 33. 34. public static void main(String[] args) { 35. Foo foo = new Bar(); //foo.a=3,bar.a=8 36. //调用的是子类中的方法 37. System.out.println(foo.getA()); 38. //直接调用父类中的a 39. System.out.println("Value: " + foo.a); //foo.a=3,bar.a=13 40. //调用的是子类中的方法 41. System.out.println(foo.addFive()); //bar.a=8+5 42. 43. } 44.}
父类中的a和子类中的a是两个不同的成员变量,同时存在的,不会出现覆盖的现象。
输出结果:
8
Value: 3
13
楼主,只需要明白一点就行了:在Java中重写指的是方法的重写,而不是属性的重写,还有多态也只是方法的多态 ,没有属性的多态。
注意:这句 Foo foo = new Bar();创建了一个Bar对象
一个对象创建的过程分成4步:
1.分配总空间
2.递归创建父类对象
3.调用本类构造方法
4.初始化本类属性;
还有第2点 其实是创建了父类的属性和方法,并没有创建父类对象,用人们的眼光来把它
单独拿出来看,像是创建了父类对象似的;
父类的除private方法以外的方法都被子类所继承.并且覆盖但是属性却没有被覆盖,所以foo.a 访问的是父类的 属性,而 foo.addFive(); 调用的是子类覆盖父类的 addFive()方法,既然调用的是子类的方法,所以这个方法修改的是子类属性的值
其实去看Debug View的内存树会比较清楚
在子类中调用父类同名属性可以这样写super.a
---------------------------
class Base{ public int a; public static int b; public Base(){ a=1; b=1; } public void addFivetoa(){ a+=5; } public static void addSixtob(){ b+=6; } } public class Son extends Base{ //public int a; //public static int b; public Son(){ a=2; b=2; } public void addFivetoa(){ a+=5; } public static void addSixtob(){ b+=6; } public static void main(String args[]){ Son son = new Son(); Base base = son; base.addFivetoa(); base.addSixtob(); System.out.println(base.a);//7 System.out.println(base.b);//8 System.out.println(son.a);//7 System.out.println(son.b);//8 } } 过程:先初始化Base的b为0,然后调用父类的构造方法初始化a=1,b=1,然后调用Son的构造方法初始化a=2,b=2; base.addFivetoa();//a=7;调用的子类的 base.addSixtob();//b=8;调用的父类的 属性是不能多态的,静态方法也不能多态。 图示: [img] http://dl.iteye.com/upload/attachment/146753/1c112269-254f-3f9e-9bd4-afa547d99cd3.jpg[/img] 衍生: Java代码 class Base{ public int a; public static int b; public Base(){ a=1; b=1; } public void addFivetoa(){ a+=5; } public static void addSixtob(){ b+=6; } } public class Son extends Base{ public int a; public static int b; public Son(){ a=2; b=2; } public void addFivetoa(){ a+=5; } public static void addSixtob(){ b+=6; } public static void main(String args[]){ Son son = new Son(); Base base = son; base.addFivetoa(); base.addSixtob(); System.out.println(base.a);//1 System.out.println(base.b);//7 System.out.println(son.a);//7 System.out.println(son.b);//2 } }
class Base{
public int a;
public static int b;
public Base(){
a=1;
b=1;
}
public void addFivetoa(){
a+=5;
}
public static void addSixtob(){
b+=6;
}
}
public class Son extends Base{
//public int a;
//public static int b;
public Son(){
a=2;
b=2;
}
public void addFivetoa(){
a+=5;
}
public static void addSixtob(){
b+=6;
}
public static void main(String args[]){
Son son = new Son();
Base base = son;
base.addFivetoa();
base.addSixtob();
System.out.println(base.a);//7
System.out.println(base.b);//8
System.out.println(son.a);//7
System.out.println(son.b);//8
}
}
过程:先初始化Base的b为0,然后调用父类的构造方法初始化a=1,b=1,然后调用Son的构造方法初始化a=2,b=2;
base.addFivetoa();//a=7;调用的子类的
base.addSixtob();//b=8;调用的父类的
属性是不能多态的,静态方法也不能多态。
图示:
[img] http://dl.iteye.com/upload/attachment/146753/1c112269-254f-3f9e-9bd4-afa547d99cd3.jpg[/img]
衍生:
Java代码
class Base{
public int a;
public static int b;
public Base(){
a=1;
b=1;
}
public void addFivetoa(){
a+=5;
}
public static void addSixtob(){
b+=6;
}
}
public class Son extends Base{
public int a;
public static int b;
public Son(){
a=2;
b=2;
}
public void addFivetoa(){
a+=5;
}
public static void addSixtob(){
b+=6;
}
public static void main(String args[]){
Son son = new Son();
Base base = son;
base.addFivetoa();
base.addSixtob();
System.out.println(base.a);//1
System.out.println(base.b);//7
System.out.println(son.a);//7
System.out.println(son.b);//2
}
}
过程:先初始化Base的b为0,然后调用父类的构造方法初始化a=1,b=1,然后调用Son的构造方法初始化子类中的a和b,a=2,b=2;
base.addFivetoa();//调用子类的方法,son.a=7
base.addSixtob();//调用父类的方法,base.b=1+6=7
剩下的base.a和son.b都没有变化所以分别为1,2。
其中加粗红色的1是父类的b的值,base.addSixtob()(是静态的)所以要调用addSixtob()所在类base的b的值也就是,或者说是base对象调用了addSixtob(),所以要访问base对象所在类的b值。
--static静态方法不能重写,所以调用父类,父类b值发生改变。
相关推荐
在Qt5中,类的继承关系是其核心部分,因为它定义了组件之间的层次结构,使得代码重用和模块化成为可能。"Qt5类继承关系图"是一个重要的参考资料,它直观地展示了Qt5库中各个类之间的关系,有助于开发者理解和使用Qt5...
【Java面向对象之继承练习题】的解析与详解: 1. **类的继承**:在Java中,继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个`Music`类作为其他音乐相关...
根据给定的信息,我们可以深入探讨C++中的抽象类与继承机制。下面将详细介绍如何通过抽象类和继承在C++中实现特定的功能。 ### 概述 在这个示例中,我们有三个具体的类:`Student`、`Lecture` 和 `Module`,它们都...
在Java编程语言中,继承是面向对象特性之一,它允许我们创建一个类(子类或派生类)作为现有类(父类或基类)的扩展。这种设计模式有助于代码重用,使得子类可以继承父类的属性和方法,并且可以添加新的功能或覆盖已...
在C#编程中,"继承窗体的设计"是面向对象编程的一个重要概念,它允许我们创建一个新的窗体类,该类基于已有的窗体类,从而可以复用和扩展功能。这种方式大大提高了代码的可重用性和可维护性。本文将深入探讨C#中继承...
"WPF窗口直接类继承"这个主题涉及到的是如何通过继承自定义窗口类,以实现更灵活和模块化的代码结构。 在标准的WPF应用中,窗口通常由`System.Windows.Window`类创建。然而,当项目变得复杂,多个窗口需要共享相同...
在C++编程语言中,继承和派生是面向对象编程的重要概念,它们允许我们构建复杂的类层次结构,实现代码重用和多态性。在这个“C++程序设计 继承与派生实验(二)”中,我们将深入探讨这三个关键知识点:类的派生与...
本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...
QT类继承图是Qt框架中的一个重要组成部分,它展示了Qt库中各类之间的层次结构,帮助开发者理解和使用Qt的各种组件。在编程领域,类继承是面向对象编程的一个核心概念,通过继承,一个类(子类)可以获取另一个类...
【C++编程思想--多重继承】 多重继承是C++中的一种特性,允许一个类可以从多个基类中继承属性和行为,从而实现代码复用和设计灵活性。这种机制使得类能够结合多个基类的功能,但同时也引入了一些复杂性和潜在的问题...
其中,“组合优于继承”是一条广为流传的原则,意味着在设计软件时,我们应该优先考虑使用组合(Composition)而不是继承(Inheritance)。这条原则的提出主要是为了解决继承带来的潜在问题,如代码的可维护性、可...
"C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...
在Windows Presentation Foundation(WPF)中,创建可继承的窗体是一种常见的做法,尤其是在开发大型应用时,可以提高代码的重用性和维护性。标题"**WPF可继承窗体**"指的是如何设计一个基本的WPF窗口,使其能够作为...
在Java编程语言中,`extends`关键字用于实现类的继承机制。类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`...
在Java编程语言中,类的继承是面向对象编程的一个核心概念。这个实例是关于如何在超市购物场景下应用继承机制的。在这个系统中,我们有以下几个关键类:`ShoppingCar`(购物车)、`Database`(数据库)、`McBean`...
实验报告的主题是“C++实验五 继承与派生的应用”,主要涵盖了C++面向对象编程中的核心概念,包括继承和派生。本实验旨在帮助学生深入理解和掌握以下几个关键知识点: 1. **继承和派生的含义**:继承是面向对象编程...
在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和方法,从而实现了代码的重用和扩展。多态则是指同一种行为在不同对象上表现...
"C++面向对象程序设计习题继承与派生.pdf" 继承是面向对象程序设计中的一种重要机制,它允许一个类继承另一个类的属性和行为特征。通过继承,新类可以从现有类中获得特征,从而达到代码复用的目的。在C++中,继承...
标题“14 继承(一)(整个继承树映射到一张表)”揭示了我们今天将探讨的主题——如何在数据库中通过ORM(对象关系映射)工具如Hibernate处理类的继承关系。 在Hibernate中,当一个类继承体系映射到数据库时,有几种...
### C++继承与派生详解 #### 5.1 继承与派生的概念 **5.1.1 为什么要使用继承** 继承是面向对象编程中的一个核心概念,它允许新类从现有类那里获得其属性和行为。这种机制不仅提高了代码的复用性,还增强了软件的...