`
ticojj
  • 浏览: 157625 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

继承

    博客分类:
  • java
 
阅读更多
  1. 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  
}  
}  

 

0 0

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中,类的继承关系是其核心部分,因为它定义了组件之间的层次结构,使得代码重用和模块化成为可能。"Qt5类继承关系图"是一个重要的参考资料,它直观地展示了Qt5库中各个类之间的关系,有助于开发者理解和使用Qt5...

    Java面向对象之继承练习题.doc

    【Java面向对象之继承练习题】的解析与详解: 1. **类的继承**:在Java中,继承是面向对象编程的重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法。例如,我们可以创建一个`Music`类作为其他音乐相关...

    c++抽象类继承

    根据给定的信息,我们可以深入探讨C++中的抽象类与继承机制。下面将详细介绍如何通过抽象类和继承在C++中实现特定的功能。 ### 概述 在这个示例中,我们有三个具体的类:`Student`、`Lecture` 和 `Module`,它们都...

    Java 实现继承实例代码

    在Java编程语言中,继承是面向对象特性之一,它允许我们创建一个类(子类或派生类)作为现有类(父类或基类)的扩展。这种设计模式有助于代码重用,使得子类可以继承父类的属性和方法,并且可以添加新的功能或覆盖已...

    继承窗体的设计C#源码

    在C#编程中,"继承窗体的设计"是面向对象编程的一个重要概念,它允许我们创建一个新的窗体类,该类基于已有的窗体类,从而可以复用和扩展功能。这种方式大大提高了代码的可重用性和可维护性。本文将深入探讨C#中继承...

    WPF窗口直接类继承

    "WPF窗口直接类继承"这个主题涉及到的是如何通过继承自定义窗口类,以实现更灵活和模块化的代码结构。 在标准的WPF应用中,窗口通常由`System.Windows.Window`类创建。然而,当项目变得复杂,多个窗口需要共享相同...

    c++程序设计 继承与派生实验(二)

    在C++编程语言中,继承和派生是面向对象编程的重要概念,它们允许我们构建复杂的类层次结构,实现代码重用和多态性。在这个“C++程序设计 继承与派生实验(二)”中,我们将深入探讨这三个关键知识点:类的派生与...

    java基础继承封装多态

    本资源摘要信息将对 Java 基础知识点进行总结,涵盖继承、封装、多态等概念,并对面向对象的设计、数据库设计模式等进行讲解。 继承 继承是 Java 中的一种机制,允许一个类继承另一个类的属性和方法。继承的语法是...

    QT类继承图

    QT类继承图是Qt框架中的一个重要组成部分,它展示了Qt库中各类之间的层次结构,帮助开发者理解和使用Qt的各种组件。在编程领域,类继承是面向对象编程的一个核心概念,通过继承,一个类(子类)可以获取另一个类...

    C++编程思想--多重继承

    【C++编程思想--多重继承】 多重继承是C++中的一种特性,允许一个类可以从多个基类中继承属性和行为,从而实现代码复用和设计灵活性。这种机制使得类能够结合多个基类的功能,但同时也引入了一些复杂性和潜在的问题...

    10丨理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?1

    其中,“组合优于继承”是一条广为流传的原则,意味着在设计软件时,我们应该优先考虑使用组合(Composition)而不是继承(Inheritance)。这条原则的提出主要是为了解决继承带来的潜在问题,如代码的可维护性、可...

    C++类继承内存布局详解图(一目了然)

    "C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...

    WPF可继承窗体

    在Windows Presentation Foundation(WPF)中,创建可继承的窗体是一种常见的做法,尤其是在开发大型应用时,可以提高代码的重用性和维护性。标题"**WPF可继承窗体**"指的是如何设计一个基本的WPF窗口,使其能够作为...

    Java中extends类的继承

    在Java编程语言中,`extends`关键字用于实现类的继承机制。类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`...

    关于超市购物的java类的继承实例。

    在Java编程语言中,类的继承是面向对象编程的一个核心概念。这个实例是关于如何在超市购物场景下应用继承机制的。在这个系统中,我们有以下几个关键类:`ShoppingCar`(购物车)、`Database`(数据库)、`McBean`...

    C++实验五 继承与派生的应用 课程 实验报告

    实验报告的主题是“C++实验五 继承与派生的应用”,主要涵盖了C++面向对象编程中的核心概念,包括继承和派生。本实验旨在帮助学生深入理解和掌握以下几个关键知识点: 1. **继承和派生的含义**:继承是面向对象编程...

    C++继承与多态例子

    在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和方法,从而实现了代码的重用和扩展。多态则是指同一种行为在不同对象上表现...

    C++面向对象程序设计习题继承与派生.pdf

    "C++面向对象程序设计习题继承与派生.pdf" 继承是面向对象程序设计中的一种重要机制,它允许一个类继承另一个类的属性和行为特征。通过继承,新类可以从现有类中获得特征,从而达到代码复用的目的。在C++中,继承...

    14 继承(一)(整个继承树映射到一张表)

    标题“14 继承(一)(整个继承树映射到一张表)”揭示了我们今天将探讨的主题——如何在数据库中通过ORM(对象关系映射)工具如Hibernate处理类的继承关系。 在Hibernate中,当一个类继承体系映射到数据库时,有几种...

    C++继承与派生

    ### C++继承与派生详解 #### 5.1 继承与派生的概念 **5.1.1 为什么要使用继承** 继承是面向对象编程中的一个核心概念,它允许新类从现有类那里获得其属性和行为。这种机制不仅提高了代码的复用性,还增强了软件的...

Global site tag (gtag.js) - Google Analytics