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总结11:JavaScript的自增自减
1 自增自减 1.1 自增写法i++ 作用:在不参与运算的情况下,i++和++i都是在变量的基础加1 var n1 =123; //n1++ 等价于 n1 = n1 +1; ++n1 //等价于 n1 ...
- Java IO输入输出流 字符数组流 ByteArrayOutputStream/ByteArrayInputStream
private static void StringWriterAndReader() throws Exception { //字符串流(字符串的内存流) //字符串输入流 StringWriter ...
- 20169219 实验四Android程序设计
一.实现Linux下dc的功能,计算后缀表达式的值 public int evaluate(String expr) { int op1, op2, result = 0; String token; ...
- poj3080 Blue Jeans(暴枚+kmp)
Description The Genographic Project is a research partnership between IBM and The National Geographi ...
- 「HNOI2013」切糕
题目链接 戳我 \(Solution\) 对于这道题,我们首先来看看没有\(D\)这个约束的该如何做. 我们考虑构造最小割模型. 其实直接贪心就好了,选出每条路径上的最小值就好了(路径就是将每层的同一 ...
- 复制构造函数被调用的三种情况------新标准c++程序设计
1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...
- hbase0.92 数据修复
现有集群环境:8台region server.1台master server 早晨重启某一region server后,该server的region全部下线未恢复. 重启前 hbase(main):0 ...
- saltstack平台基础
saltstack概述saltstack是基于python开发的一套C/S架构配置管理工具,使用SSL证书签方的方式进行认证管理底层使用ZeroMQ消息队列pub/sub方式通信 号称世界上最快的 ...
- 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型?
最近要为公司的消息队列中间件进行选型,市面上相关的开源技术又非常多,如ActiveMQ.RabbitMQ.ZeroMQ.Kafka,还有阿里巴巴的RocketMQ等. 这么多技术,如何进行选型呢? 首 ...
- Win7下C/C++跨平台开发工具IDE的安装之CodeBlocks
1. Win7下安装CodeBlocks: 下载带有mingw的CodeBlocks:http://www.codeblocks.org/downloads/26#windows 运行所下载程序: 点 ...