第3章 类的重用

类的继承

一、类继承的概念

1.已有类定义新类,新类具有已有类所有功能

2.java只支持单继承,每个子类只能有一个直接超类

3.超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化

二、继承的语法

[public] class 子类名 extends 父类名

{

        类体

}

三、访问权限

子类不能访问超类中的私有属性及方法,但是公有和保护属性和方法可以访问

 


隐藏和覆盖
一、属性的隐藏
1.
子类中声明了与超类中相同的成员变量名,子类拥有两个名字相同的变量,称为属性的隐藏
2.
子类执行自己声明的方法,所操作的是它自己声明的变量。子类执行继承自超类的方法,处理的是继承自超类的变量
3.
若一定要用子类自己声明的方法来操作超类的同名属性,则在方法中使用super.变量名访问超类的同名属性
二、方法的覆盖
1.
如果子类无需使用从超类继承来的方法的功能,则可以声明同名方法,称为方法的覆盖
2.
覆盖方法的返回类型、方法名称、参数个数及类型都必须与被覆盖方法一样

3.覆盖方法访问权限可以比被覆盖方法宽松,不能更严格

4.方法覆盖使用的场合:实现相同功能采用不同算法、比超类多出一些方法、取消从超类继承的一些方法

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

6.final方法(终结方法)、static方法(静态方法)不能被覆盖

7.若在子类要调用被覆盖的方法,使用super.被覆盖方法名来访问

 

 

Object

一、概念:

1.所有类的直接或间接的超类

2.包含所有java类的公共属性

二、Object类的主要方法:

1.public final Class getClass():获取当前对象所属类的信息,返回Class对象,用来代表对象所属的类

(1)通过返回的Class对象,可以查询类的各种信息:名字、超类、实现接口的名字等,例如下面代码可以获取未知类名:

void PrintClassName(Object obj)

{

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

}  

2.public String toString():返回表示当前对象本身有关信息的字符串

(1)默认的toString返回的字符串为:类名”+“@”+“此对象哈希码的无符号十六进制表示

(2)如有需要,可以对它进行覆盖,规则为:必须声明为public返回类型为String没有参数方法体中不要使用输出方法即System.out.println()

3.public boolean equals(Object obj):比较两个对象引用是否指向同一对象,是则返回true,反之则false

(1)相等和同一:两个对象具有相同类型、相同属性,则称两个对象相等。两个引用指向同一对象,则称两个引用同一

(2)比较运算符“==”只能用来判断是否同一,不能判断是否相等。默认的equals方法也是用来判断是否同一,而不是是否相等,原型如下:

public boolean equals(Object x)

{

       return this == x;

}

(3)若不想比较是否同一而是想比较两对象是否相等,可以覆盖默认的equals方法:

public boolean equals(Object x)

{

       if(this.getClass()!=x.getClass())           //   if(x instanceof this.getClass()) 

                return false;

        当前类型 a= (当前类型)x;               (强制转换,将xObject类转换为当前类型)

        return   比较this.成员数据==a.成员数据...;

}

(4)补充:比较两个对象是不是同一类型的方法有两种:

if(a.getClass()==b.getClass())          if(a instanceof B.getClass())

4.protected Object clone():复制当前对象,并返回这个副本

(1)若要使用clone方法复制对象,首先要覆盖clone方法,在Object类中被定义为protected,所以需要覆盖为public

(2)实现Cloneable接口,赋予一个类的对象被克隆的能力,例如:

class MyObject implements Cloneable

{

      ...

}

5.public int hashCode():返回该对象的哈希代码值

(1)如果依照equals方法返回值为ture,则在这两个对象上调用hashCode方法应该返回相同整数结果

(2)如果依照equals方法返回值为false,则不要求一定在这两个对象上调用hashCode方法返回值不同

6.protected void finalize() throw Throwable:在对象被回收时执行,通常完成资源释放工作 

(1)如果要覆盖finalize方法,覆盖方法的最后必须调用super.finalize

 

 

终结类与终结方法:

一、终结类

final修饰,不能被继承

二、终结方法

final修饰,不能被子类覆盖

 

 

抽象类

一、概念

1.abstract修饰

2.可以包含常规类任何成员,包括非抽象方法

3.包含抽象方法:用abstract修饰,只有方法原型,没有方法体的实现

4.抽象类是没有具体实例对象的类,不能使用new方法进行实例化,只能用作超类

5.只有当子类实现了抽象超类全部抽象方法,子类才不是抽象类,才能产生实例对象。若子类仍有抽象方法没实现,则子类仍为抽象类

二、抽象类、抽象方法的声明

1.抽象类的声明

abstract class 类名

{

     …

}

2.抽象方法的声明

Public abstract 返回类型 方法名(参数表)

仅有方法原型,没有方法体

只有抽象类能包含抽象方法

 

 

泛型

一、泛型类

声明:

Class GeneralType <泛型标识,例如Type>

{

     Type object;

     Public GeneralType(Typeobject)      //泛型类构造函数

     {

        This.object = object;

     }

     Public Type getObj()

     {

        return object;

     }

}

使用:

GeneralType<int> i=newGeneralType<int>(2);  等等

二、泛型方法

声明:

Class GeneralMethod

{

<泛型标识,例如Type> void printClassName(Type object)
{

     System.out.println(object.getclass.getName());

}

}

使用:

GeneralMethod gm = new GeneralMethod();

gm.printClassName(“hello”);             (得到结果java.lang.String)

三、通配符 ?

声明:

泛型类声明同上

Class ShowType

{

Public void show (GeneralType <?> o)

{

    System.out.println(o.getClass().getName());

}

}

使用:

ShowType st = new ShowType();

GeneralType<int> i=new GeneralType<int>(2)

St.show(i);                             (得到结果java.lang.int)

三、有限制的泛型

1.在泛型标识例如Type后使用extends关键字加上类名或接口名,表明Type所代表类型必须是该类的子类或者实现了该接口,例如<Type extends Number>

2.实现了某接口的有限制泛型,也用关键字extends而不是implements

 

 

类的组合

一、语法

将已存在的类的对象放到新类即可

二、继承与组合的区别

继承:A是一种B

组合:A包含B

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值