OOP的特点:继承、封装、多态、抽象
5.1 类的继承
在Java中,许多类组成层次化结构,一个类的上一层称为父类,而下一层称为子类。一个类要以继承其父类的变量和方法,继承特性使Java既灵活方便又能提高效率。
5.1.1 父类和子类
被继承的类称为父类或超类,这个新类称为子类。
子类的创建格式: [<修饰符>] class <子类名> extends <父类名>
{ ………… }
例:public class Hello2 extends java.applet.Applet
public class SC extends Object // extends Object 可以省略
说明:从Java系统软件包java.lang中的Object派生来的子类可以不指出父类的名字,一般称这些类的父类为隐含类。
5.1.2 成员变量的继承和隐藏
1.成员变量的继承
继承原则:
(1)子类不能继承父类的private成员变量
(2)子类能继承父类的public和protected成员变量
(3)子类能继承同一包中有默认权限修饰符的成员变量
2.成员变量的隐藏
隐藏原则:子类的成员变量和父类的成员变量同名,父类的成员变量被隐藏(不能继承)
5.1.3 成员方法的覆盖
继承原则:
(1)子类不能继承父类的private成员方法
(2)子类不能继承父类的构造方法
(3)子类能继承父类的public和protected成员方法
(4)子类能继承同一包中有默认权限修饰符的成员方法
覆盖(隐藏)(override)原则:
子类的成员方法和父类的成员方法同名,父类的成员方法被覆盖(隐藏)(不能继承)
说明:(1)用来覆盖的子类方法应和被覆盖的父类方法保持相同名称和相同返回值类型,以及相同的参数个数和参数类型。
(2)可能不需要完全覆盖一个方法,部分覆盖是在原方法的基础上添加新的功能,即在子类的覆盖方法中添加一条语句:super.原父类方法名,然后加入其他语句
(3)不能覆盖父类中的final方法
(4)不能覆盖父类中的static方法,但可以隐藏这类方法。即在子类中声明的同名静态方法实际上隐藏了父类中的静态方法
(5)非抽象子类必须覆盖父类中的抽象方法
5.1.4 this和super
调用本类成员和方法格式:
this.变量名 this.方法名([参数])
调用父类成员和方法格式:
super.变量名 super.方法名([参数])
调用本类构造方法:
this([参数列表])
调用父类构造方法:
super([参数列表])
(1)this代表当前类或对象本身
例: class Tree {
int h , s , b ; //成员变量
Tree(int h , int s , int b)
{ this.h=h ; // this.h为成员变量的h, 右边h是入口参数h
this.s=s ; this.b=b ; } }
(2)super代表父类
例: public class SC
{ public static void main(String args[])
{ Son a=new Son();
a.ClearUp(); }
public void ClearUp( )
{ System.out.println("开始打扫"); } }
class Son extends SC{
Son(){System.out.println("今天是周末");}
public void ClearUp()
{ super.ClearUp( );
System.out.println("已清扫干净!"); } }
运行结果: 今天是周末
开始打扫
已清扫干净!
说明:不需要实例化父类就可以直接使用super变量
(3)super()可用来调用父类的构造方法
Java规定类的构造方法只能由new调用,程序员不能直接调用,但可用super( )间接调用,同理this( )也可间接调用当前类或对象的构造方法
类的构造方法是不能继承的,因为构造方法不是类的成员,没有返回值,也不需要修饰符。
说明:super( )只能出现在子类的构造方法中,而且必须是子类构造方法中的第一条可执行语句。
5.2 类的多态
在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同,这种现象称为类的多态
类的多态性体现在方法的重载上,包括成员方法和构造方法的重载
5.2.1 成员方法的重载
方法的重载是指对同名方法的重新定义
例: public void fun(int a)
public void fun(int a , int b)
public void fun(int a , float b , String s)
public int fun(int a) //不是正确的重载
例: public class SC
{ public double area(float a) //改成int area(float a)将报错
{return (int)(Math.PI*a*a*100)/100.0 ;} //保留2位小数
public double area(float a, float b)
{return a*b ;}
public double area(float a, float b, float c)
{float d;
d=(a+b+c)/2 ;
return Math.sqrt(d*(d-a)*(d-b)*(d-c)) ;}
public static void main(String args[])
{ SC sh=new SC();
System.out.println("圆面积是: "+sh.area(3));
System.out.println("矩形面积是: "+sh.area(7,4));
System.out.println("三角形面积是: "+sh.area(3,4,5)); } }
运行结果:圆面积是: 28.27
矩形面积是: 28.0
三角形面积是: 6.0
例:见P96
5.2.2 构造方法的重载
例: class Date( ) {
Date( ) {……}
Date(int x, int y ) {……}
Date(int x, char y ) {……}
}
…………
Date d1=new Date( )
Date d2=new Date(5,’A’ )
Date d3=new Date(5,12) //分加调用不同的构造方法
作业P101 5-11
class Fraction{
private int f1,f2;
Fraction(int x,int y)
{f1=x;f2=y;}
void Xc(int i1,int i2,int i3,int i4)
{f1=i1*i3;
f2=i2*i4;}
void Dy1()
{System.out.println(f1+"/"+f2);}
void Dy2()
{System.out.println((double)f1/(double)f2);}}
public class SC{
public static void main(String arg[]){
Fraction a=new Fraction(0,0);
a.Xc(4,5,7,3);
a.Dy1();a.Dy2();} }