实验四:类的继承
实验目的:
(1)掌握类的继承方法;
(2)变量的继承和覆盖,方法的继示、重载和覆盖实现;
二、实验内容
(1)根据下面的要求实现圆类Circle.
①圆类Cirle的成员变量: radius 表示圆的半径。
②圆类Cirdle的方法成员:
Circle () :构造方法,将半径置0
Circle (doubler) :构造方法:
创建Circle对象时将半径初始化为r
double getRadius () :获得圆的半径值
double getPerimeter () :获得圆的周长
void disp O :将圆的半径、圆的周长和圆的面积输出到屏幕
(2)维承第(1)题中的圆Circle类,派生圆柱体类Cylinder。要求如下:
①圆柱体类Cylinder的成员变量: height 表示圆柱体的高。
②圆柱体类Cylinder的成员方法:Cylinder (doubler, double h)构造方法,创建Cylinder对象时将圆半径初始化为r,圆柱高初始化为h
double getHecight () :获得圆柱体的高
double getVol () :获得圆柱体的体积
void dispVol () :将圆柱体的体积输出到屏幕
(3)按照第(2)题的Cylinder类,接上键盘的输入值作为圆的半径和圆柱体的高,计算圆柱体的体积。
(1)实验代码:
package 作业;
public class Circle {
private double radius; 定义
public Circle() { 无参构造,将半径设置为0
radius=0;
}
public Circle(double r) { 将半径初始化为r
radius=r;
}
public double getRadius() { 取得半径
return radius;
}
public void setRadius(double radius) { 设置半径
this.radius = radius;
}
public double getPerimeter() { 取得周长
return 2*Math.PI*radius;
}
public double getArea() { 取得面积
return Math.PI*Math.pow(radius,2);
}
public static void main(String[] args) {
Circle c = new Circle(4); 声明对象实例化Circle对象,并给radius赋值
System.out.println("周长:"+c.getPerimeter());
System.out.println("半径:"+c.getRadius()); 输出
System.out.println("面积:"+c.getArea());
}
}
本题难度不高,可以说很容易,因为是前几周以及学习过的内容了,再加上本周老师已经讲了如何编写求周长,面积代码,因此这题我很快就解决了
没有碰到什么问题。
(2)(3)实验代码:
注意我把(2)(3)的代码放一起了,因为可以说它们本来就可以算作一题
package 作业;
public class Cylinder extends Circle { 定义、继承
private double height;
public Cylinder(double h,double r) { 将圆半径初始化为r,圆柱高初始化为h
super(r); 指定调用父类中r的构造方法
this.setHeight(height);
}
public double getHeight() { 取得高
return height;
}
public void setHeight(double height) { 设置高
this.height = height;
}
public double getVol() { 调用父类求area的方法,取得体积
return super.getArea()*height;
}
public static void main(String[] args) { 声明和实例化对象,对高赋值,调用父类半径并赋值
Cylinder cy = null;
cy = new Cylinder(0,0);
cy.setRadius(5.0);
cy.height=6.0;
System.out.println("半径:"+cy.getRadius());
System.out.println("高:"+cy.getHeight()); 输出
System.out.println("体积:"+cy.getVol());
}
}
本题难度也不高,就是我出现了一些小错误,第一个就是忘记了用super或则this它们放在首行,第二个就是忘记通过构造方法设置radius了,
以为继承了就不用设置了,结果在下面测试类的时候,为其赋值,出现了错误。
本周小结:
自学了一点runtime类:
1.该类主要代表了应用程序的运行环境。一个RunTime就代表一个运行环境。
2.RunTime类常用的方法:
(1) getRuntime():该方法用于返回当前应用程序的运行环境对象。
(2) exec(String command):该方法用于根据指定的路径执行对应的可执行文件。
public class Demo7 {
public static void main(String[] args) throws IOException, InterruptedException {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("C:\Windows\notepad.exe");//打开记事本程序,并返回一个进程
Thread.sleep(3000); //让当前程序停止3秒。
process.destroy();
}
}
(3) freeMemory():该方法用于返回Java虚拟机中的空闲内存量,以字节为单位。
(4) maxMemory():该方法用于返回Java虚拟机试图使用的最大内存量。
(5) totalMemory():该方法用于返回Java虚拟机中的内存总量。
public class Demo8 {
public static void main(String[] args) throws IOException{
Runtime runtime = Runtime.getRuntime();
System.out.println("Java虚拟机中的空闲内存量:"+runtime.freeMemory());
System.out.println("Java 虚拟机试图使用的最大内存量:"+ runtime.maxMemory());
System.out.println("返回 Java 虚拟机中的内存总量:"+ runtime.totalMemory());
}
}
本周学习内容总结
接口:
1.接口的定义
使用interface来定义一个接口。接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成。定义接口的基本格式如下:
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
修饰符:可选,用于指定接口的访问权限,可选值为public。如果省略则使用默认的访问权限。
接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。
extends 父接口名列表:可选参数,用于指定要定义的接口继承于哪个父接口。当使用extends关键字时,父接口名为必选参数。
方法:接口中的方法只有定义而没有被实现。
接口被用来描述一种抽象。
因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。
接口也被用来实现解耦。
接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非final的变量,但是在接口中存在的变量一定是final,public,static的。
注意: 与Java的类文件一样,接口文件的文件名必须与接口名相同。
instanceof:
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。
它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,
显然,这是真的,所以返回true,也就是isObject的值为True。本周我们也就学习了把instanceof用在向下转型。保证程序不出现异常。
抽象类与接口的应用
1、为其实例化
在java中,可以通过对象的多态性,为抽象类和接口实例化,这样再使用抽象类和接口的时候就可以调用本子类中所覆写过的方法。
之所以抽象类和接口不能直接实例化,是因为其内部包含了抽象方法,抽象方法本身是未实现的方法,所以无法调用。
通过对象多态性可以发现,子类发生了向上转型关系之后,所调用的全部方法,都是被覆写过的方法。
努力学习,天天向上。