面向对象的三大特性:
封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现。
继承:很好的实现了代码的复用,提高了 效率。
多态:程序的可扩展性及可维护性增强。
继承就是一种由已有的类创建新类的机制,是指在已有类的基础上扩展功能。继承中分为子类和父类
类可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。
1.所谓子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作.
2. 所谓子类继承父类的方法作为子类中的一个方法,就象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法调用。
(1) 只支持单一继承,也就是只有一个父类,利用extends 关键字继承;
class A{ }
class B{ }
class C extends A,B{ // 错误的,因为同时继承了两个父类 }
(2)Java中允许多层继承
class A{ }
class B extends A{ }
class C extends B{ }
(3)当子类拥有和父类相同的方法定义(即返回类型、方法名、参数列表完全相同时,仅方法体不一样),称之为方法重写(OverRide);
1对于子类创建的一个对象,如果子类重写了父类的方法,则运行时 调用子类重写的方法,如果子类继承了父类的方法(未重写),那么子类创建的对象也可以调用这个方法,只不过方法产生的行为和父类的相同而已。
2重写父类方法时不可以降低方法的访问权限
3如果重写了父类的方法后使用父类的被重写方法,可以在子类的方法中使用super.被重写方法();
4子类不继承父类的构造方法
5子类的构造方法必须调用父类的构造方法
6如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法,相当于省略了super();语句
7如果子类构造方法中既未显式调用父类构造方法,而父类中只有有参数的构造方法,没有无参的构造方法,则编译出错
8在子类的构造方法中可使用语句super(argument_list) 调用父类的构造方法,但必须作为构造方法的第一条句。
9子类在实例化时实际上先调用父类的构造方法,后调用的子类的构造方法。
抽象类(Abstract Class)
抽象类提供一个类型的部分实现,可以有实例变量,构造方法,抽象方法(Abstract Method 即不能有方法的实现哪怕是{})和具体方法。一个抽象类不会有实例;它是用来继承的。它反映了一种一般/特殊化的关系。
用关键字abstract修饰的类称为abstract类(抽象类)。
abstract class A
{ … }
abstract类有特点:和普通的类相比,abstract类可以有abstract方法。对于abstract方法,只允许声明,不允许实现,而且不允许使用final修饰abstract方法。
abstract class A
{ abstract int min(int x,int y);
int max(int x,int y)
{ return x>y?x:y; }
}
abstract类不能用new运算创建对象
对于abstract类,我们不能使用new运算符创建该类的对象,需产生其子类,由子类创建对象,如果一个类是abstract类的子类,它必须具体实现父类的abstract方法,这就是为什么不允许使用final修饰abstract方法的原因。
一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,抽象类中的抽象方法可以强制子类必须给出这些方法的具体实现。
多态
多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。简单来说,多态是具有表现多种形态的能力的特征。
当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。那么当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转的对象在调用这个方法时就可能具有多种形态.
多态特点
1. 对于一个引用类型的变量,Java编译器按照它的声明的类型来处理
2. 对于一个引用类型的变量,运行时Java 按照它的实际引用的对象来处理
1、子类重写父类的方法
2、编写方法时,调用父类定义的方法
3、运行时,根据实际创建的对象类型动态决定使用哪个方法
例如:让父类引用指向子类对象;如 Person p1 = new Student();//引用的类型是Person,指向子类对象Student
接口
接口声明
接口与类属于同一层次,实际上,接口是一种特殊的抽象类。在Java中接口定义同类的定义很相似,分为接口声明和接口体两部分。接口通过interface关键字声明,接口体中只能包含全局常量和抽象方法,接口的变量自动是public static final属性,接口中的方法自动是public abstract属性,并没有方法体,以分号结尾。
格式: [public] interface 接口名 [extends 父接口名表]{ 接口体;}
接口体包含常量定义和方法定义,
例如:
interface IA{
public static final int MAX=100; //全局常量
public void print(); //抽象方法
public abstract int sum(); //抽象方法
}
注:
1) public interface:公开接口,与类相似,一个文件只能有一个public接口,且与文件名相同。
2) 在一个文件中不可同时定义一个public接口和一个public类。
3) 接口和接口之间可以定义继承关系,并且接口之间允许实现多重继承。
例:interface IC extends IA,IB{ };
接口使用
1.一个类通过关键字implements实现接口:
格式:[修饰符] class 类名 [extends 父类] [implements 接口]{}
非抽象类,必须实现接口的所有方法;
抽象类的非抽象子类中对其父类所实现的接口中的所有抽象方法都必须实现。
2.一个类除继承另外一个类,还可以实现接口:
class IAImpl extends java.util.Arrylist implement IA,IB{}
1) 一个类实现了某个接口,则必须实现接口中的所有方法,如果没有实现接口中的所有方法,则此类一定是抽象类。因为一个类实现接口,相当于它继承一个抽象类。
2) 接口中方法可不写public,但在子类中实现接口的过程中public不可省。(如果省去public则在编译的时候提示出错:对象无法从接口中实现方法,相当于降低了重写方法的权限。)
3) 如果父类实现了某个接口,子类不需要使用implements关键字声明就可以使用此接口。
4) 接口也可以用于定义对象
IA iA=new IAImpl(); //类似于上转型对象
上转型对象特点:
n 上转对象不能操作子类新增的成员变量(失掉了这部分属性);不能使用子类新增的方法(失掉了一些功能)。
n 上转型对象可以操作子类继承或隐藏成员变量,也可以使用子类继承的或重写的方法。
n 上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。
n 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。
示列:
| interface IDetail{ public String detail(); } class Teacher implements IDetail { private String name; private int age; private String type; public Teacher(String name, int age, String type) { this .name = name; this .age = age; this .type = type; } // 返回教师详细信息 public String detail() { return "姓名:" + name + ",年龄:" + age + ",教师类型:" + type; } } class Printer { public void print(String s) { System.out.println(s); } } class MedicalInspection implements IDetail{ Printer printer = new Printer(); // 返回体检中心信息 public String detail() { return "这里是滨州市体检中心,欢迎您的到来!" ; } // 打印detail信息 public void printDetail(IDetail d) { printer.print(d.detail()); } } public class ExDemon03 { public static void main(String[] args) { MedicalInspection mi= new MedicalInspection(); IDetail t = new Teacher( "李四" , 33 , "Java" ); mi.printDetail(); // 打印教师信息 mi.printDetail(mi); // 打印中心信息 } } |