一:继承
package 继承; //inherit 继承 public class TestInherits { public static void main(String args[]) { Child c = new Child(); } } class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparent { public Parent() { super ("Hello.Grandparent.");/*调用父类的构造方法。 子类可以调用由父类声明的构造方法, 但是必须在子类的构造方法中使用super关键字来调用。其具体的语法格式如下: super([参数列表]); */ //System.out.println("Parent Created"); //super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } }
1继承
super关键字主要有两种用途分别为:
1.调用父类的构造方法。子类可以调用由父类声明的构造方法,但是必须在子类的构造方法中使用super关键字来调用。其具体的语法格式如下:?
super([参数列表]);?
如果父类的构造方法中包括参数,则参数列表为必选项,用于指定父类构造方法的入口参数。?
2.操作被隐藏的成员变量和被覆盖的成员方法。如果想在子类中操作父类中被隐藏的成员变量和被覆盖的成员方法,也可以使用super关键字,具体格式如下:
super.成员变量名?super.成员方法名([参数列表])
通过super调用基类构造方法,必须是子类构造方法中的第一个语句
子类运行前必须调用父类的构造方法
答:构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。
特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用也是这个原因,因为父类根本不知道子类有神魔变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!
方法覆盖要点:
二:多态
行为(方法)多态:重写和重载。
引用多态(动态绑定):编译时的类型和运行不一致的现象叫动态绑定
例:父类 = 子类。
Pet p = new Dog();
12.instanceof
语法:对象A instanceof 类型B
判断对象A的类型是否是类型B,如果是就返回true,否则返回false.
例:d instanceof Dog
13.实现多态的两种形式
a.使用父类作为方法形参实现多态
public void play(Pet p){...};
b.使用父类作为方法返回值实现多态
public Pet getPet(int type){...};
14.接口
14.1语法
publicinterface 接口名 extends 接口1,接口1...{
//1.常量
//2.抽象方法
}
14.2特点
a.用interface修饰
b.接口可以继承接口,多继承
c.接口内只能定义常量和抽象方法
d.接口不能实例化,但是可以作为子类的引用
e.实现接口的子类都必须实现它的所有抽象方法
f.规则
14.3实现接口
public class 类名 implements 接口名{
//实现方法
}
三:抽象和接口
在Java中关键字abstract修饰的类称为抽象类,同样abstract修饰的方法称为抽象方法。
抽象类不能使用new方法进行实例化,是没有具体实例对象的类。抽象类不能直接创建对象,只能通过抽象类派生出新的子类,由子类创建对象。抽象类本身不具备实际功能只能用于其派生子类
抽象类的成员方法可以包括一般方法和抽象方法。抽象方法只声明返回的数据类型,方法名称,和所需的参数没有方法体即抽象方法只需要声明不需要实现。当一个方法为抽象方法时就必须被子类方法重写否则子类方法仍是抽象方法。抽象类中不一定包括抽象方法,但包括抽象方法的类一定被声明为抽象类
例如
package ch01; abstract class ep1_1{//定义抽象类 String str; ep1_1(String s){//定义抽象类一般方法 str=s; } abstract void fruit();//定义抽象方法 } class ep1_2 extends ep1_1{//定义继承抽象类的子类 String str; ep1_2(String s){ super(s);//调用父类的构造方法 } void fruit(){//重写父类抽象方法 System.out.println("苹果"); } } public class eq1_5 { public static void main (String[] args){ ep1_2 Dx = new ep1_2("水果");//创建子类对象 Dx.fruit(); } }
运行结果
苹果
接口
接口是抽象类的一种,只包含常量和方法的定义而没有变量和方法的实现且其方法都是抽象方法
接口用处如下
1.通过接口实现不相关类的相同行为,无需考虑这些类之间的关系
2.通过接口指明多个类需要实现的方法
3.通过接口了解对象的交互界面,无须了解对象所对应的类
接口可多重继承