第一题继承的应用
定义宠物类( Pet ),猫类(Cat)和狗类(Dog)
1、宠物都有属性姓名(name)和年龄(age)
2、宠物都有吃(eat)、喝(drink)、叫(shout)的方法
3、猫有爬树( climbTree )的方法
4、狗有警戒( police)的方法
package Day0811;
public class demo2 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "cat";
cat.age = 3;
cat.drink();
cat.eat();
cat.shout();
cat.climTree();
Dog dog = new Dog();
dog.name = "dog";
dog.age = 3;
dog.eat();
dog.drink();
dog.shout();
dog.police();
}
}
package Day0811;
public class Pet {
public String name;
public int age;
public void eat(){
System.out.println("年龄"+this.age+"的"+this.name+"吃饭了!");
}
public void drink(){
System.out.println("年龄"+this.age+"的"+this.name+"喝水了!");
}
public void shout(){
System.out.println("年龄"+this.age+"的"+this.name+"在发出叫声!!");
}
}
package Day0811;
public class Cat extends Pet{
public void climTree(){
System.out.println("年龄"+super.age+"的"+super.name+"猫爬树了");
}
//在这个地方使用this和super暂时发现输出都一样,this调用本类,super调用父类
}
package Day0811;
public class Dog extends Pet{
public void police(){
System.out.println("年龄"+this.age+"的"+this.name+"狗在警戒!!");
}
}
package Day0811;
public class demo2 {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "cat";
cat.age = 3;
cat.drink();
cat.eat();
cat.shout();
cat.climTree();
Dog dog = new Dog();
dog.name = "dog";
dog.age = 3;
dog.eat();
dog.drink();
dog.shout();
dog.police();
}
}
第二题方法重写的应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ABfEXW7B-1628679445930)(https://i.loli.net/2021/08/11/ljIXaKt4FoCrYBz.png)]
// 下面的代码只是实现基本要求,没有完善,以后看情况
package Day0811;
public class demo3 {
public static void main(String[] args) {
BankCard bc = new BankCard();
bc.balance = 2000.0;
bc.draw(1000.0);
bc.deposit(1000.0);
CreditCard cc = new CreditCard();
cc.balance = 2000.0;
cc.draw(3000.0);
cc.deposit(2000.0);
}
}
package Day0811;
public class BankCard {
public static double balance;
//存钱
public void deposit(double money){
System.out.println("你的余额为:"+this.balance);
System.out.println("存钱过后的余额为:"+(this.balance+money));
}
//取钱
public void draw(double money){
System.out.println("你的余额为:"+this.balance);
System.out.println("取钱过后的余额为:"+(this.balance-money));
}
}
package Day0811;
public class CreditCard extends BankCard{
public double overdraft = 1000.0;
@Override
public void draw(double money){
System.out.println("你的余额为:"+this.balance);
System.out.println("你还可以透支的余额为:"+this.overdraft);
System.out.println("取钱过后的银行卡的余额为:"+(this.balance-money));
System.out.println("取钱过后的信用卡的余额为:"+(this.overdraft+(this.balance-money)));
}
}
第三题
定义银行卡和信用卡类,完成下列功能
1、完成银行卡的存取款方法
银行卡有余额,卡号,户主等属性
有存款和取款的方法(取款时候余额不足要有提示)
2、完成信用卡的取款方法
信用卡额外有透支额度属性
信用卡重写取款方法(取款时候余额不足要有提示)
3、写测试案例,分别测试银行卡和信用卡的存取款功能(存取款后显示余额)
// 额。。。差不多将上面那个优化了一下,除了测试类没有添加输入方法,这个我就不写了,剩下的还要进行优化,我也不继续优化了,知道怎么用就行了
package Day0811;
public class demo3 {
public static void main(String[] args) {
System.out.println("银行卡:");
BankCard bc = new BankCard();
bc.balance = 2000.0;
bc.deposit(1000.0);
bc.draw(1000.0);
System.out.println("信用卡:");
CreditCard cc = new CreditCard();
cc.balance = 2000.0;
cc.draw(3000.0);
cc.deposit(2000.0);
}
}
package Day0811;
import java.util.Scanner;
public class BankCard {
public double balance;
public double sum;
Scanner sc = new Scanner(System.in);
//存钱
public void deposit(double money){
sum = this.balance+money;
System.out.println("你的余额为:"+this.balance);
System.out.println("存钱过后的余额为:"+sum);
}
//取钱
public void draw(double money){
System.out.println("你的余额为:"+sum);
boolean flag = true;
while(flag){
if(money > sum){
System.out.println("余额不足!请重新输入要取出金额:");
money = sc.nextDouble();
}else{
System.out.println("取钱过后的余额为:"+(sum-money));
break;
}
}
}
}
package Day0811;
import java.util.Scanner;
public class CreditCard extends BankCard{
public double overdraft = 1000.0;
Scanner sc = new Scanner(System.in);
@Override
public void draw(double money){
double sum = this.balance + overdraft;
System.out.println("你银行卡的余额为:"+this.balance);
System.out.println("你可以取出的余额为:"+sum);
System.out.println("你还可以透支的余额为:"+this.overdraft);
boolean flag =true;
while(flag){
if(this.balance<money){
System.out.println("银行卡余额不足,需要透支信用卡!");
if(sum >= money){
System.out.println("取钱过后还可从银行卡和信用卡取出的的余额为:"+(sum-money));
System.out.println("银行卡的余额为:0");
break;
}else{
System.out.println("银行卡和信用卡加起来的余额不足!请重新输入要取出金额:");
money = sc.nextDouble();
}
}else{
System.out.println("银行卡余额足!银行卡还可以取出的金额为:"+(this.balance-money));
System.out.println("还可以透支的信用卡余额为:"+overdraft);
break;
}
}
}
}
第四题
通过继承实现员工工资核算打印功能
1、有员工类(父类),普通员工类(员工类的子类)和部门经理类(员工类的子类)
普通员工工资=单日工资* 天数 * 等级(1);部门经理工资=1000+单日工资天数等级(1.2)。
2、员工类的属性和方法
属性:单日工资,工作天数,工资等级静态常量
方法:打印工资方法
3、子类按照本类特点重写打印工资方法
4、写测试类,输出各类的工资(同时代码验证重写的规则)
package Day0811;
public class demo4 {
public static void main(String[] args) {
GeneralStaff gs = new GeneralStaff();
gs.dailyWage = 100.0;
gs.day = 20;
gs.grade = 1.0;
gs.print();
Manager m = new Manager();
m.dailyWage = 100.0;
m.day = 20;
m.grade = 1.0;
m.print();
}
}
package Day0811;
public class Manager extends Employee{
@Override
public void print() {
System.out.println("部门经理的工资为:"+(1000.0+dailyWage*day*grade));
}
}
package Day0811;
public class GeneralStaff extends Employee{
@Override
public void print() {
System.out.println("普通员工的工资为:"+(dailyWage*day*grade));
}
}
package Day0811;
public class Employee {
public static double dailyWage;
public static int day;
public static double grade;
public void print(){
}
}
第五题综合应用1
- 张老太养了两只猫:一只叫小花,今年3岁白色。另一只叫小白,今年3岁花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字、年龄、颜色。如果输入的小猫名错误,则显示:张老太没有这只猫。
实现思路:
- 创建猫类,定义三个变量:姓名 年龄 颜色,变量均私有
- 给这3个变量提供set和get方法
- 定义打印信息的方法
- 创建测试类
- 创建2只猫,用set方式赋值,信息和题意一致
- 创建键盘录入对象,录入猫的姓名
- 判断键盘录入的姓名和这2只猫的姓名是否一致,如果一致就打印这只猫的信息,
如果不一致提示没有这只猫,请重新输入
- 评分标准:
(1) 正确创建猫类 (10分)
(2) 正确定义私有属性和方法(10分)
(3) 正确定义打印方法(10分)
(4) 创建测试类,创建两个对象(10分)
(5) 正确输入猫的信息(10分)
(6) 判断两只猫是否是同一个猫(10分)
(7) 打印输出信息(10分)
(8) 正确调用方法,输出信息(10分)
(9) 添加注释(5分)
package Day0810;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Cat c1 = new Cat("小花","白色",3);
Cat c2 = new Cat("小白","花色",3);
System.out.print("请输入名字:");
String name ;
name = sc.next();
while(true){
if(name.equals(c1.getName())){
c1.print();
break;
}else if(name.equals(c2.getName())){
c2.print();
break;
}else{
System.out.println("张老太没有这只猫,请重新输入");
name = sc.next();
}
}
}
}
package Day0810;
import java.util.Scanner;
public class demo1 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Cat c1 = new Cat("小花","白色",3);
Cat c2 = new Cat("小白","花色",3);
System.out.print("请输入名字:");
String name ;
name = sc.next();
while(true){
if(name.equals(c1.getName())){
c1.print();
break;
}else if(name.equals(c2.getName())){
c2.print();
break;
}else{
System.out.println("张老太没有这只猫,请重新输入");
name = sc.next();
}
}
}
}
第六题综合应用2
- 按要求完成以下题目:
案例效果:
卡车的收费为: 600000.0
火车的收费为: 1250000.0
案例题目描述:
A. 编写两个类继承运输工具类:卡车类、火车类
要求:
(1)添加两个变量,并进行封装。
(2)添加无参构造方法和有参构造方法,并通过有参构造为重量和距离两个变量赋值
(3) 重写父类计算运费的方法如下:
a. 卡车:运费=重量x距离x120,当距离大于1000(km)或者重量大于60(t)的时候拒载,拒载时间方法返回-1。
b. 火车:当距离在900(km)内(包含900)时,运费=重量x距离X250,大于900(km)时,运费=重量x距离x300。
B. 编写测试类,创建卡车和火车类对象,调用计算运费方法
- 评分标准:
(1) 正确定义工具类 (10分)
(2) 正确定义火车类(10分)
(3) 正确定义卡车类(10分)
(4) 卡车重写父类方法(10分)
(5) 火车重写父类方法(10分)
(6) 正确定义各类的方法(10分)
(7) 创建测试类,创建对象调用方法(10分)
(8) 输出所有变量信息(10分)
(9) 添加注释(5分)
package Day0811;
public class demo5 {
public static void main(String[] args) {
Truck tc = new Truck(60,800);
Train ta = new Train(60,80);
System.out.println("货车:-----------");
tc.Carriage();
System.out.println("火车:-----------");
ta.Carriage();
}
}
package Day0811;
public class Tool {
public double weight; //重量
public double distance; //距离
public Tool(double weight, double distance) {
super();
this.weight = weight;
this.distance = distance;
}
public Tool() {
super();
}
public void Carriage(){
}
}
package Day0811;
public class Truck extends Tool{
@Override
public void Carriage() {
double sum;
if(time() == -1){
System.out.println("拒载");
}else{
sum = weight * distance * 120.0;
System.out.println("货物的重量是:"+weight);
System.out.println("货物的运送的距离是:"+distance);
System.out.println("运费为:"+sum);
}
}
public int time(){
int index = 1;
if(weight>60 || distance>1000){
index = -1;
}
return index;
}
public Truck(double weight, double distance) {
super();
this.weight = weight;
this.distance = distance;
}
}
package Day0811;
public class Train extends Tool{
@Override
public void Carriage() {
double sum;
if(this.distance <= 900){
sum = weight * distance * 250.0;
System.out.println("货物的重量是:"+weight);
System.out.println("货物的运送的距离是:"+distance);
System.out.println("运费为:"+sum);
}else{
sum = weight * distance * 300.0;
System.out.println("货物的重量是:"+weight);
System.out.println("货物的运送的距离是:"+distance);
System.out.println("运费为:"+sum);
}
}
public Train(double weight, double distance) {
super();
this.weight = weight;
this.distance = distance;
}
}
拓展练习
第一题
建立一个汽车Auto类,包括轮胎个数,汽车颜色,车身重量、速度等成员变量。并通过不同的构造方法创建实例。至少要求: 汽车能够加速,减速,停车。 再定义一个小汽车类Car,继承Auto,并添加空调、CD等成员变量,覆盖加速,减速的方法
package Day0811;
public class test1 {
public static void main(String[] args) {
Auto a = new Auto(4,"红色",9,75.0);
a.speedUp();
a.speedDown();
a.parking();
Car c = new Car();
c.color = "白";
c.speed = 195.0;
c.weight = 3;
c.setAc("格力");
c.setCD("死了都要爱");
c.tyre = 4;
c.speedDown();
c.speedUp();
c.parking();
}
}
package Day0811;
public class Auto {
public int tyre;
public String color;
public double weight;
public double speed;
public void speedUp(){
System.out.println("重"+this.weight+"吨的"+this.tyre+"轮"+this.color+"汽车以"+this.speed+"的速度加速了!");
}
public void speedDown(){
System.out.println("重"+this.weight+"吨的"+this.tyre+"轮"+this.color+"汽车以"+this.speed+"的速度减速了!");
}
public void parking(){
System.out.println("重"+this.weight+"吨的"+this.tyre+"轮"+this.color+"汽车以"+this.speed+"的速度停车了!");
}
public Auto() {
super();
}
public Auto(int tyre, String color, double weight, double speed) {
super();
this.tyre = tyre;
this.color = color;
this.weight = weight;
this.speed = speed;
}
}
package Day0811;
public class Car extends Auto{
private String ac;
private String CD;
public String getAc() {
return ac;
}
public void setAc(String ac) {
this.ac = ac;
}
public String getCD() {
return CD;
}
public void setCD(String cD) {
CD = cD;
}
@Override
public void speedUp() {
System.out.println("重"+this.weight+"吨的"+this.tyre+"轮"+this.color+"色的小汽车以"
+this.speed+"的速度加速了!"+"并且拥有"+this.ac+",放着"+this.CD+"过来了");
}
@Override
public void speedDown() {
System.out.println("重"+this.weight+"吨的"+this.tyre+"轮"+this.color+"色的小汽车以"
+this.speed+"的速度减速了!"+"并且拥有"+this.ac+",放着"+this.CD+"过来了");
}
}
第二题
写一个Person类,有编号id,姓名name,职位job。
构造方法带三个参数。
方法:
登陆login
注册register
自我介绍talk
写一个学生Student类继承Person类,方法有:考试test
属性有:学费money
写一个老师Teacher类继承Person类,
属性有 工资salary
方法有:工作work
写一个测试类TestPerson,测试学生和老师
学生:姓名-张三 职位-学生 学费-18000
老师:姓名-李四 职位-老师 工资-8000
package Day0811;
public class TestPerson {
public static void main(String[] args) {
Student stu = new Student();
stu.name = "张三";
stu.job = "学生";
stu.id = "001235";
stu.setMoney(18000);
stu.register();
stu.login();
stu.talk();
stu.test();
Teacher tc = new Teacher();
tc.name = "李四";
tc.job = "老师";
tc.id = "000001";
tc.setSalary(8000.0);
tc.register();
tc.login();
tc.talk();
tc.work();
}
}
package Day0811;
public class Person {
public String id;
public String name;
public String job;
public void login(){
System.out.println(this.name+"登录");
}
public void register(){
System.out.println(this.name+"正在注册");
}
public void talk(){
System.out.println(this.name+"正在自我介绍:");
System.out.println("我的名字是:"+this.name+
",我的编号是:"+this.id+",我的职位是:"+this.job);
}
public Person() {
super();
}
public Person(String id, String name, String job) {
super();
this.id = id;
this.name = name;
this.job = job;
}
}
package Day0811;
public class Student extends Person{
private double money;
public void test(){
System.out.println(this.name+"正在考试");
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
package Day0811;
public class Teacher extends Person{
private double salary;
public void work(){
System.out.println(this.name+"老师正在工作!");
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
第三题
定义一个父类:形状类Shapes,里面有两个方法,分别是求面积和周长。
定义一个子类:矩形Rectangle
定义一个子类:三角形 Triagle
定义一个子类:圆 Circle
定义一个测试类:传入圆的半径4 输出周长和面积
传入矩形的长和宽4,5 输出周长和面积
传入三角形三边:3,4,5 输出周长和面积
package Day0811;
public class Test2 {
public static void main(String[] args) {
Rectangle rc = new Rectangle();
rc.low = 100.0;
rc.high = 50.0;
rc.area();
rc.perimeter();
Circle c = new Circle();
c.radius = 20.0;
c.area();
c.perimeter();
Triagle t = new Triagle();
t.high = 3.0;
t.low = 4.0;
t.radius = 5.0;
t.area();
t.perimeter();
}
}
package Day0811;
public class Shapes {
public double low;
public double high;
public double radius;//半径
public void area(){
}
public void perimeter(){
}
}
package Day0811;
public class Rectangle extends Shapes {
@Override
public void area() {
System.out.println("矩形的面积为:"+(this.low*this.high));
}
@Override
public void perimeter() {
System.out.println("矩形的周长为:"+(this.low+this.high)*2);
}
}
package Day0811;
public class Triagle extends Shapes{
@Override
public void area() {
System.out.println("三角形的面积为:"+(this.low*this.high));
}
@Override
public void perimeter() {
System.out.println("三角形的周长为:"+(this.low+this.high+this.radius));
}
}
package Day0811;
public class Circle extends Shapes{
@Override
public void area() {
System.out.println("圆的面积为:"+(3.14 * this.radius * this.radius));
}
@Override
public void perimeter() {
System.out.println("圆的周长为:"+(2*3.14*this.radius));
}
}
lic void area(){
}
public void perimeter(){
}
}
package Day0811;
public class Rectangle extends Shapes {
@Override
public void area() {
System.out.println("矩形的面积为:"+(this.low*this.high));
}
@Override
public void perimeter() {
System.out.println("矩形的周长为:"+(this.low+this.high)*2);
}
}
package Day0811;
public class Triagle extends Shapes{
@Override
public void area() {
System.out.println("三角形的面积为:"+(this.low*this.high));
}
@Override
public void perimeter() {
System.out.println("三角形的周长为:"+(this.low+this.high+this.radius));
}
}
package Day0811;
public class Circle extends Shapes{
@Override
public void area() {
System.out.println("圆的面积为:"+(3.14 * this.radius * this.radius));
}
@Override
public void perimeter() {
System.out.println("圆的周长为:"+(2*3.14*this.radius));
}
}
问题?
为什么有时候子类继承父类时,子类必须需要添加构造方法,否则会报错?但是我上面的那些继承都不用,但是也可以运行?
问题出现原因:
https://blog.csdn.net/yyuggjggg/article/details/119633332