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时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...
随机推荐
- Appium移动端自动化测试之元素定位(三)
1.name定位 driver.find_element_by_id(') driver.find_element_by_id(') driver.find_element_by_name('登录') ...
- oracle数据库列的操作
本章和大家分享一下如何在数据库中进行列的一些相关操作. 1.增加列名 (我们先来看一个原始版本) 下面我们增加一个列名tel 记住,增加列时需要把列对应的数据类型要说明,不然会报错. alter t ...
- GlobalAlloc()和malloc()、HeapAlloc()
两者都是在堆上分配内存区. malloc()是C运行库中的动态内存分配函数,WINDOWS程序基本不使用了,因为它比WINDOWS内存分配函数少了一些特性,如,整理内存. GlobalAlloc( ...
- bzoj 3224/Tyvj 1728 普通平衡树(splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- Matrix和Camera配合实现3D效果
一.Camera与Matrix简单介绍 1.Camera Android中一共有两个Camera,分别为:android.graphics.Camera android.hardware.Camera ...
- struts2中错误提示:There is no Action mapped for namespace / and action name
当在struts2中运行时出现如上所述错误时: 1.在src目录下创建struts.xml一定要注意拼写 2.struts.xml文件中引入和extend是否正确 3.在web.xml 中<we ...
- android studio中使用recyclerview小白篇(三)
继续接着昨天的来,昨天终于弄好了一个例子,但是那个没有点击事件, 需要自己添加,参照别人的例子,弄了个比较简单的,主要是改动myRecycleradatper.java中的部分. 增加如下的接口: / ...
- 21天学通C++学习笔记(四):数组和字符串
1. 数组 概念 是一组元素 这些元素是相同的数据类型 按顺序存储到内存中 目的是避免在业务需要时去重复声明很多同类型的变量 初始化 分别初始化:int i [5] = {1,2,3,4,5}; 全部 ...
- html5 video使用autoplay属性时,声音混乱
html5 video使用autoplay属性时,声音混乱 页面代码 Index.html <html xmlns="http://www.w3.org/1999/xhtml" ...
- 题解 P1720 【月落乌啼算钱】
题目链接 定义一个函数比较好求. #include<bits/stdc++.h>//万能头文件 using namespace std; double F(int x)//定义函数,为了保 ...