7.1 类的封装
实现封装的具体步骤如下:
(1) 修改属性的可见性来限制对属性的访问(通常设置为private)。
(2) 为每个属性创建一对赋值方法和取值方法,用于对这些属性的访问(通常为每个属性创建一对取值(getter)方法和赋值(setter)方法。
(3)在赋值和取值方法中,加入对属性的存取限制。
7.2 类的继承
(1)简单继承
类继承的定义格式如下:
class class_name extends extend extend_class {
//类的主体
}
/*
其中,class_name 表示子类(派生类)的名称;extend_class表示父类(基类)的名称。
*/
(2) 单继承
Java不支持多重继承,只允许一个类直接继承另一个类。下面代码会导致编译错误:
class Student extends Person,Person1,Person2 { ...}
class Student extends Person,extends Person1,extends Person2
(3)使用super关键字
下面情况需要使用super关键字:
#在类的构造方法中,通过super语句调用该类的父类的构造方法(super( )必须在子类构造函数的主体的第一行);
#在子类中访问父类中的成员(此时用法和this关键字类似)。
(4) 对象类型转换
Java语言允许某种类型的引用变量引用子类的实例,而且可以对这个引用类型变量进行类型转换。若把引用类型转换为子类类型,称为向下转换;若把引用类型转换为父类类型,称为向上转型。
示例:
Animal animal = new Dog( );
Dog dog = (Dog) animal; //向下转型,把animal类型转换为Dog类型
Creature creature =animal; //向上转型,把Animal类型转换为Create类型
具体事例:
//Animal类
public class Animal {
public String name = "Animal:动物";
public static String staticName =“Animal:静态属性";
public void eat( ) {
System.out.println("Animal:动物在吃饭!");
}
public static void staticEat( ) {
System.out.println("Animal:动物在专心致志地吃饭!");
}
}
//Dog类
public class Dog extends Animal {
public String name = "Dog:狗";
public String str = "Dog:str属性";
public static String staticName =“Dog:静态属性";
public void eat( ) {
System.out.println("Dog:狗在吃饭!");
}
public static void staticEat( ) {
System.out.println("Dog:Dog在专心致志地吃饭!");
}
public void dogMethod( ){
System.out.println("Dog:狗喜欢吃骨头");
}
}
public static void main(String[ ] args) {
Animal animal = new Dog( );
Dog dog =(Dog) animal; //向下转型
System.out.println(animal.name); //输出Animal类的name变量
//Animal:动物
System.out.println(animal.staticName);//输出Animal类的staticName变量
//Animal:静态属性
animal.eat( ); //输出dog类中的eat( )方法
//Dog:狗在吃饭!
animal.staticEat( );//输出Animal类的staticEat( )方法
//Animal:动物在专心致志地吃饭!
System.out.ptintln(dog.str);//调用Dog类的str变量
//Dog:str属性
dog.dogMethod( ); //调用Dog类的dogMethod方法
//Dog:狗喜欢吃骨头
}
##################################################
/* 解释:
1.实例方法是与引用变量实际引用的对象的方法进行绑定,这属于动态绑定,是由运行时Java虚拟机动态绑定的。如 animal.eat( )将eat( )方法与Dog类进行绑定;
2.静态方法是与引用变量所声明的类型的方法进行绑定,这属于静态绑定,在编译阶段已绑定。如animal.staticEat( )方法与Animal类进行绑定;
3.成员变量(包括静态变量和实例变量)是与引用变量所声明的类型的方法进行绑定,这属于静态绑定,在编译阶段已绑定.如 animal.staticName,animal.name都与Animal类进行绑定。
(5)强制对象类型转换
对于向下转型,必须进行类型转换;对于向上转型,不必使用强制类型转换。
若要访问Dog类的成员,须通过强制类型转换,如下:
( (Dog)animal).str = " "; //编译成功
( (Dog)animal).dogMethod( ); //编译成功
7.3 方法重载
方法重载有两种情况:普通方法的重载和构造方法的重载。方法重载是Java多态性的表现。
方法重载时必须要注意两点:
#重载方法的参数列表必须和被重载的方法不同,且这种不同必须足以清楚地确定要调用哪一个方法。
#重载方法的返回值类型可以与被重载的方法相同,也可以不同 ,但只有返回值类型不同不能表示为重载。
7.4 方法重写
如果创建一个与父类中相同名称,相同返回值类型,相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方法被称为方法重写。
在方法重写时,需要遵循下面的规则:
#参数列表必须完全与被重写的方法参数列表相同,否则不能称为重写;
#返回的类型必须与被重写的方法的返回值的类型相同,否则不能称为重写;
#访问修饰符的限制一定要大于被重写方法的访问修饰符(public > protected>default>private).
#重写方法一定不能抛出新的检查异常或比被重写方法声明更加宽泛的检查型异常。例如,父类的一个方法声明了一个检查异常IOException,在重写这个方法时就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
7.5 抽象类与接口
7.5.1 抽象类
语法格式如下:
<abstract> class <class_name>{
<abstract> <type> <method_name>(parameter-list);
...
}
/*
其中abstract 表示该类或该方法是抽象的;class_name 表示抽象类的名称;
method_name表示抽象方法名称;parameter-list表示方法参数列表。
*/
注意: abstract关键字只能用于普通方法,不能用于static方法或者构造方法中。在抽象类中必须包含至少一个抽象方法,并且所有的抽象方法不能有具体的实现,而应在它们的子类中实现所有的抽象方法(要有方法体)。
7.5.2 接口
1.接口的特征如下:
#有public的接口,允许任何类使用;否则访问将局限于所属的包。
# 方法的声明不需要其他的修饰符,在接口中声明的方法,将隐式地声明为公有的(public)和抽象的(abstract)。
#在Java接口中声明的变量其实都是常量,接口中的变量声明,将隐式地声明为public.static,final,即常量,故接口中定义的变量必须初始化。
#接口没有构造方法,不能被实例化。
#一个接口不能够实现另一个接口,但它可以继承多个其他接口。
2.接口的声明
使用关键字interface.
3.接口的实现
接口的实现需要注意以下几个方面:
#接口必须通过类来实现它的所有抽象方法。
#在实现类中可以直接引用接口中的常量。
#与子类继承父类相似,当类实现了某个接口时,必须实现接口中所有抽象方法,否则这个类必须被定义为抽象类。
#不允许创建接口的实例,但 允许定义接口类型的引用变量,该变量引用实现了这个接口的类的示例。
#一个类只能继承一个直接的父类,但能够实现多个接口,这些接口名称在implements关键字后面使用逗号进行分隔。