null第七章第七章 类的继承
和多态机制null7.1 类的继承
7.2 类的多态性
7.3 final类和final成员7.1 类的继承7.1 类的继承在 Java 中,类是一个层次结构,其中Object为超类或基类,所有类都直接或间接地继承自Object类;
子类继承父类的属性和
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,同时也可以修改父类的属性或重载父类的方法,以及在父类的基础上添加新的属性和方法。因此,父类和子类之间反映的是“一般与特殊”的关系。
在类的继承中,被继承的类称为父类,继承而来的类则称为子类。有多个子类共同继承一个父类,那么这个父类就是多个类的基类。
Java语言只支持单继承,如果要定义多继承,可以使用将要讲解的接口。1 继承的实现1 继承的实现定义子类的形式为:
[访问权限] class 类名 extends 父类名
{
类体
}
Java中的继承是通过extends关键字来实现的,在定义类时使用extends关键字指明新定义类的父类。新定义的类称为子类,它可以从父类那里继承属性和方法。null类的继承原则如下:
子类继承父类的成员变量,包括实例成员变量和类成员变量。
子类继承父类除构造方法以外成员方法,包括实例成员方法和类成员方法。
子类不能继承父类的构造方法,因为父类的构造方法用来创建父类对象,子类需定义自己的构造方法,用来创建子类自己的对象。
子类可以重新定义父类成员。null父类成员的访问权限
子类虽然继承了父类的成员变量和成员方法,但并不是对父类所有成员变量和成员方法都具有访问权限,即并不是在自己声明的方法中能够访问父类所有成员变量或成员方法。子类访问父类成员的权限如下:
子类对父类的private成员没有访问权限。
子类对父类的public和protected成员具有访问权限。
子类对父类的缺省权限成员访问权限分2种情况:对于同一包中父类的缺省权限成员具有访问权限,对其它包中父类的缺省权限成员没有访问权限。
Java实例——类的继承Java实例——类的继承class Person1
{
private String name;
protected int age;
public void setName(String na)
{ name=na; }
public void setAge(int ag)
{ age=ag; }
public String getName()
{ return name; }
public int getAge()
{ return age; }Java实例——(续)Java实例——(续)public void print_p()
{
System.out.println("Name:"+name+" Age:"+age);
}
}
public class Teacher1 extends Person1
{
protected String department;
public Teacher1(String na, int ag, String de)
{
setName(na);
setAge(ag);
department=de;
}nullpublic void print_s()
{
print_p();
System.out.println("Department:"+department);
}
public static void main(String arg[])
{
Teacher1 t;
t=new Teacher1("Wang",40,"Computer Science");
t.print_s();
t.setName("Wang Gang");
t.age=50; //直接访问父类中protected成员变量age,但不能访问其
//private成员变量name
t.print_s();
}
}
null程序运行结果如下:
Name:Wang Age:40
Department:Computer Science
Name:Wang Gang Age:50
Department:Computer Science2 this 与 super2 this 与 super可以使用super引用父类成员变量
super.成员变量名
调用父类成员方法
super.成员方法名(参数
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
)
调用父类构造方法
super(参数表)null使用this引用当前对象的成员变量
this.成员变量名
调用当前对象的成员方法
this.成员方法名(参数表)
调用当前对象的构造方法
this(参数表)例--利用super访问父类成员 例--利用super访问父类成员 class Person2
{
protected String name;
protected int age;
public Person2(String na, int ag)
{
name=na;
age=ag;
}
public void print()
{
System.out.println("Parent:Name="+name+" Age="+age);
}
}nullpublic class Teacher2 extends Person2
{
String department, name;
public Teacher2(String na, int ag, String de, String na1)
{
super(na,ag);
department=de;
name=na1;
}
public void setName_p(String na)
{
super.name=na;
}
public void setName_s(String na1)
{ name=na1; } nullpublic void print()
{
super.print();
System.out.println("Son:Name="+name+" Department="+department);
}
public static void main(String arg[])
{
Teacher2 t;
t=new Teacher2("Wang",40,"Computer Science","Gu");
t.print();
t.setName_p("Wang Qiang");
t.setName_s("Gu Li");
t.print();
}
} null程序运行结果如下:
Parent:Name=Wang Age=40
Son:Name=Gu Department=Computer Science
Parent:Name=Wang Qiang Age=40
Son:Name=Gu Li Department=Computer Science例--利用this访问当前对象成员 例--利用this访问当前对象成员 class Point
{
protected int x, y;
public Point(int x, int y) //带参数的构造方法
{
this.x=x;
this.y=y;
System.out.print( "["+this.x+","+this.y+"]" );
}
public Point() //不带参数的构造方法
{
this(5,5); //调用带参数的构造方法
}
}nullclass Circle extends Point // Circle类继承Point类
{
protected int radius;
public Circle(int x, int y, int radius)
{
super(x,y); //调用带参数的构造方法
this.radius=radius;
System.out.println( ", r="+radius );
}
public Circle( int radius)
{
super(5,5); //调用不带参数的构造方法
this.radius=radius;
System.out.println( ", r="+this.radius );
}
}nullpublic class Test
{
public static void main( String args[] )
{
Circle circle1=new Circle(50,100,200); //创建Circle对象circle1
Circle circle2=new Circle(10); //创建Circle对象circle2
}
}null程序运行结果如下:
[50,100], r=200
[5,5], r=10Java实例——super和this的使用Java实例——super和this的使用class Employee{
String name;
Employee(String name){
this.name=name;
}
public void showInfo(){
System.out.println("this is superClass call:"+name);
}
public void getInfo()
{ showInfo(); }
}
class Manage extends Employee{
String name; //注意与父类同名的成员变量
String department;
Manage(String n)
{ super(n); }Java实例——(续)Java实例——(续) public void showInfo(){
super.showInfo(); //调用父类的方法
System.out.println("this is subClass call:"+name);
System.out.println(department);
}
}
public class CoverMethod{
public static void main(String args[]){
Manage aa=new Manage("李四");
aa.name="张三";
aa.department="经理室";
aa.getInfo();
}
}
7.2 多态性
7.2 多态性 多态性指同一名字的方法可以有多种实现,即不同的方法体。在面向对象的程序中多态表现为,可以利用重载在同一类中定义多个同名的不同方法实现多态,也可以通过子类对父类方法的覆盖实现多态。1 方法的重载1 方法的重载 重载是指在同一类中,多个方法具有相同的方法名,但采用不同的形式参数列表,包括形参的个数、类型或顺序不同。调用方法时,系统是通过方法名和参数列表确定所调用的具体方法。null重载方法中的参数表必然不同,表现为参数个数不同,或参数类型不同或参数顺序不同。例如,以下是正确的重载方法头:
public double area(double r)
public double area(int a, double b)
public double area(double a, int b)
以下的方法头则不是正确的重载方法:
public int volume(int a, int b)
public void volume(int x, int y)null例如,计算圆、三角形和长方形的面积,可以定义具有以下方法头的3个重载方法:
public double area(double r)
public double area(double a, double b, double c)
public double area(double a, double b)Java实例——方法的重载Java实例——方法的重载class Distance_p
{
public double distance(double x, double y)
{ return Math.sqrt(x*x+y*y); }
public double distance(double x, double y, double z)
{ return Math.sqrt(x*x+y*y+z*z); }
}
public class Measure
{
public static void main(String[] args)
{
Distance_p d2, d3;
d2=new Distance_p();
d3=new Distance_p();
System.out.println("Two dimensional distance="+d2.distance(2,2));
System.out.println("Three dimensional distance="+d3.distance(2,2,2));
}
}null程序运行结果如下:
Two dimensional distance=2.8284271247461903
Three dimensional distance=3.4641016151377544
2 方法的覆盖 2 方法的覆盖 覆盖是指子类重定义了父类中的同名方法。覆盖表现为父类与子类之间方法的多态性。
程序运行时,根据调用方法的对象所属的类决定执行父类中的方法还是子类中的同名方法。寻找执行方法的原则是:首先从对象所属类开始,寻找匹配的方法;如果当前类中没有匹配的方法,则依此在父类、祖先类寻找匹配方法。方法覆盖举例方法覆盖举例class CCircle
{
protected double radius;
public CCircle(double r)
{
radius=r;
}
public void show()
{
System.out.println("Radius="+radius);
}
}
public class CCoin extends CCircle
{
private int value;
public CCoin(double r, int v)
{ super(r); value=v; }
null public void show()
{
System.out.println("Radius="+radius+" Value="+value);
}
public static void main(String[] args)
{
CCircle circle=new CCircle(2.0);
CCoin coin=new CCoin(3.0,5);
circle.show();
coin.show();
}
}null程序运行结果如下:
Radius=2.0
Radius=3.0 Value=57.3 final类和final成员7.3 final类和final成员 Java中,有一个非常重要的关键字final,用它可以修饰类及类中的成员变量和成员方法。用final修饰的类不能被继承,用final修饰的成员方法不能被覆盖,用final修饰的成员变量不能被修改。1 final类1 final类出于安全性考虑,有些类不允许被继承,称为final类。在下列情况下,通常将类定义为final类:
具有固定作用,用来完成某种标准功能的类。
类的定义已经很完美,不需要再生成其子类。
final class 类名
{
类体
}例 继承final类例 继承final类public class C1
{
public C1(int i)
{
System.out.println("i="+i);
}
}
/*class C2 extends C1
{
double x;
public double getX()
{ return x; } */
public static void main(String args[]){
C1 a=new C1(5);
}
}null程序编译时的错误信息如下:
无法从最终 C1 进行继承
public class C2 extends C1
^
1 错误
2 final成员方法2 final成员方法
出于安全性考虑,有些方法不允许被覆盖,称为final方法。将方法声明为final方法,可以确保调用的是正确的、原始的方法,而不是在子类中重新定义的方法。例 覆盖final方法。例 覆盖final方法。class Mother
{
int x=100,y=20;
public final void sum()
{
int s;
s=x+y;
System.out.println("s="+s);
}
}
public class Children extends Mother
{
int m=20,n=30;
public void sum()
null{
int f; f=m+n;
System.out.println("f="+f);
}
public static void main(String args[])
{
Children aa=new Children();
aa.sum();
}
}
程序编译时的错误信息如下:
Children中的sum() 不能覆盖Mother中的sum();被覆盖的方法是 final public void sum()
^
1 个错误3 final成员变量 3 final成员变量 如果一个变量被final修饰,则其值不能改变,成为一个常量。如果在程序中企图改变其值,将引起编译错误。如:
final int i=23;
在程序中不能再给i赋值,否则产生编译错误。