浅谈Java 对于继承的初级理解

 更新时间:2016年06月29日 11:16:40   投稿:jingxian  
下面小编就为大家带来一篇浅谈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.子类对父类成员的可访问特性

子类可以继承父类的成员,但是对父类成员的访问却是由访问特性控制。

www.jb51.net

父类与子类在一个包中:不能直接访问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 对于继承的初级理解全部内容了,希望大家多多支持脚本之家~

相关文章

  • SpringBoot整合Thymeleaf与FreeMarker视图层技术

    SpringBoot整合Thymeleaf与FreeMarker视图层技术

    在目前的企业级应用开发中,前后端分离是趋势,但是视图层技术还占有一席之地。Spring Boot 对视图层技术提供了很好的支持,福安防推荐使用的模板引擎是Thymeleaf,不过想FreeMarker也支持,JSP技术在这里并不推荐使用
    2022-08-08
  • java针对电话号码正则匹配实例

    java针对电话号码正则匹配实例

    这篇文章主要介绍了java针对电话号码正则匹配的方法,涉及java正则匹配与字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • java生成自增编号数字的问题

    java生成自增编号数字的问题

    这篇文章主要介绍了java生成自增编号数字的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Java 的双重分发与 Visitor 模式实例详解

    Java 的双重分发与 Visitor 模式实例详解

    这篇文章主要介绍了Java 的双重分发与 Visitor 模式实例详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Java使用Runnable和Callable实现多线程的区别详解

    Java使用Runnable和Callable实现多线程的区别详解

    这篇文章主要为大家详细介绍了Java使用Runnable和Callable实现多线程的区别之处,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-07-07
  • 关于java.lang.NumberFormatException: null的问题及解决

    关于java.lang.NumberFormatException: null的问题及解决

    这篇文章主要介绍了关于java.lang.NumberFormatException: null的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • IDEA2023.1.3安装教程及下载(图文)

    IDEA2023.1.3安装教程及下载(图文)

    最新变化是在IDEA 2023.1中,对新UI做出了大量改进,本文主要介绍了IDEA2023.1.3安装教程及下载,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java编程中的一些常见问题汇总

    Java编程中的一些常见问题汇总

    这篇文章主要介绍了Java编程中的一些常见问题汇总,本文总结的都是一些Java代码中比较典型的错误,需要的朋友可以参考下
    2014-09-09
  • SpringBoot的HTTPS配置实现

    SpringBoot的HTTPS配置实现

    本文主要介绍了SpringBoot的HTTPS配置实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Maven中pom.xml配置文件详细介绍

    Maven中pom.xml配置文件详细介绍

    这篇文章主要介绍了Maven中pom.xml配置文件详细介绍,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11

最新评论