1、第5章 深入学习Java面向对象程序设计,5.1 类与类的关系 5.2 类的继承 5.3 抽象类 5.4 接口,5.1 类与类的关系,使用关系例如:myDate与usingDate 包含关系 一个类的对象作为另外一个类的成员变量(has a 关系) 继承关系,继承关系,一个类可以继承其他类的所有成员,还可 以拥有自己的成员。被继承的类称为父类, 由继承生成的类称为子类。继承的优点:提高程序的可重复性,可扩充性。,5.2 类的继承,问题1:如何编写子类? 问题2:关于继承的一些规定。 问题3:构造函数的继承与super关键字。 问题4:子类对象的实例化过程。 问题5:关于方法覆盖。,1、子类的创
2、建,类继承是用关键字extends来实现的 public class ColorPoint extends Point 子类拥有父类所有的属性和方法; 子类还可以增加自己的属性和方法; 子类可以对父类的方法覆盖或重载。 只能继承一个直接父类,子类,父类,public class Pointfinal static Point origin=new Point(0,0); protected int x;protected int y;public Point()public Point(int x,int y) this.x=x; this.y=y; public double distanc
3、e() return Math.sqrt(x*x+y*y); public static void draw() System.out.println(“Point: a point.“); public static Point getOrigin() return origin; ,class ColorPoint extends Point protected int color;ColorPoint() super(); ColorPoint(int x,int y,int c) super (x,y); this.color=c; public static void draw()
4、System.out.println(“ColorPoint: a color point.“); ,问题: ColorPoint类中有哪些变量和方法?,class MapPoint extends ColorPoint protected String name;MapPoint() super(); MapPoint(int x,int y,int c,String name) super (x,y,c); this.name=new String(name); public static void draw() System.out.println(“MapPoint: a map co
5、lor point.“); ,关于继承的一些规定,Java只支持单继承。(单继承?) 可以有多层继承。 子类继承父类的所有成员变量和成员方法,但不继承构造方法。 子类可以重写父类的某些方法(方法的覆盖)。,方法的覆盖,方法的覆盖是在子类和父类中方法名、参数表和返回值类型相同的方法,这时,子类中的方法将会覆盖父类中的同名方法。问题:前面的ColorPoint和Point之间有无方 法覆盖?,继承关系中的构造方法,子类不能继承父类的构造方法。 在子类的构造方法中可用super(参数列表)显示地调用父类的构造方法。必须是构造方法第一句。ColorPoint() super(); ColorPoint
6、(int x,int y,int c) super (x,y); this.color=c; ,子类对象的实例化过程,分配成员变量的存储空间并进行默认初始化 绑定构造方法。 如有this(),则调用。 如有super(),则调用。 如果没有显示调用父类的构造方法,则自动调用父类无参构造方法进行那些从父类继承下来的成员变量的初始化。,public class UsePoint public static void main(String args) Point p=new Point(1,1);ColorPoint cp=new ColorPoint(2,2,0);MapPoint mp=new
7、 MapPoint(3,3,0,“BIPT“);System.out.println(p.distance();System.out.println(cp.distance();System.out.println(mp.distance();p.draw();cp.draw();mp.draw(); ,实例,import java.awt.*; import java.awt.event.*; import javax.swing.*;class myFrame extends JFrame private JTextField tf;private JButton b0;myFrame()
8、setSize(220,180); tf=new JTextField(20); b0 = new JButton(“0“);Container cp = getContentPane();cp.add(tf,BorderLayout.NORTH);cp.add(b0,BorderLayout.CENTER);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true); public static void main(String args) myFrame mf=new myFrame(); ,5.3 抽象类,抽象类就是那些
9、类中存在一些没有完全实现的方法的类。不能给抽象类创建对象,但是可以使用抽象类作为基类派生出其他类。 抽象类中那些没有实现的方法称为抽象方法,用abstract修饰,没有方法体:abstract funName(参数列表);例如:public abstract boolean dial();,抽象类与抽象方法,包含抽象方法的类必须被声明为抽象类,即用abstract修饰。 不能用抽象类声明具体的实例对象。,abstract class Area public abstract double area();class RectArea extends Areadouble length,width
10、; public double area()return length*width; class RoundArea extends Areadouble r; public double area()return Math.PI*r*r; public class ImpleAreapublic static void main(String args)RectArea rect=new RectArea();RoundArea round=new RoundArea(); System.out.println(rect.area();System.out.println(round.are
11、a(); ,为什么有抽象类?,在面向对象程序设计中,越是处在继承结构的顶层的类,就越概括、越抽象。我们常常需要定义一些表示抽象概念的类,这些类为子类提供一个实现框架,本身却不能提供具体的实例。 抽象类只能被继承,只有其子类覆盖并实现了那些抽象方法后,才能创建对象并使用。,5.4 接 口,接口不是类,是类似于特殊的抽象类的一种类型。接口是把不同类集合在一起的一种类型,这些类均包括若干同名方法的定义。 与抽象类不同,接口中定义的所有方法都是抽象方法,接口中定义的所有域都是常量。 接口支持多继承,也使用extends关键字。 接口需要被实现,使用implements关键字。一个类可以实现多个接口。,
12、interface InterfaceApublic static final int a=3; boolean con=true;public abstract void funcA(int x); interface InterfaceBdouble b=3.5; public abstract void funcB(double y); interface InterfaceC extends InterfaceA,InterfaceBint c=10;void funcC(); public class ImplementsC implements InterfaceCpublic v
13、oid funcC() System.out.println(c); public void funcA(int x) System.out.println(“x=“+x); public void funcB(double y) System.out.println(“y=“+y); public static void main(String args)ImplementsC cc=new ImplementsC();cc.funcC(); cc.funcA(c); cc.funcB(b); ,完整的类的定义的语法如下:,修饰符 class className extends superC
14、lassimplements interface1,interface2 /一个类只能继承于一个父类,但是可以实现多个接口,实例,myFrameEvent.java,import java.awt.*;import java.awt.event.*;import javax.swing.*; class myFrameEvent private JTextField tf; private JButton b0; private String s=“; myFrameEvent()JFrame jf=new JFrame(); tf=new JTextField(20); b0 = new J
15、Button(“0“); jf.setSize(220,180); Container cp =jf.getContentPane();cp.add(tf,BorderLayout.NORTH); cp.add(b0,BorderLayout.CENTER);b0.addActionListener(new NumberButtonHandler();jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true); private class NumberButtonHandler implements ActionListenerpublic void actionPerformed(ActionEvent e)JButton tempB = (JButton)e.getSource();s = tempB.getLabel(); tf.setText(tf.getText()+s); public static void main(String args) myFrameEvent et=new myFrameEvent(); ,