接着前面的学习:

java学习笔记5--类的方法

java学习笔记4--类与对象的基本概念(2)

java学习笔记3--类与对象的基本概念(1)

java学习笔记2--数据类型、数组

java学习笔记1--开发环境平台总结

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note6.html,转载请注明源地址。

1、类的继承

一种由已有的类创建新类的机制,是面向对象程序设计的基石之一。通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能

Java只支持单继承,每个子类只能有一个直接父类,父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化,继承机制可以提高程序的抽象程度,提高代码的可重用性

基类(base class),也称超类(superclass),是被直接或间接继承的类

派生类(derived-class),也称子类 (subclass),继承其他类而得到的类,继承所有祖先的状态和行为。派生类可以增加变量和方法,派生类也可以覆盖(override)继承的方法

子类对象与父类对象存在“IS A”(或“is kind of”)的关系

派生类产生的对象,从外部来看,它应该包括与基类相同的接口,可以具有更多的方法和数据成员,其内包含着一个基类类型的子对象

继承的语法:
class childClass extends parentClass {//类体
}

举个例子:

在一个公司中,有普通员工(Employees)及管理人员(Magagers)两类人员:

职员对象(Employees)可能有的属性信息包括:

–员工号(employeeNumber)

–姓名(name)

–地址(address)

–电话号码(phoneNumber)

管理人员(Managers)除具有普通员工的属性外,还可能具有下面的属性:

–职责(responsibilities)

–所管理的职员(listOfEmployees)

Employee与Manager的类图:

//父类Employee
class Employee
{    int  employeeNumbe ;String  name, address, phoneNumber ;
}
//子类Manager
class  Manager extends Employee
{//子类增加的数据成员
    String responsibilities, listOfEmployees;
}

设有三个类:Person, Employee, Manager。其类层次如图:

public class Person {public String name;public String getName() { return name; }
}
public class Employee extends Person { public int employeeNumber; public int getEmployeeNumber() { return employeeNumber; }
}
public class Manager extends Employee { public String responsibilities; public String getResponsibilities() { return responsibilities;}
}

测试程序:

public class Test {public static void main(String args[]){Employee li = new Employee(); li.name = "Li Ming"; li.employeeNumber = 123456; System.out.println(li.getName());System.out.println(li.getEmployeeNumber()); Manager he = new Manager(); he.name = "He Xia"; he.employeeNumber = 543469;           he.responsibilities = "Internet project"; System.out.println(he.getName()); System.out.println(he.getEmployeeNumber());System.out.println(he.getResponsibilities());}
}

运行结果:

Li Ming

123456

He Xia

543469

Internet project

说明:子类不能直接访问从父类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问,如下例所示:

public class B { public int a = 10; private int b = 20; protected int c = 30; public int getB() { return b; }
}
public class A extends B { public int d; public void tryVariables() { System.out.println(a);             //允许 System.out.println(b);             //不允许System.out.println(getB());        //允许 System.out.println(c);             //允许
    }
}

隐藏和覆盖

子类对从父类继承来的属性变量及方法可以重新定义,来看一个简单的例子:

class Parent {Number aNumber;
}
class Child extends Parent {Float aNumber;
}

属性的隐藏:

子类中声明了与父类中相同的成员变量名,则从父类继承的变量将被隐藏

子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明,当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量

如何访问被隐藏的父类属性?

调用从父类继承的方法,则操作的是从父类继承的属性,使用super.属性

属性的隐藏举例:

class A1
{int x = 2;    public void setx(int i){    x = i;}void printa(){System.out.println(x);}
}
class B1 extends A1
{int x = 100;void printb() {super.x = super.x + 10 ;System.out.println("super.x= " + super.x + "  x= " + x);}
}

测试程序:

public class Test
{public static void main(String[] args){A1 a1 = new A1();  a1.setx(4);   a1.printa();B1 b1 = new B1();     b1.printb();     b1.printa();  b1.setx(6);  // 将继承来的x值设置为6
      b1.printb();     b1.printa();a1.printa();}
}

运行结果:

4

super.x= 12  x= 100

12

super.x= 16  x= 100

16

4

子类不能继承父类中的静态属性,但可以对父类中的静态属性进行操作。如在上面的例子中,将“int x = 2;”改为“static int x = 2;”,再编译及运行程序,会得到下面的结果

方法覆盖

如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖。覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一摸一样

只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法,覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格

方法覆盖的应用场合:

  • 子类中实现与父类相同的功能,但采用不同的算法或公式

  • 在名字相同的方法中,要做比父类更多的事情

  • 在子类中需要取消从父类继承的方法

必须覆盖的方法

派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类.

不能覆盖的方法

基类中声明为final的终结方法

基类中声明为static 的静态方法

调用被覆盖的方法

super.overriddenMethodName();

有继承时的构造方法遵循以下的原则:

子类不能从父类继承构造方法

好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字

如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方法)

举一个例子:

