类的继承
一、类继承的概念
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; (强制转换,将x由Object类转换为当前类型)
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