子类父类调用及方法重写(override)
Shape类
定义一个形状类Shape,提供计算周长getPerimeter()和面积getArea()的函数
定义一个子类正方形类Square继承自Shape类,拥有边长属性,提供构造函数,能够计算周长getPerimeter()和面积getArea()
定义一个子类长方形类Rectangle继承自Square类,拥有长、宽属性,提供构造函数,能够计算周长getPerimeter()和面积getArea()
定义一个子类圆形类Circle继承自Shape,拥有半径属性,提供构造函数,能够计算周长getPerimeter()和面积getArea()
在main函数中,分别构造三个子类的对象,并输出他们的周长、面积.
提示:用System.out.printf("%.2f",d)进行格式化输出
输入描述:
正方形类的边长
长方形类的长宽
圆类的半径
输出描述:
正方形的周长、面积
长方形的周长、面积
裁判测试程序样例:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
double length = scan.nextDouble();
Square s = new Square(length);
System.out.printf("%.2f ",s.getPerimeter());
System.out.printf("%.2f\n",s.getArea());
length = scan.nextDouble();
double wide = scan.nextDouble();
Rectangle r = new Rectangle(length,wide);
System.out.printf("%.2f ",r.getPerimeter());
System.out.printf("%.2f\n",r.getArea());
double radius = scan.nextDouble();
Circle c = new Circle(radius);
System.out.printf("%.2f ",c.getPerimeter());
System.out.printf("%.2f\n",c.getArea());
scan.close();
}
}
/* 你的代码被嵌在这里 */
输入样例:
在这里给出一组输入。例如:
1
1 2
2
输出样例:
在这里给出相应的输出。例如:
4.00 1.00
6.00 2.00
12.57 12.57
题解分析:
主要要搞清楚父类和子类的继承关系,在子类里可以重写父类的方法。本题使用abstract类(抽象类)较适合,那么必须在非abstract类的子类中重写父类中的abstract方法。如果该子类是abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法。
题解:
abstract class Shape{
public abstract double getPerimeter();
public abstract double getArea();
}
class Square extends Shape{
double length;
public Square(double length){
this.length =length;
}
public double getArea(){
return length*length;
}
public double getPerimeter(){
return 4*length;
}
}
class Rectangle extends Shape{
double width,length;
public Rectangle(double length, double width) {
this.length=length;
this.width=width;
}
public double getPerimeter(){
return 2*(length+width);
}
public double getArea(){
return length*width;
}
}
class Circle extends Shape{
double radius;
Circle(double radius){
this.radius =radius;
}
@Override
public double getPerimeter() {
return 2*Math.PI*radius;
}
@Override
public double getArea() {
return Math.PI*radius*radius; //直接利用java中的Math.PI
}
}
2.
根据派生类写出基类(Java)
裁判测试程序样例中展示的是一段定义基类People、派生类Student以及测试两个类的相关Java代码,其中缺失了部分代码,请补充完整,以保证测试程序正常运行。
函数接口定义:
提示:
观察派生类代码和main方法中的测试代码,补全缺失的代码。
裁判测试程序样例:
注意:真正的测试程序中使用的数据可能与样例测试程序中不同,但仅按照样例中的格式调用相关方法(函数)。
classPeople{
protected String id;
protected String name;
/** 你提交的代码将被嵌在这里(替换此行) **/}
classStudentextendsPeople{
protected String sid;
protectedint score;
publicStudent(){
name = "Pintia Student";
}
publicStudent(String id, String name, String sid, int score){
super(id, name);
this.sid = sid;
this.score = score;
}
publicvoidsay(){
System.out.println("I'm a student. My name is " + this.name + ".");
}
}
publicclassMain{
publicstaticvoidmain(String[] args){
Student zs = new Student();
zs.setId("370211X");
zs.setName("Zhang San");
zs.say();
System.out.println(zs.getId() + " , " + zs.getName());
Student ls = new Student("330106","Li Si","20183001007",98);
ls.say();
System.out.println(ls.getId() + " : " + ls.getName());
People ww = new Student();
ww.setName("Wang Wu");
ww.say();
People zl = new People("370202", "Zhao Liu");
zl.say();
}
}
输入样例:
在这里给出一组输入。例如:
(无)
输出样例:
在这里给出相应的输出。例如:
I'm a student. My name is Zhang San.
370211X , Zhang San
I'm a student. My name is Li Si.
330106 : Li Si
I'm a student. My name is Wang Wu.
I'm a person! My name is Zhao Liu.
题解分析:把基本函数get和set写好即可,注意格式输出中的感叹号!!!
public People(){} //需要无参构造
public People(String id,String name){ //有参构造
this.id = id;
this.name =name;
}
public void setId(String s){
this.id=s;
}
public void setName(String name) {
this.name=name;
}
public String getId() {
return id;
}
public String getName(){
return name;
}
public void say(){
System.out.println("I'm a person! My name is "+this.name+".");
}
4.统计字符串中字符的个数
通过键盘输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
统计一行字符串中的英文字母个数、空格个数、数字个数、其他字符个数
输入格式:
通过键盘输入一行字符(任意字符)
输出格式:
统计一行字符串中的英文字母个数、空格个数、数字个数、其他字符个数
输入样例:
rwrwewre2345asdJSJQI%^&(& *&sdf YY( 2342-k'
输出样例:
字母个数:22
数字个数:8
空格个数:5
其他字符个数:10
题解分析可以使用java中的工具类判断字符个数,空格个数等
要特别注意输出
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int cout1 = 0;
int cout2 = 0;
int cout3 = 0;
int cout4 = 0;
//System.out.println("请输入一行字符:");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
char[] arr = s.toCharArray(); //将字符串转换为字符数组
//System.out.println(Arrays.toString(arr));
for (int i = 0; i < arr.length; i++) {
if(Character.isLetter(arr[i])){
cout1++;
}
else if(Character.isDigit(arr[i])){
cout2++;
}
else if(arr[i]==' '){
cout3++;
}
else {
cout4++;
}
}
System.out.println("字母个数:"+cout1);
System.out.println("数字个数:"+cout2);
System.out.println("空格个数:"+cout3);
System.out.println("其他字符个数:"+cout4);
}
}
5.钱币
编写程序,读取用户输入的代表总金额的double值,打印表示该金额所需的最少纸币张数和硬币个数,打印从最大金额开始。纸币的种类有十元、五元、一元,硬币的种类有五角、一角、贰分、壹分。
提示:
由于java浮点数精度问题,建议输入金额后做如下处理:
double totalMoney = in.nextDouble();
int total = (int)(totalMoney*1000);
输入格式:
47.63
输出格式:
4 张十元
1 张五元
2 张一元
1 个五角
1 个一角
1 个贰分
1 个壹分
输入样例:
47.63
输出样例:
4 张十元
1 张五元
2 张一元
1 个五角
1 个一角
1 个贰分
1 个壹分
题解:换算问题,不是很会
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
float input = scanner.nextFloat(); //几元
int num = (int) (input * 100); // 几分 //强制转换 //这里乘了100,成了整数
int a = num / 1000; // 几张十元
num = num - a * 1000; //相当于这里把所有的十元给客人了
int b = num /500; // 几张五元
num = num - b * 500; //相当于把十元五元都给了,准备给更小单位的钱
int c = num / 100; // 几张一元
num = num - c * 100;
int d = num / 50; // 几个五角
num = num - d * 50;
int e = num / 10; // 几个一角
num = num - e *10;
int f = num / 2; // 几个两分
num = num - f * 2; // 几个一分
System.out.println(a +" "+ "张十元");
System.out.println(b +" "+ "张五元");
System.out.println(c +" "+ "张一元");
System.out.println(d +" "+ "个五角");
System.out.println(e +" "+ "个一角");
System.out.println(f +" "+ "个贰分");
System.out.println(num +" "+ "个壹分");
}
}
此处感谢,某帅哥
小江的江(最后一题来自他的代码)
总结今日学习:父类子类的调用,基本定义方法,重写方法。