接口被用来建立类与类之间关联的标准。
类的继承
基本思想:基于某个父类进行扩展,得到一个新的子类。子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者重写父类中的某些方法。
在Java中使用extends关键字来标识两个类的继承关系。
Class Parent{
Parent(){
System.out.println("调用父类的Parent()构造方法");
}}
class SubParentextends Parent{
SubParent(){
System.out.println("调用子类的SubParent()构造方法”);
}}
public class Subroutine extends SubParent{
Subroutine(){
System.out.println("调用子类的Subroutine()构造方法“);}
public static void main(String[] args){
Subroutine s=new Subroutine();}
}
Object类
在Java中所有的类都直接或间接继承了java.lang.Object类。Object类是所有类的父类,是Java层中的最高层类。
Object类中主要包括clone()、finalize()、equals()、toString()等方法,其中常用的两个方法为equals()和toString()方法。任何类都可以重写Object类中的方法。
Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。
getClass()方法
它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
getClass().getname();
可以将getClass()方法与toString()方法联合使用。
toString()方法
toString()方法的功能是将一个对象返回为字符形式,他会返回一个String实例。在实际的应用中通常重写toString()方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的toString()方法。
对象类型的转换
对象类型的转换在JAVA编程中经常遇到,主要包括包括向上转型与向下转型操作
向上转型
平行四边形是特殊的四边形,也就是说平行四边形是四边形的一种。
从图中可以看出,平行四边形类继承了四边形类。向上转型是从一个较为具体的类到较抽象的类的转换,所以他总是安全的。
向下转型是将较抽象的类转换为较具体的类,如果将父类对象直接赋予子类,会发生编译错误,因为父类对象不一定是子类的实例。越是具体的对象,具有的特性越多;越是抽象的对象,具有的特性越少。将父类对象强制转换为某个子类对象,这种方式称为显示类型转换。
使用instanceof操作符判断对象类型:
判断父类对象是否为子类对象的实例,这个判断通常使用instanceof操作符来完成。
instanceof的语法格式如下:
myobject instanceof ExampleClass
myobject:某类的对象引用 ExampleClass:某个类
使用instanceof操作符的表达式返回值为布尔值。如果返回值为true,说明myobject对象为ExampleClass的实例对象;如果返回值为false,说明myobject对象不是ExampleClass的实例对象。
ps:instanceof是Java语言的关键字,在Java语言中的关键字都为小写。
方法的重载
构造方法的名称由类决定,所以构造方法只有一个名称。如果希望以不同的方式来实例化对象,就需要使用多个构造方法来完成。由于这些构造方法都需要根据类名进行命名,为了让方法名相同而形参不同的构造方法同时存在,必须用到方法重载。
方法的重载就是在同一个类中允许存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。
定义不定长参数方法
不定长方法的语法如下:
返回值 方法名(参数数据类型...参数名称)
多态
利用可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理。对象可以作为父类的对象实例使用,这种将子类对象视为父类对象的做法称为向上转型。
向上转型语法:
子---》父类 比喻:自动类型转型
父类类型 变量名=new 子类类型(); Animal a=new Cat();
向下转型语法:
父---》子类 比喻:强制类型转换,需要加强制类型转换符)
子类类型 变量名=(子类类型)父类变量名; Cat a=(Cat) Animal;
多态指的是多种形态,父类型引用指向子类型对象,包括编译阶段和运行阶段。
编译阶段:绑定父类的方法 运行阶段:动态绑定子类型对象的方法。
抽象类与接口
抽象类
在解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。
抽象类的语法如下:
public abstract class Test{
abstract void testAbstract(); //定义抽象方法
}
使用abstact关键字定义的类为抽象类,而使用这个关键字定义的方法为抽象方法。抽象方法没有方法体,承载这个抽象方法的抽象类必须被继承,抽象类除了被继承之外没有任何意义。
反过来说,如果声明一个抽象的方法,就必须将承载这个抽象方法的类定义为抽象类,不可能在非抽象类中获取抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
抽象类被继承后需要实现其中所有的抽象方法,也就是保证所有的方法名称、参数列表和相同返回值类型创建出非抽象方法,当然也可以是抽象方法。
继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖
接口
接口简介
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,接口中的所有方法都没有方法体。
public interface drawTest{
void draw(); //接口内的方法,省略abstract关键字
}
public:接口可以像类一样被权限修饰符修饰,但public关键字仅限用于接口在与其同名的文件中被定义。
interface:定义接口关键字
drawTest:接口名称
一个类实现一个接口,可以使用implements关键字
public class Parallelogram extends Quadrangle implements drawTest{
..//
}
在接口中,方法必须被定义为pblic或abstract形式,其他修饰权限不被java编译器认可。
或者说,即使不将该方法声明为public形式,它也是public。
//在接口中定义的任何字段都自动是static和final的。
接口与继承
Java不允许出现多重继承,但使用接口就可以实现多重继承。一个类可以实现多个接口,因此可以将所有需要继承的接口放置在implements关键字后并使用逗号隔开。但可能会在一个类中产生庞大的代码量,因为继承一个接口时需要实现接口中所有的方法
多重继承的语法如下:
class 类名 implements 接口1,接口2,...,接口n
在定义一个接口时,使该接口继承另外一个接口。
interface intf1{
}
Interface intf2 extends intf1{
}