标签:优先 构造 实用 的区别 设计模式 问题 不同 输出 异常类
实验四 类的继承
(一)抽象类的使用
2.编程技巧
(1) 抽象类定义的方法在具体类要实现;
(2) 使用抽象类的引用变量可引用子类的对象;
(3) 通过父类引用子类对象,通过该引用访问对象方法时实际用的是子类的方法。可将所有对象存入到父类定义的数组中。
实验代码:
package main; public abstract class Shape { private double area;//定义面积 public double getArea() { return area; } public void setArea(double area) { this.area = area; } public abstract double area();//取得信息,定义抽象方法 }
package main; public class Circle extends Shape {//子类通过继承抽象类 private double radius;//定义圆的半径 public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public Circle(double radius) {//为属性赋值 this.radius=radius; } public double area() {//覆写抽象类中的抽象方法 return Math.PI*Math.pow(radius, 2);//计算面积 } }
package main; public class Rectangle extends Shape {//子类通过继承抽象类 private double width,high;//定义矩形宽和高 public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getHigh() { return high; } public void setHigh(double high) { this.high = high; } public Rectangle(double width,double high) {//为属性赋值 this.high=high; this.width=width; } public double area() {//覆写抽象类中的抽象方法 return width*high;//计算面积 } }
package main; public class Triangle extends Shape {//子类通过继承抽象类 private double a,b,c;//定义三角形三边 public double getA() { return a; } public void setA(double a) { this.a = a; } public double getB() { return b; } public void setB(double b) { this.b = b; } public double getC() { return c; } public void setC(double c) { this.c = c; } public Triangle(double a,double b,double c) {//为属性赋值 this.a=a; this.b=b; this.c=c; } public double area() {//覆写抽象类中的抽象方法 if(a+b>c&&a+c>b&&b+c>a)//判断是否能组成三角形 { double p=(a+b+c)/2; return Math.sqrt((p*(p-a)*(p-b)*(p-c)));//计算面积 } else return 0;//若不能组成三角形,则输出面积为0 } }
package main; public class test { public static void main(String[] args) { Shape tr=new Triangle(3,4,5); Shape re=new Rectangle(4,5); Shape ci=new Circle(4);//实例化子类对象 System.out.println("三角形的面积为:"+tr.area());//调用被子类覆写过的方法 System.out.println("矩形的面积为:"+re.area()); System.out.println("圆的面积为:"+ci.area()); //输出图形面积 } }
实验结果截图:
实验的过程和问题:
做这个问题时,按题目的要求定义了一个抽象类Shape,我建立了多个类,这样感觉思路更加清晰,每个类写的代码都差不多,知道每个图形面积计算的方法就可以覆写抽象类的抽象方法写出来,在计算三角形面积时要判断是否能组成三角形。
(二)使用接口技术
1定义接口Shape,其中包括一个方法size(),设计“直线”、“圆”、类实现Shape接口。分别创建一个“直线”、“圆”对象,将各类图形的大小输出。
(1) 接口中定义的方法在实现接口的具体类中要重写实现;
(2) 利用接口类型的变量可引用实现该接口的类创建的对象。
实验代码:
package main1; interface Shape { //定义Shape接口 public void size(); //size()方法 } class Line implements Shape{//子类实现接口 private double length;//定义直线的长度 public double getLength() { return length; } public void setLength(double length) { this.length = length; } public Line(double length) { //为属性赋值 this.length = length; } public void size() { // 覆写Shape接口的抽象方法 System.out.println("直线的长度为:"+this.length); } } class Circle implements Shape{//子类实现接口 private double radius;//定义圆的半径 public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public Circle(double radius){ this.radius=radius; //为属性赋值 } public void size() {//覆写Shape接口的抽象方法 System.out.println("圆的面积为:"+Math.PI*radius*radius); } } public class test { public static void main(String[] args){ Shape li=new Line(6); Shape ci=new Circle(5); //通过子类为接口实例化 li.size(); ci.size(); //调用被子类覆写的方法 } }
实验结果截图:
实验的结果和问题:
这一题是用接口写的,看了书上的代码感觉接口和抽象类差别不大,还是有点分不清,后来看了书上的对比,又在这道题实践了一下,才发现了一些差别,列如接口只有常量和抽象方法,但二者的优劣势还是看不出来,可能要在更复杂的问题才分的出来。
学习课程总结
抽象类与接口的关系
序号 |
区别点 |
抽象类 |
接口 |
1 |
定义 |
包含一个抽象方法的类 |
抽象方法和全局常量的集合、 |
2 |
组成 |
构造方法、抽象方法、普通方法、常量、变量 |
常量、抽象方法 |
3 |
使用 |
子类继承抽象类 |
子类实现接口 |
4 |
关系 |
抽象类可以实现多个接口 |
接口不能继承抽象类,但允许继承多个接口 |
5 |
常见设计模式 |
模板设计 |
工厂设计、代理设计 |
6 |
对象 |
都通过对象的多态性产生实例化对象 |
|
7 |
局限 |
抽象类有单继承的局限 |
接口没有单继承的局限 |
8 |
实际 |
作为一个模板 |
是作为一个标准或是表示一种能力 |
9 |
选择 |
如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限 |
|
10 |
特殊 |
一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类 |
异常:
try{
被检测的代码
可能出现异常的代码
}catch(异常类名 变量){
异常的处理方式
循环,判断,调用方法,变量
}finally{
必须要执行的代码
}
异常中的关键字:throw 在方法的内部,抛出异常对象,throws用于方法的声明上,表名此方法可能出现异常请调用者处理,throws 后面必须写异常类的类名,
学习总结:本周学习的主要是接口和抽象类,现在可以用他们写程序,但是除了字符上还是没有找到它们明显的区别,可能以后在写代码过程中会更加理解它们的不同,但其实用抽象类和接口写代码还是挺方便的,感觉还不错。
标签:优先 构造 实用 的区别 设计模式 问题 不同 输出 异常类
原文地址:https://www.cnblogs.com/198266qq/p/11656622.html