Java 继承初探
Java继承的基础
Java中,被继承的类叫做超类,继承超类的类叫子类。(一个子类亦可以是另一个类的超类)
继承一个类,只需要用关键字 extends 把一个类的定义合并到另一个类中就可以了。
例子中创建了一个超类A和一个名为B的子类。
class A { int i,j ; void showij() { System.out.println( "i and j : " + i + " " + j ) ; } } class B extends A { // B类继承了A类 由此B类可以直接使用A类的所有内容 int k ; void showk() { System.out.println("K: " + k ) ; } void sum() { // 因为B继承了A所以可以获得A类中的变量i,j System.out.println("i+j+k: " + (i+j+k)) ; } } public class SimpleInheritance { public static void main(String args[]) { A superOb = new A() ; B subOb = new B() ; superOb.i = 10 ; superOb.j = 20 ; System.out.println("Contents of superOb: ") ; superOb.showij() ; System.out.println() ; subOb.i = 7 ; subOb.j = 8 ; subOb.k = 9 ; System.out.println("Contents of subOb: ") ; subOb.showij() ; // 因为继承A类,所以B类的实例对象可以调用A类的方法 subOb.showk() ; System.out.println() ; System.out.println("Sum of i,j and k in subOb: ") ; subOb.sum() ; } } |
虽然子类包括超类的所有成员,但是子类不能访问超类中被声明为private的成员。
class Box { double width ; double height ; double depth ; Box(Box ob) { width = ob.width ; height = ob.height ; depth = ob.depth ; } Box() { width = -1 ; height = -1 ; depth = -1 ; } Box(double len) { width = height = depth = len ; } double volume() { return width * height * depth ; } } class BoxWeight extends Box { // BoxWeight 继承了Box的所有特征(功能) // 在继承Box类后,子类BoxWeight也可以在不改变Box类的情况下独立完成成员的添加
double weight ; //为自己添加了一个变量成员
BoxWeight (double w , double h , double d , double m ) { width = w ; height = h ; depth = d ; weight = m ; } } public class DemoBoxWeight { public static void main(String args[]) { BoxWeight mybox1 = new BoxWeight(10,20,15,34.3) ; BoxWeight mybox2 = new BoxWeight(2,3,4,0.076) ; double vol ; vol = mybox1.volume() ; System.out.println("Volume of mybox1 is " + vol) ; System.out.println("Weight of mybox1 is " + mybox1.weight) ; System.out.println() ; vol = mybox2.volume() ; System.out.println("Volume of mybox2 is " + vol) ; System.out.println("Weight of mybox2 is " + mybox2.weight) ; System.out.println(); } } |
超类的一个引用变量可以被任何从该超类派生的子类的引用赋值。
理解是引用变量的类型,而不是引用对象的类型;决定了什么成员可以被访问。
也就是说,当一个子类对象的引用被赋给一个超类引用变量时,你只能访问超类定义的对象的那一部分。这就是下例中为什么plainbox不能范文weight的原因,甚至是他引用了一个BoxWeight对象也不行。
因为超类不知道子类增加的属性(反之则知道)。
下例中,Box的引用访问weight域是不可能的,因为Box类没有定义。
class RefDemo { public static void main(String args[]) { // weightbox 是 BoxWeight对象的一个引用, BoxWeight weightbox = new BoxWeight(3,5,7,8.37) ; // plainbox是Box对象的一个引用, Box plainbox = new Box() ; double vol ; vol = weightbox.volume() ; System.out.println("Volume of weightbox is " + vol ) ; System.out.println("Weight of weightbox is " + weightbox.weight) ; System.out.println() ; plainbox = weightbox ; // weightbox的对象引用给plainbox赋值* vol = plainbox.volume() ; System.out.println("Volume of plainbox is " + vol) ; //System.out.println("Weight of plainbox is " + plainbox.weight) ; // 不可以访问 weight,因为在超类中没有赋予Box.plainbox访问的权利 } } |
Java 继承初探的更多相关文章
- Java内部类初探
Java内部类初探 之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结. Java内部类一般可以分为以下三种: 成员内部类 静态内部类 匿名内部类 一.成员内 ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- JAVA继承时构造函数的问题
今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...
- Java继承和接口
接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- Java—继承、封装、抽象、多态
类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- JAVA继承时this和super关键字
JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...
- JAVA 继承中的this和super
学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...
随机推荐
- 编写javascript的基本技巧一
自己从事前端编码也有两年有余啦,时间总是比想象中流逝的快.岁月啊,请给我把时间的 脚步停下吧.不过,这是不可能的,我在这里不是抒发时间流逝的感慨.而是想在这分享两 年来码农生活的一些javascrip ...
- Backbone.js 0.9.2 中文解释
// Backbone.js 0.9.2 // (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely ...
- DataSet取值并保存在List集合中
DBHelper db = new DBHelper(); //实例化DB类 string sql = "select * from student"; //虚构的sql语句 Da ...
- C#LIQN基础知识
- 【C#】 ref out
ref 通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递 ...
- kubernetes 1.3管中窥豹- RS(Replica Sets):the next-generation Replication Controller
前言 kubernates 1.3出了几个新的概念,其中包括deployments,Replica Sets,并且官网称之为是the next-generation Replication Contr ...
- 使用 GPU 加速计算
U-n-i-t-y 提供了 [Compute Shader][link1] 来使得我们可以将大量的复杂重复的计算交给并行的 GPU 来处理,正是由于并行原因,这样就可以大大加快计算的速度,相比在 CP ...
- blog搬家须知
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻. 地址:这里. 不过这里也是会同步更新的
- 洛谷P4724 【模板】三维凸包
题面 传送门 题解 先理一下关于立体几何的基本芝士好了--顺便全都是从\(xzy\)巨巨的博客上抄来的 加减 三维向量加减和二维向量一样 模长 \(|a|=\sqrt{x^2+y^2+z^2}\) 点 ...
- 【spring源码】bean的实例化(转载)
首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. 上一节介绍了Sp ...