概述
第五章 消息、继承、多态
1.多态机制
-
多态的概念:多态是指一个程序中具有相同名字而内容不同的方法共存的情况
-
多态的两种机制:重载与覆盖
1.1 重载
-
概念:在同一个类中定义了多个同名而不同内容的成员方法时,我们称这些方法是重载
-
区分这些方法的方式:
-
参数的个数
-
参数类型
-
参数顺序
-
1.2 覆盖
-
概念:在子类中定义与父类中已定义的相同名而内容不同的方法
-
区别这些方法的方式:
-
只需要在方法引用时,指明引用的是父类的方法还是子类的方法
-
2.继承机制
-
继承的概念:子类可以具有父类的全部或部分属性和方法
2.1 特征
-
继承关系是传递的。
-
提供软件复用的功能
-
简化了人们对事物的认识和描述,清晰体现相关类间的层次结构关系
2.2 用extends指明继承关系
2.3 数据成员的继承
-
子类可以继承父类的所有非私有的数据成员
2.4 数据成员的隐藏
-
在子类中重新定义一个与父类中已定义的数据成员名完全相同的数据成员。
此时子类拥有两个相同名字的数据成员:一个是继承父类的,另一个是自己定义的
-
当子类引用这个同名的数据成员时,默认操作是它自己定义的数据成员,而把
从父类继承的数据成员隐藏起来
package 第5章; public class J5_7 { int x = 4; public static void main(String[] args) { J5_7 ZI = new J5_7(); System.out.println(ZI.x); } } class A{ int x = 1; }
2.5 成员方法的继承
-
子类可以继承父类的所有非私有成员方法
2.6 成员方法的覆盖
-
子类可以重新定义与父类中同名的成员方法,实现对父类方法的覆盖
-
子类重新定义父类已有的方法时:
-
应保持与父类完全相同的方法名、返回值类型、参数列表,否则就不是方法的覆盖,而是子类自己特有的方法,与父类方法无关
-
2.7 成员方法的覆盖于数据成员的隐藏的不同之处
-
子类隐藏父类的数据成员只是使之不可见,父类同名的数据成员在子类对象中仍占有独立的存储空间
-
子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在
3. this与super
3.1 this
-
this代表了当前对象的一个引用,可将其理解为当前对象的另一个名字
3.2 super
-
super代表当前对象的直接父类对象的一个引用
4. 构造方法的重载与继承
4.1构造方法的重载
-
一个类的若干个构造方法之间可以相互调用。当一个构造方法需要调用另一个构造方法时,可以使用关键字this,同时这个语句也应该时整个构造方法的第一条可执行语句
package 第5章; public class J5_14 { public static void main(String[] args) { B B1 = new B(1); B B2 = new B(2,3); B B3 = new B(4,5,6); System.out.println(B1.x); System.out.println(B2.x); System.out.println(B3.x); } } class B{ public int x = 0,y = 0,z = 0; B(int x){ this.x = x; } B(int x,int y){ this(x); this.y = y; } B(int x,int y,int z){ this(x,y); this.z = z; } }
4.2 构造方法的继承
-
子类无条件地继承父类的不含参数的构造方法
5.抽象类、接口、包
5.1 抽象类
-
抽象类是所有子类的公共属性的集合,是包含一个或多个抽象方法的类
package c5_11; import java.awt.*; import java.applet.*; abstract class Shapes //定义一个抽象类Shapes { public int x,y; //x、y为画图的坐标 public int width,height; public Shapes(int x,int y,int width,int height) { this.x= x; this.y= y; this.width= width; this.height= height; } abstract double getArea(); //求图形面积的抽象方法 abstract double getPerimeter(); //求图形周长的抽象方法 } class Square extends Shapes //由抽象类Shapes派生的子类——矩形类 { public double getArea() { return(width*height); } public double getPerimeter() { return(2*width+2*height); } public Square(int x,int y,int width,int height) { super(x,y,width,height); } } class Triangle extends Shapes //由抽象类Shapes派生的子类——三角形类 { public double c; //斜边 public double getArea() { return(0.5*width*height); } public double getPerimeter() { return(width+height+c); } public Triangle(int x,int y,int base,int height) { super(x,y,base,height); c= Math.sqrt(width*width+height*height); } } class Circle extends Shapes //由抽象类Shapes派生的子类——圆类 { public double r; //半径 public double getArea() { return(r*r*Math.PI); } public double getPerimeter() { return(2*Math.PI*r); } public Circle(int x,int y,int width,int height) { super(x,y,width,height); r= (double)width/2.0; } } public class c5_11 extends Applet { Square Box=new Square(5,15,25,25); Triangle tri=new Triangle(5,50,8,4); Circle Oval=new Circle(5,90,25,25); public void paint(Graphics g) { //画正方形 g.drawRect(Box.x,Box.y,Box.width,Box.height); g.drawString("Box Area:"+Box.getArea( ),50,35); g.drawString("Box Perimeter:"+Box.getPerimeter( ),50,55); g.drawString("tri Area:"+tri.getArea( ),50,75); g.drawString("tri Perimeter:"+tri.getPerimeter( ),50,95); g.drawOval(Oval.x,Oval.y,Oval.width,Oval.height); //画圆 g.drawString("oval Area:"+Oval.getArea( ),50,115); } }
5.2 接口
5.2.1 声明接口
[修饰符] interface 接口名 [extends 父接口名列表]
{
常量数据成员声明
抽象方法声明
}
-
接口定义用关键字interface而不是class
-
接口中定义的数据成员全是final static,即常量
-
接口中定义的成员方法默认是public abstract
-
接口没有自身的构造方法,所有成员方法都是抽象方法
-
接口也具有继承性,可通过extends声明该接口的父接口
5.2.2 类实现接口
-
在类中,用implements关键字就可以调用接口,若一个类要调用多个接口,可在implements用逗号隔开多个接口的名字
-
如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,且方法头部分应与接口中定义完全一致
-
如果实现某接口的类不是abstract的抽象类,则它可以不实现该接口所有的方法
-
在类实现方法时,不是显式地使用public修饰符
package 第5章; public class J5_18 { public static void main(String[] args) { Square box = new Square(5,10); Cirecle yuan = new Cirecle(2); System.out.println(box.getArea()); System.out.println(box.getPerimeter()); System.out.println(yuan.getArea()); System.out.println(yuan.getPerimeter()); } } //定义接口 Shapes interface Shapes{ double getArea(); //自动被定义成public abstract double getPerimeter(); //自动被定义成public abstract } //定义类 Square 实现接口 Shapes class Square implements Shapes{ public int width,height; Square(int width,int height){ this.width = width; this.height = height; } @Override public double getArea() { return width * height; } @Override public double getPerimeter() { return 2*width + 2*height; } } //定义类 Circle 实现接口 Shapes class Cirecle implements Shapes{ public int width; public double r; Cirecle(int width){ this.width = width; this.r = (double)width/2; } @Override public double getArea() { return 3 * r * r; } @Override public double getPerimeter() { return 2 * 3 * r; } }
最后
以上就是懦弱月饼为你收集整理的第五章 消息、继承、多态学习 2021.7.5第五章 消息、继承、多态的全部内容,希望文章能够帮你解决第五章 消息、继承、多态学习 2021.7.5第五章 消息、继承、多态所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复