public class Person
{ protected String name, phoneNumber, address; public Person() { this("", "", "");} public Person(String aName, String aPhoneNumber, String anAddress) { name=aName; phoneNumber=aPhoneNumber; address=anAddress;}
}
public class Employee extends Person
{ protected int employeeNumber; protected String workPhoneNumber; public Employee(){ //此处隐含调用构造方法 Person()  this(0, "");}   public Employee(int aNumber, String aPhoneNumber){ //此处隐含调用构造方法 Person() employeeNumber=aNumber; workPhoneNumber = aPhoneNumber;}
}
public class Professor extends Employee
{ protected String research;      public Professor(){ super();  research = "";       } public Professor(int aNumber, String aPhoneNumber, String aResearch) { super(aNumber, aPhoneNumber); research = aResearch; }
}

2、Object类

Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点,包含了所有Java类的公共属性,其构造方法是Object( )

Object类定义了所有对象必须具有的状态和行为,较主要的方法如下

–public final Class getClass()

获取当前对象所属的类信息,返回Class对象

–public String toString()

返回当前对象本身的有关信息,按字符串对象返回

–public boolean equals(Object obj)

比较两个对象是否是同一对象,是则返回true

–protected Object clone( )

生成当前对象的一个拷贝,并返回这个复制对象

–Public int hashCode()

返回该对象的哈希代码值

–protected void finalize() throws Throwable

定义回收当前对象时所需完成的资源释放工作

你的类不可以覆盖终结方法,即有final修饰的方法

相等和同一的概念

两个对象具有相同的类型,及相同的属性值,则称二者相等(equal)

如果两个引用变量指向的是同一个对象,则称这两个变量(对象)同一(identical)

两个对象同一,则肯定相等;两个对象相等,不一定同一

比较运算符“==” 判断的是这两个对象是否同一

//判断两个对象是否同一
public class test{public static void main(String args[]){BankAccount a = new BankAccount("Bob", 123456, 100.00f); BankAccount b = new BankAccount("Bob", 123456, 100.00f); if (a == b) System.out.println("YES"); else System.out.println("NO");}
}

equals 方法

由于Object是类层次结构中的树根节点,因此所有其他类都继承了equals()方法。Object类中的 equals() 方法的定义如下,可见,也是判断两个对象是否同一

public boolean equals(Object x) { return this == x;
}

Object类中equals方法的使用举例:

public class EqualsTest{public static void main(String args[]){BankAccount a = new BankAccount("Bob", 123456, 100.00f); BankAccount b = new BankAccount("Bob", 123456, 100.00f); if (a.equals(b))System.out.println("YES"); else System.out.println("NO");}
}

在BankAccount类中增加equals方法,由于是对Object类中的equals方法进行重写,因此方法定义头必须与Object类中的equals方法完全相同

public boolean equals(Object x) { if (this.getClass() != x.getClass()) return false;      BankAccount b = (BankAccount)x;     return ((this.getOwnerName().equals(b.getOwnerName())) &&(this.getAccountNumber() == b.getAccountNumber())&&(this.getBalance() == b.getBalance()));
}

equals方法的应用举例:

public class Apple { private String color; private boolean ripe;  public Apple(String aColor, boolean isRipe) { color = aColor; ripe = isRipe; }      public void setColor(String aColor) { color = aColor;  }      public void setRipe(boolean isRipe) { ripe = isRipe; }     public String getColor() { return color; }     public boolean getRipe() { return ripe; }public String toString() { if (ripe)  return("A ripe " + color + " apple"); else  return("A not so ripe " + color + " apple"); } public boolean equals(Object obj) { if (obj instanceof Apple) { Apple a = (Apple) obj; return (color.equals(a.getColor()) && (ripe == a.getRipe())); } return false; }
}

运行结果:

A ripe red apple is equal to A ripe red apple: true

a is identical to b: false

A ripe red apple is equal to A ripe red apple: true

a is identical to c: true

Clone方法

根据已存在的对象构造一个新的对象; 在根类Object 中被定义为protected,所以需要覆盖为public; 实现Cloneable 接口,赋予一个对象被克隆的能力(cloneability)

class MyObject implements Cloneable
{  //…

}

finalize方法

在对象被垃圾回收器回收之前,系统自动调用对象的finalize方法; 如果要覆盖finalize方法,覆盖方法的最后必须调用super.finalize

getClass方法

final 方法,返回一个Class对象,用来代表对象隶属的类

通过Class 对象,你可以查询Class对象的各种信息:比如它的名字,它的基类,它所实现接口的名字等。

void PrintClassName(Object obj) {System.out.println("The Object's class is " + obj.getClass().getName());
}

notify、notifyAll、wait方法

final方法,不能覆盖,这三个方法主要用在多线程程序中

参考资料:

《java程序设计》--清华大学

作者:wuyudong
出处:http://www.cnblogs.com/wuyudong/

java学习笔记6--类的继承、Object类相关推荐

