`
lazyee
  • 浏览: 15078 次
社区版块
存档分类
最新评论

类的继承,接口及抽象类

    博客分类:
  • java
阅读更多
一、类的继承
1、什么是类的继承?
类的继承就是某一个类可以通过extends关键字继承另一个类中的方法和属性。
2、为什么要进行类的继承?
有时我们要定义一个新的类,可能会发现这个类中的属性和方法有很大一部分就是我们在另外一个类中定义的全部属性和方法。这时重新再输入一次未免有些费事费力,而使用继承的话,则可以省去这一步。在编程过程中,继承可以为我们省下很多事。
3、继承的语法格式
public class 子类名 extends 父类名{
}
4、在使用继承中应注意的问题
(1)一个子类只可以有一个父类,即单继承
(2)不是父类中所有属性和普通方法都可被子类使用,此时可分两种情况:一、子类与父类在同一个包中:子类可使用除了用private定义以外的所有普通方法与属性。二、子类与父类不在一个包中:子类只可使用父类中用public定义的属性和普通方法。
5、方法的重写
可以在子类中对父类中的方法进行重写,但是访问修饰符,返回值类型,方法名,参数类型,参数名,参数顺序都必须一样。此时用子类对象优先调用的方法是子类的,若没有重写,优先调用的则是父类中的方法。
方法重写后,若想优先调用父类方法,可用:super.方法名();
6、自动转型
用父类类型变量名来引用子类对象,格式一般为:
父类名 对象名 = new 子类名;
自动转型后,用对象名.方法名(),还是优先调用子类中的方法。但需注意,转型后,不可调用子类中独有的方法。

用如下程序进行说明:

//建立一个父类
public class Cars {
 String name;//姓名属性
 //定义获得姓名属性值的方法
 public String getName(){
  return name;
 }
 //定义设置姓名属性值的方法
 public void setName(String name){
  this.name = name;
 }
}

//建立一个Bike子类,继承Cars类
public class Bike extends Cars {

}

//建立一个MotorBike子类,继承Cars类
public class MotorBike extends Cars {

}

//建立一个Person类作为动作的发起者
public class Person {
 String name="我";//定义骑车对象
 //定义获得姓名属性值的方法
 public String getName(){
  return name;
 }
 //定义设置姓名属性值的方法
 public void setName(String name){
  this.name = name;
 }
 //定义骑车方法
 public void rideCars(Cars c){
  System.out.println(getName()+"骑"+c.getName());
 }
}

public class Ride {
//程序的入口函数
 public static void main(String[] args) {
  // 实例化一个Person类对象
  Person p = new Person();
  // 实例化一个电动车对象,并自动转型
  Cars mb = new MotorBike();
  // 设置电动车名字
  mb.setName("MotorBike");
  // 调用骑车方法
  p.rideCars(mb);

  // 实例化一个单车对象,并自动转型
  Cars b = new Bike();
  // 设置单车名字
  b.setName("Bike");
  // 调用骑车方法
  p.rideCars(b);
 }
}
在程序的编写过程中,我发现了一个问题:子类不可继承父类的构造函数,但如果父类中有一个或多个构造方法,那么子类中至少要有一个和父类中构造方法有相同参数的构造方法。


二、 接口
当我们定义一个类时,无非是两种目的:或是实例化生成对象,调用类中的属性和方法;或是作为一个父类被继承。在第二种情况下,有时需要子类重写父类中的所有方法,这就需要用到接口了。
可以借助电脑的USB接口来理解接口的概念,USB接口是已设计好固定好的,但是许多功能不同的设备却可以通过同一个USB接口来与电脑建立连接。也就是说实现了同一个接口的类或接口,可以获得属于这个接口的方法。
1、那么在程序怎样定义一个接口呢?
首先要明确的是,定义接口的关键字是interface。
具体格式如下:
public interface 接口名{
//接口中的属性为常量
public static final 数据类型 常量名=值;
//定义接口中方法(抽象方法)
public [abstract] 返回值数据类型 方法名(数据类型 参数类型,……);
}
从以上的格式可以看出,接口中的方法是没有方法体,也就是说接口中没用任何方法的具体实现,因此,不可用接口直接创建对象。需要注意的是,接口中默认的访问修饰符为public。
2、接口的实现
实现接口的关键字为implements
格式:public class 类名 implements 接口,……{
}
一个类可以实现多个接口,在实现接口时必须实现接口中的所有方法。


三、 抽象类
抽象类是介于类和接口之间的定义,在抽象类中可以有已实现的方法,也可以有像接口中一样没有实现的方法。
1、抽象类定义
关键字:abstract class
格式:public abstract class 抽象类名{
     访问修饰符 数据类型 属性名;
     访问修饰符 类名(数据类型 参数名,……){
  //方法体
}
  访问修饰符 返回值数据类型 方法名(数据类型 参 数名,……){
  //方法名
}
//抽象方法
  访问修饰符 返回值数据类型 abstract方法名(数据类型 参 数名,……);
}
由于抽象类中有抽象方法,自然也就不能直接创建对象。
2、抽象类的继承
用extends关键字实现继承。一个类只能继承一个抽象类,且必须实现抽象类中所有抽象方法。
3、抽象类的应用
有时我们只需用到某个接口的某些而不是全部方法,如果直接实现接口的话就要定义许多空方法。此时,若使用抽象类就可以用哪个方法则重写哪个方法了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics