Java 对于继承的初级理解
概念:继承,是指一个类的定义可以基于另外一个已存在的类,即子类继承父类,从而实现父类的代码的重用。两个类的关系:父类一般具有各个子类共性的特征,而子类可以增加一些更具个性的方法。类的继承具有传递性,即子类还可以继续派生子类,位于上层的类概念更加抽象,位于下层的类的概念更加具体。
1.定义子类:
语法格式
[修饰符] class 子类名 extends 父类名{
子类体
}
修饰符:public private protected default
子类体是子类在继承父类的内容基础上添加的新的特有内容,可以包含成员变量、成员方法、类、接口、构造方法等等。
举个栗子,在一个公司中,雇员是公司聘请的工作人员,经理是管理公司的一种特殊雇员,这类特殊雇员不仅拥有普通雇员的属性和方法,还有属于他自己的一些属性和方法,例如,特殊津贴。
代码如下
public class EmployeeClass{
private String name; // 名字
private int id; //公司编号
private double salary; //薪水
private String department;// 部门
public EmployeeClass(){}
public EmployeeClass(String name,int id,double salary,String department){
this.name = name;
this.id = id;
this.salary = salary;
this.department = department;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public String toString() {
return "EmployeeClass [name=" + name + ", id=" + id + ", salary="
+ salary + ", department=" + department + "]";
}
}
这是雇员类的代码,其中有四个属性,姓名,编号,工资,部门。
public class ManagerClass extends EmployeeClass{
private double specialsalary;
public ManagerClass(){super();}
public ManagerClass(String name,int id,double salary,String department,double specialsalary){
super(name,id,salary,department);
this.specialsalary = specialsalary;
}
public double getSpecialsalary() {
return specialsalary;
}
public void setSpecialsalary(double specialsalary) {
this.specialsalary = specialsalary;
}
@Override
public String toString() {
return super.toString() + "\nspecialsal:" +specialsalary;
}
}
这是子类,经理类,拥有一个自己的属性,特殊津贴。
2.子类对父类成员的可访问特性
子类可以继承父类的成员,但是对父类成员的访问却是由访问特性控制。

父类与子类在一个包中:不能直接访问private,但是我们可以通过具有public访问属性的成员方法来取得 父类的private成员。
父类与子类不在同一个包中:不能直接访问private和默认,但是我们可以通过具有public和protected访问属性的成员方法来取得 父类的private成员。
3.类成员方法的重载与覆盖
当子类中定义的新成员变量的名字与父类中某个成员变量名字相同时,子类会把父类中相应成员变量隐藏起来。
当子类中定义的成员方法的名字与父类中某个成员方法的名字相同时属于成员方法的重载或覆盖。
(1)成员方法的重载
在前面举到的雇员与经理栗子中,我们可以在雇员类中定义一个成员方法
public void setInfo(String name,int id,double salary,String department){
this.name = new String(name);
this.id = id;
this.salary = salary;
this.department = new String(department);
}
在经理类中可以定义为:
public void setInfo(String name,int id,double salary,String department,double specialsalary){
super(name,id,salary,department);
this.specialsalary = specialsalary;
}
这就是成员方法的重载
(2)成员方法的覆盖
通常有两种形式:
①在子类定义的成员方法中,首先调用父类中被覆盖的成员方法,再添加一些操作语句。
②在子类定义的成员方法中,不调用父类覆盖的成员方法,而是重新写一个语句组。这样实现了对父类的完全覆盖。当子类的某项操作与父类对象操作完全不同时,应采取这种方法实现。
栗子:
在object类中有一个判断两个对象是否相等的成员方法equals(),其代码为:
public boolean euqals(Object obj){
return (this == obj);
}
可以看到,这个成员方法是比较两个对象是否同时引用一个对象。
但是我们现在希望能够实现一个比较两个同类型的对象的内容是否相等的功能。所以我们下面设计有了一个复数类,每个复数类由一个实部和虚部组成。设计功能可以比较两个复数是否相等。代码如下:
public class ComplexNumber {
private double re;
private double im;
public ComplexNumber(){re = 0.0;im = 0.0;}
public ComplexNumber(double re,double im){
this.re = re;
this.im = im;
}
public double getRe() {
return re;
}
public void setRe(double re) {
this.re = re;
}
public double getIm() {
return im;
}
public void setIm(double im) {
this.im = im;
}
public boolean equals(Object otherObject){
if(this == otherObject) return true;
if(otherObject == null) return false;
if(getClass() != otherObject.getClass()) return false;
ComplexNumber other = (ComplexNumber)otherObject;
if((re == other.re) && (im == other.im)) return true;
else return false;
}
public String toString(){
String str = "";
if(re != 0) str += re;
if(im == 0) return str;
if( im < 0 ) str += im +"i";
else str += " + " + im +"i";
return str;
}
public static void main(String[] args) {
ComplexNumber c1,c2;
c1 = new ComplexNumber(2,3);
c2 = new ComplexNumber(2,-3.4);
if(c1.equals(c2)){
System.out.println("("+c1+") == ( " + c2 +")" );
}
else{
System.out.println("("+c1+") <> ( " + c2 +")" );
}
}
}
结果为(2.0 + 3.0i) <> ( 2.0-3.4i)
Java 对于继承的初级理解的更多相关文章
- 个人理解java的继承
java的类是属于单继承的.在继承这一块上我本来有一个很大的误区,就是觉得父类中private定义的成员无法被继承.直到网上的大神给我指出private是可以被继承的,会在内存中,只是在子类的对象中不 ...
- Java面向对象㈡ -- 继承与多态
Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆 ...
- java的继承机制
这次我想深入探究以下java里类的继承机制. 我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- Java的继承、封装与多态
Java的继承.封装与多态 基本概念 面向对象OO(Object Oriented):把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象. 对同类对象抽象出共性,即类. 比如人就是一个类 ...
- [ Java学习基础 ] Java的继承与多态
看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
- Java工程师学习指南 初级篇
Java工程师学习指南 初级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...
- Java的继承和多态
看了博客园里面的一个文章,关于java的继承和多态: class A ...{ public String show(D obj)...{ return ("A and D"); ...
随机推荐
- 关于Python中的self
虽然我现在写过一些Python代码,但实际上几乎还没用过Class,而且一直觉得一个很别扭的事情是,Class中的函数都要写个参数self,虽然实例化调用的时候不需要. 当然,一开始就知道Python ...
- 在C# WinForm程序中创建控件数组及相应的事件处理
控件数组是VB提供的一个优秀的设计解决方案,它能很方便快捷的处理大批同类控件的响应和时间处理,但不知为什么在C#中这个优秀特性没有传承下来,甚为可惜,本文将要探讨就是如何在C# WinForm程序实现 ...
- [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...
- 怎样配置Tomcat环境变量
JDK环境变量配置: 假设你的安装JDK在C盘里,如:C:\Program Files\Java\jdk1.6.0_05,那么就在系统变量里(当然也能够在用户变量里)点新建: 变量 ...
- [Javascript] Manipulate the DOM with the classList API
Learn how to add, remove and test for CSS classes using the classList API. It's more powerful than u ...
- [Javascript] Other functor
EventStream: You can use RxJS, BaconJS or any reactive programming lib you want: var id_s = map(func ...
- [Effective C++ --029]为“异常安全”而努力是值得的
假设有个class用来表现夹带背景图案的GUI菜单单,这个class用于多线程环境,所以它有个互斥器(mutex)作为并发控制用: class PrettyMenu{ public: ... void ...
- vs2012调试时为什么会出现clr.dll与mscordacwks.dll版本不匹配
第一次开发wpf程序,就遇到了上述问题,最后发现是因为vs2012默认用的是.net4.5,将版本改为.net4就好了,问题解决
- 终于找到了无毒版的fences1.0(2.0版本要收费的)
今天终于安装了fences1.0,桌面不用那么乱哄哄的啦 我在博客里上传了安装文件,方便大家下载安装,这是无毒的哦,网上有很多都是不能通过病毒检测的. 地址如下:点击这里下载 使用方法: 创建块:安装 ...
- 面试常考的常用数据结构与算法(zz)
数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...