  1. java学习笔记(13) 第13章 - 常用类

    第13 章常用类-目录 13.1 包装类 13.1.1 包装类的分类.包装类和基本数据的转换.案例演示.课堂测试 13.1.2 包装类型和String 类型的相互转换 13.1.3 Integer 类 ...

  2. JAVA学习笔记--类型转换(父类子类 Object 基本类型 String) 拆装箱 包装类

    最近一段时间忙着学习JAVA,本来net学的也不怎么好,趁着这个机会转下方向学习JAVA.不过.NET core的开源还是有点搞头的,微软了解一下.接下来几天我也会陆续写一些内容关于线程和集合等方面, ...

  3. java学习笔记13:正则表达式、System类、Date类、Calendar类

    一.正则表达式 1.概述:是指一个用来描述或者匹配一系列符合某个句法规则的字符串:其实就是一种规则,有自己特殊的应用. 2.正则表达式的组成规则 (1).字符 表达式 代表含义 x 字符 x.举例:' ...

  4. Java学习笔记(六)--字符串String类

    文章目录 字符串 一.String 类 1.1 声明字符串 1.2 创建字符串 二.连接字符串 2.1 连接多个字符串 2.2 连接其他数据类型 三.获取字符串信息 3.1 获取字符串长度 3.2 字 ...

  5. 2022年Java学习笔记目录

    一.2022年Java任务驱动课程 任务驱动,统摄知识点:2022年Java程序设计讲课笔记 二.2022年Java学习笔记 (一)踏上Java开发之旅 Java学习笔记1.1.1 搭建Java开发环 ...

  6. Java学习笔记类对象多态继承(下)

    面向对象(下) 1.类的继承 一.什么是继承,有什么用? 继承:在现实世界当中也是存在的,例如:父亲很有钱,几子不用努力也很有钱 继承的作用: 基本作用:子类继承父类,代码可以得到复用.(这个不是重要 ...

  7. Java学习笔记3——继承

    继承 继承的好处:子类拥有父类的所有属性和方法,peivate修饰的无效:实现代码复用 class 子类 extends 父类 例如: class Dog extends Animal{...... ...

  8. 21天学通Java学习笔记-Day01

    21天学通java 中文第6版 下载地址:点击打开链接 Day01: 命令行查看和设置classpath: 查看:echo %classpath% 设置:set classpath = %classp ...

  9. (JAVA学习笔记) 类的继承,super,方法的重写,多态

    文章目录 类的继承,super,方法的重写,多态 1.类的继承 代码演示: 2.super和this 代码演示: 3.方法的重写 代码演示: 4.多态 代码演示: 类的继承,super,方法的重写,多 ...

最新文章

  1. C语言如何实现随机打印24个母,菜鸟求助,写一个随机输出26个英文字母的程序...
  2. 常用24个方法有效优化ASP.NET的性能
  3. java mutilcatch_Java 7异常新特性之mutilcatch
  4. 转 carrer 之感
  5. ThreadPoolTaskExecutor和ThreadPoolExecutor区别
  6. 《[深入浅出 C#] (第3版)》 - 学习笔记
  7. 使用Vscode进行Python开发环境配置
  8. 并发编程应用场景_linux网络编程之select函数的并发限制和poll函数应用举例
  9. redis 经纬度_Redis 中的 GEO(地理信息)类型
  10. 虚拟机14.00和CentOS7安装全部过程(百度网盘安装包)
  11. ftp服务器查看所有文件夹,查看ftp服务器所有文件夹
  12. 初中计算机课件flash,初中数学flash课件(共100个)
  13. 升压IC可提升白光LED的电池电压
  14. 数据分析报告编写规范
  15. 用户访问网站的原理及流程
  16. Android利用zxing生成二维码
  17. 电路交换(Circuit Switching)
  18. 学习post抓包最好用的抓包工具
  19. 二维码怎么制作?看完这篇你就会了
  20. 云服务ftp服务器搭建_在阿里云服务器搭建FTP服务器,在本地电脑连接并操作

热门文章

  1. vue-router参数传递
  2. 巨头都在争抢无人驾驶 这家智慧停车公司却先上了路 科技事务 百家号 08-14 15:55 今年来,互联网巨头在智慧交通领域动作频频,4月初,百度提出雄心勃勃的“阿波罗计划”,宣布开放自动驾驶平台以
  3. 我的征程是未来!带你展望2015年最重要的网页设计趋势
  4. 99%创业会失败 去中心化是良药么?
  5. 学习笔记Hadoop(七)—— Hadoop集群的安装与部署(4)—— 配置Hadoop集群
  6. 爬虫学习笔记(二十四)—— pyspider框架
  7. maven 私服的使用及settings.xml的配置
  8. mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
  9. 艾宾浩斯记忆表格excel_好的记忆方法是一切学习的关键(艾宾浩斯记忆法)
  10. android4.4.2fragment不显示,Android应用中使用Fragment组件的一些问题及解决方案总结...