7.1类的继承
一个类继承另一的类需要使用关键词extends
class Child extends Parent{}
因为JAVA只支持单继承,即一个类只能有一个父类
子类继承父类子后可以调用父类创建好的属性和方法
所有类的构造方法每一行都有一个隐藏的“super();"作用是在执行该构造方法之前调用其反类的构造方法
7.2 Object类
Object类是比较特殊的类,它的所有类的父亲,是Java类层中的最高层类
在Object类中,主要包括clone(),finalize(),equals(),toString()等方法
下面详细讲述Object类中的几个重要方法。
1. getClass()方法
getClass()方法是Object 类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。语法如下:
getClass().getname();
可以将getClass()方法与toString()方法联合使用。
2.toString()方法
toString()方法的功能是将一个对象返回为字符串形式,它会返回一个String 实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。
7.3对象类型的转换
向上转型:
向上转型可以理解为将子类类型的对象转换为父类类型的对象,其把子类类型的对象直接赋值给父类队形的对象,进而实现按照父类描述此类的效果
向下转型:
向下转型可以理解为将父类类型的对象转化为子类类型的对象,需进行强制类型转化,向下转型是不安全的
列:Dog a=(Dog) new Animal;
子类类型 子类类型 =(子类类型)父类对象;
7.4 使用instanceof关键字判断对象类型
向下转型之前判断父类对象是否为子类对象的实例,这个判断会使用instanceof关键词来完成,可以用它来判断一个实例对象是否属于一个
instanceof的语法格式如下:
myobject instanceof ExampleClass
myobject:某类的对象引用
ExampleClass:某个类
使用instanceof关键词的表达式返回值为布尔值,如果返回值为true,则说明myobject对象为ExampleClass的实例对象,如果返回值为flas说明myobject不是ExampleClass的实例对象
对象名 instanceof 类名(判断该对象是否属于该类或其子类)
7.5方法的重载
方法的重载就是在同一个类中允许存在一个以上的同名方法
没有继承关系,不能比较
方法名相同,参数不同
public class OverLoadTest {
public static int add(int a,int b) {
return a+b;
}
public static double add(double a,double b) {
return a+b;
}
public static int add(int a) {
return a;
}
public static int add(int a,double b) {
return a;
}
public static int add(double a,int b) {
return b;
}
public static void main(String args[]) {
System.out.println("调用add(int,int)方法"+add(1,2));
System.out.println("调用add(double,double)方法"+add(2.1,3.3));
System.out.println("调用add(int)方法"+add(1));
System.out.println("调用add(int,double)方法"+add(5,8.0));
System.out.println("调用add(double,int)方法"+add(5.0,8));
}
}
不定长方法的语法:
返回值 方法名(参数数据类型...参数名称)
public class OverLoadTest2 {
public static int add(int a,int b) {
return a+b;
}
public static double add(double a,double b) {
return a+b;
}
public static int add(int a) {
return a;
}
public static int add(int a,double b) {
return a;
}
public static int add(double a,int b) {
return b;
}
public static int add(int...a) { //定义不定长参数方法
int s=0;
for(int i=0;i<a.length;i++) {
s+=a[i];
}
return s;
}
public static void main(String args[]) {
System.out.println("调用add(int,int)方法"+add(1,2));
System.out.println("调用add(double,double)方法"+add(2.1,3.3));
System.out.println("调用add(int)方法"+add(1));
System.out.println("调用add(int,double)方法"+add(5,8.0));
System.out.println("调用add(double,int)方法"+add(5.0,8));
//调用不定长参数方法
System.out.println("调用不定长参数方法"+add(1,2,3,4,5,6,7,8,9));
System.out.println("调用不定长参数方法"+add(1));
}
}
7.6 final关键字
final变量:
final的关键词可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常,由final定义的变量为常量
final double pl=3.14;
final方法:
将方法定义为final类型,可以防止子类修改父类的定义与实现方式,同时定义为final的方法的执行效率要高于非final
在修饰权限中曾经提到过private 修饰符,如果一个父类的某个方法被设置为private,子类将无法访问该方法,自然无法覆盖该方法。也就是说,一个定义为private 的方法隐式被指定为final类型,因此无须将一个定义为private 的方法再定义为final 类型。
private final void test(){
...//省略一些程序代码
}
final 类:
定义final类不能被继承,如果希望一个类不被任何类继承,并且不允许其他人对这个类进行任何改动,可以将这个类设为final类
final 类名{}
7.7多态
利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理
class Shape{} //图形类
class Square extends Shape{} //正方形继承图形类
class Circular extends Shape{} //圆形继承图形类
public class Demo6 {
public static void draw(Shape s) { //绘制方法
if(s instanceof Square) { //如果是正方形
System.out.println("绘制正方形");
}else if (s instanceof Circular) { //如果的圆形
System.out.println("绘制圆形");
}else { //如果是其他类型
System.out.println("绘制父类图形");
}
}
public static void main(String[]args) {
draw(new Shape());
draw(new Square());
draw(new Circular());
}
}
7.8.1抽象类
抽象方选没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继系。实际上抽象类除了被继承没有任何意义。
public abstract class Parent{
abstract void testAbstract(); //定义抽象方法
只要类中有一个抽象方法,此类就被标记为抽象类。抽象类被继承后需要实现其中所有的抽象方法,也就是保证以相同的方法名称、参数列表和返回值类型创建出非抽象方法,当然也可以是抽象方法。下图说明了抽象类的继承关系。
接口所有方法都是抽象方法修饰符inter face 接口名{}实现implements java语言每个类可以实现多个接口 修饰符 class 类名 implements 接口1,接口2,接口3,.....{} 接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。对于7.8.1节中遗留的问题,可以将draw()方法封装到一个接口中,使需要draw()方法的类实现这个接口,同时也继承图形类,这就是接口存在的必要性。在图7.11中,描述了各个子类继承图形类后使用接口的关系。
7.8.2接口
接口使用 interface 关键字进行定义,其语法如下:
public interface Paintable{
void draw(); //定义接口方法可省略public abstract关键字
}
public:接口可以像类一样被权限修饰符修饰,但public关键字仅限于接口在与其同名的文件中被定义。 interface:定义接口关键字。 Paintable:接口名称。 一个类继承一个父类的同时再实现一个接口,可以写成如下形式:
public class Parallelogram extends Quadrangle implements Paaintable{
...
}
例题7.13
interface Paintable{ //可绘制接口
public void draw(); //绘制抽象方法
}
class Quadrangle{
public void doAnything() {
System.out.println("四边形提供的方法");
}
}
//平行四边形类,继承四边形类,并实现了可绘制接口
class Parallelogram extends Quadrangle implements Paintable{
public void draw() { //由于该类实现了接口,所以需要覆盖draw()方法
System.out.println("绘制平行四边形");
}
}
//正方形类,继承四边形类,并实现了可绘制接口
class Square extends Quadrangle implements Paintable{
public void draw() {
System.out.println("绘制正方形");
}
}
//圆形类,仅实现了可绘制接口
class Circular implements Paintable{
public void draw() {
System.out.println("绘制圆形");
}
}
public class Demo7 {
public static void main(String[]args) {
Square s = new Square();
s.draw();
s.doAnything();
Parallelogram p=new Parallelogram();
p.draw();
p.doAnything();
Circular c=new Circular();
c.draw();
}
}
运行结果如下:
实现多个接口的语法:
class 类名 implements 接口1,接口2,接口3...
一个接口可以继承另一个接口,语法如下:
interface intf1{}
interface intf2 extends intf1{} //接口继承接口