Java面向对象 - 封装、继承和多态的综合练习(答案+知识点总结)第1关:封装、继承和多态进阶(一)+ 第2关:封装、继承和多态进阶(二)

目录

第1关:封装、继承和多态进阶(一)

报错总结 & 注意事项:

第2关:封装、继承和多态进阶(二) 

 源码:

报错总结 & 注意事项:

思维导图免费制作网站: 功能强大

学习方法:头歌中左侧知识点的解释还有右侧代码的提示模块非常清晰,我们可以:

①观察代码整体模块②尝试写代码③不清楚知识点,再将左侧解析放在实例当中去看 [那些注释都给我们写好了,对应注释去敲代码]

如果我们实在啥也不会,参考他人代码,那么也不要全部照抄

【例如】抄完有参构造实例化对象Dog后,自己去敲Cat

第1关:封装、继承和多态进阶(一)

package case1;

import java.util.Scanner;

public class Task1 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String dogName = sc.next();
		String dogSex = sc.next();
		String dogColor = sc.next();
		String catName = sc.next();
		String catSex = sc.next();
		double catWeight = sc.nextDouble();
		/********* begin *********/
		Dog dog = new Dog(dogName,dogSex,dogColor); // 通过有参构造函数实例化Dog类对象dog
		dog.talk(); // dog调用talk()方法
		dog.eat();  // dog调用eat()方法
		/********* end *********/
        /********* begin *********/
		Cat cat = new Cat(catName,catSex,catWeight);// 通过有参构造函数实例化Cat类对象cat
		cat.talk();// cat调用talk()方法
		cat.eat(); // cat调用eat()方法
		/********* end *********/
	}
}

abstract class Pet {
	/********* begin *********/
    String name;// 构造函数初始化name和sex
    String sex;
    Pet(){}  // 定义抽象类Pet,作为基类
    Pet(String name,String sex){ //类中定义2个
        this.name = name;//封装属性name
        this.sex = sex;//封装属性sex
    }
    public abstract void talk(); // 声明抽象方法talk()
    public abstract void eat();  // 声明抽象方法eat()
	/********* end *********/
}
  
class Dog extends Pet { // Dog类继承自Pet类
	/********* begin *********/
    String color;//封装属性color
    public Dog(String name,String sex,String color){
        this.name = name; // 构造函数初始化name、sex和color
        this.sex = sex;
        this.color = color;
    }

    public void talk(){ // 实现自己的talk()方法和eat()方法
        System.out.println("名称:" +name+ ",性别:" +sex+ ",颜色:" +color+ ",汪汪叫");
    }                  // talk()输出'名称:name,性别:sex,颜色:color,汪汪叫'

    public void eat(){ // eat()输出'name吃骨头'
        System.out.println(name+ "吃骨头!");
    }
	/********* end *********/
}


class Cat extends Pet {  // Cat类继承自Pet类 
	/********* begin *********/
    double weight; 
    Cat(String name,String sex,double weight){
        this.name = name; // 构造函数初始化name、sex和weight
        this.sex = sex;
        this.weight = weight; //封装属性weight
    }
    // 实现自己的talk()方法和eat()方法
    public void talk(){
        System.out.println("名称:" +name+ ",性别:" +sex+ ",体重:" +weight+ "kg,喵喵叫");// talk()输出
    }

    public void eat(){
        System.out.println(name+ "吃鱼!"); // eat()输出
    }
	/********* end *********/
}

报错总结 & 注意事项:

1.  最头疼的一个问题,没有代码,题目本身这里显示有问题。代码部分明明正确啊! 

2. 此处的new 后面应该是Dog类

Dog dog = new Dog(dogName,dogSex,dogColor);

3.此处后面无标点符号

 Pet(){}  

4. 抽象方法声明:

1.public(公有的):可以被该类的和非该类的任何成员访问。
2.private(私有的):仅仅可以被该类的成员访问,任何非该类的成员一概不能访问。(主要是隐藏数据来保证数据的安全性)
3.protected(保护的):仅仅可以被子类和类本身还有同一个包里的类访问

 public abstract void talk(); 

自动默认public类型,代码中所有的public都可以省去不写

第2关:封装、继承和多态进阶(二) 

 源码:

package case2;

import java.util.Scanner;

public class Task2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String cName = sc.next();
		String cSex = sc.next();
		int cAge = sc.nextInt();

		String eName = sc.next();
		String eSex = sc.next();
		int eAge = sc.nextInt();
        // 创建测试类对象test
		Person test;
        // 创建Person类对象person1,引用指向中国人,通过有参构造函数实例化中国人类对象
        Person person1 = new Chinese(cName,cSex, cAge);
        showEat(person1);// 通过showEat()方法调用Chinese的eat()方法
		//showEat(new Chinese(cName,cSex,cAge));
        // 创建Person类对象person2,引用指向英国人,通过有参构造函数实例化英国人类对象
        Person person2 = new English(eName,eSex,eAge);
        showEat(person2);// 通过showEat()方法调用English的eat()方法
	
		// 强制类型转换(向下转型) 调用Chinese类特有的方法shadowBoxing()
        /********* begin *********/
        Chinese d = (Chinese)person1;
        d.shadowBoxing();
		/********* end *********/
		// 强制类型转换(向下转型) 调用English类特有的方法horseRiding()
		/********* begin *********/
        English e = (English)person2;
        e.horseRiding();
		/********* end *********/
	}

	
	/********* begin *********/
    public static void showEat(Person p){// 定义showEat方法,使用父类作为方法的形参,实现多态
        p.eat();//传入的是哪个具体对象就调用哪个对象的eat()方法
    }
	/********* end *********/
}

abstract class Person {// 抽象类Person 封装属性name、sex和age
	/********* begin *********/
    public String name; // 构造函数初始化name、sex和age
    public String sex;
    public int age;
    abstract void eat();// 声明抽象方法eat()
	/********* end *********/
}

class Chinese extends Person { // Chinese类继承自Person类
	/********* begin *********/
    public String name; // 构造函数初始化name、sex和age
    public String sex;
    public int age;
    Chinese(String name,String sex,int age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    void eat(){// 重写父类方法eat()
        System.out.println("姓名:" +name+ ",性别:" +sex+ ",年龄:" +age+ ",我是中国人,我喜欢吃饭!");
    }
    void shadowBoxing(){// 定义子类特有方法,当父类引用指向子类对象时无法调用该方法 输出
        System.out.println(name+"在练习太极拳!");
    }
	/********* end *********/
}


class English extends Person { // English类继承自Person类
	/********* begin *********/
    String name;// 构造函数初始化name、sex和age
    String sex;
    int age;
    English(String name,String sex,int age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    void eat(){// 重写父类方法eat() 输出
        System.out.println("姓名:" +name+ ",性别:" +sex+ ",年龄:" +age+ ",我是英国人,我喜欢吃三明治!");
    }
    void horseRiding(){
        System.out.println(name+ "在练习骑马!");// 定义子类特有方法,当父类引用指向子类对象时无法调用该方法 输出
    }
	/********* end *********/
}

报错总结 & 注意事项:

1.看见题目注释位置是单引号,一开始打了单引号

单引号:引的数据 是char类型的 单引号只能引一个字符(表示单个字符

双引号:双引号引的数据 是String类型的 而双引号可以引0个及其以上(引用字符串)

报错原因:定义的String类型

System.out.println(name+"在练习太极拳!");

 2. 最容易漏掉“   ;  ”

Java当中有分号,Python因为简单没有分号!

思维导图免费制作网站: 功能强大

https://www.processon.com/diagramshttps://www.processon.com/diagrams

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考软件设计师下午试题一

数据流图基本图形元素 外部实体 外部系统是当前系统之外的系统 数据存储 在里面存储数据后还能取出来用 跟实体没有关系,他负责存储加工的数据或者提供数据给加工 加工 灰洞的解释比如输入需要两个才能得到输出的,但是他只输入了一个就是灰洞 数…

Matlab傅里叶级数展开(附结果图)

Matlab傅里叶级数展开(附结果图) 代码下载链接 代码下载链接 代码下载链接 如下图所示:

“唯一靶点”的华堂宁会成控糖爆品吗?

一上市,两次“断货”的货华堂宁有爆品那味儿了。 2022年10月28日华领医药-B(02552.HK)公告华堂宁(多格列艾汀)正式进入商业化,一周后各个渠道便进入到了断货和限售的状态。 对于一个不在传统九大降糖药品…

元宇宙与网络安全

元宇宙是一种虚拟现实空间,用户可以在计算机生成的环境中进行互动。元宇宙的应用范围很广,比如房地产,医疗,教育,军事,游戏等等。它提供了更具沉浸感的体验,更好地现实生活整合,以及…

组件、套件、 中间件、插件

组件、套件、 中间件、插件 组件 位于框架最底层,是由重复的代码提取出来合并而成。组件的本质,是一件产品,独立性很强,组件的核心,是复用,与其它功能又有强依赖关系。 模块 在中台产品和非中台产品中&…

C语言程序环境和预处理

文章目录程序的翻译环境和执行环境详解编译和链接翻译环境编译本身也分为几个阶段预处理编译汇编链接段表符号表的合并预处理详解预定义符号#define#define 定义标识符#define定义宏#define替换规则#和#### 的作用带副作用的宏参数宏和参数的对比宏和函数的一个对比命名约定#un…

FastestDet:比yolov-fastest更快!更强!全新设计的超实时Anchor-free目标检测算法

本篇文章转自于知乎——qiuqiuqiu,主要设计了一个新颖的轻量级网络! 代码地址:https://github.com/dog-qiuqiu/FastestDet 1 概述 FastestDet是设计用来接替yolo-fastest系列算法,相比于业界已有的轻量级目标检测算法如yolov5n, yolox-nano, nanoDet, pp-yolo-tiny, Fast…

CSS基础知识,必须掌握!!!

CSS基础知识Background(背景)CSS文本格式文本颜色文本对齐格式文本修饰文本缩进CSS中的字体字体样式字体大小CSS链接(link)CSS列表不同列表标项CSS列表项用图片作为标记CSS列表标记项位置CSS中表格(table)表…

Shell脚本之嵌套循环与中断跳出

1、双重循环 1.1 格式 #!/bin/bash for ((i9;i>1;i--)) do for ((j9;j>$i;j--)) do echo -n -e "$j$i$[$i*$j]\t" done echo done1.2 实例操作 2.1 格式 #!/bin/bash for ((a1;a<9;a)) dofor ((b9;b>a;b--))doecho -n " "donefor((c1;c<…

系统信息:uname,sysinfo,gethostname,sysconf

且欲近寻彭泽宰&#xff0c;陶然共醉菊花怀。 文章目录系统信息系统标识 unamesysinfo 函数gethostname 函数sysconf()函数系统信息 系统标识 uname 系统调用 uname()用于获取有关当前操作系统内核的名称和信息&#xff0c;函数原型如下所示&#xff08;可通过"man 2 un…

面向对象编程(基础)7:再谈方法(重载)

目录 7.1 方法的重载&#xff08;overload&#xff09; 7.1.1 概念及特点 7.1.2 示例 举例1&#xff1a; 举例2&#xff1a; 举例3&#xff1a;方法的重载和返回值类型无关 7.1.3 练习 **练习1&#xff1a;** 练习2&#xff1a;编写程序&#xff0c;定义三个重载方法并…

如何大批量扫描的发票进行ocr识别导出Excel表格和WPS表格

OCR技术&#xff1a;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是将数字图像中的文字识别成字符代码的技术&#xff0c;在发票识别中应用广泛。通过OCR技术&#xff0c;可以将图片发票上的信息识别出来&#xff0c;并导出到Excel表格中…

3年测试越来越迷茫... 技术跟不上接下来是不是要被淘汰了?

这两天和朋友聊到了软件测试的发展&#xff1a;这一行的变化确实蛮大&#xff0c;从开始最基础的功能测试&#xff0c;到现在自动化、性能、安全乃至于以后可能出现的大数据测试、AI测试岗位需求逐渐增多。我也在软件测试这行摸爬滚打有些日子了&#xff0c;正好有朋友问我&…

晶振01——晶振分类和无源晶振的设计

晶振 晶振相当于人的心脏&#xff0c;能跳动&#xff0c;整个系统才是“活的”。 晶振常见有有源晶振、无源晶振。 有源晶振比较贵&#xff0c;但是需要外围电路少&#xff0c;供个电就能工作。 无源晶振价格便宜&#xff0c;匹配电路复杂些。 以无源晶振进行分析&#xff0c…

WCF手麻系统源码,手术室麻醉临床系统源代码,商业源码 有演示

手麻系统源码 手术麻醉系统源码 手术室麻醉临床信息系统源码 商业级源码&#xff0c;有演示&#xff0c;三甲医院临床应用多年&#xff0c;系统稳定。 文末获取联系&#xff01; 技术架构&#xff1a;C# .net 桌面软件 C/S版&#xff0c;前后端分离&#xff0c;仓储模式 开发语…

2.5.3 乘法

这段话告诉我们&#xff0c;在程序中有一条乘法运算语句。这个程序会让计算机帮助我们完成一个简单的数学问题&#xff1a;计算6乘以2。和我们平常做数学题一样&#xff0c;程序使用*号表示乘法运算。语句 “feet 6 * fathoms;” 可以这样理解&#xff1a;它会找到之前我们定义…

spring 随笔 async 1-源码走读

0. 这一块比较简单&#xff0c;还就内个无障碍阅读 不谈,放个调用栈的日志先 … // 我们自己写的 Async 注解的方法 simpleTest:31, TestAsyncTestService (cn.angel.project.angelmicroservicesample.test.service) invoke:-1, TestAsyncTestService$$FastClassBySpringCGLI…

手撕vector

文章目录一.vector的基本结构二.构造函数调用不明确三.迭代器失效&#xff08;其实是野指针问题&#xff09;a.扩容导致的迭代器失效b.意义不同四.深层次的深浅拷贝五.整体代码实现有了前面模拟实现string的经验&#xff0c;vector对大家来说也不会算很难。vector本质也就是一个…

【ORACLE】极速通关Oracle23c开发者免费版连接

前言 oracle23c开发者免费版已经于2023年4月4日(北京时间)推出&#xff0c;并且官方也公布了安装介质的下载地址&#xff0c;有RPM安装包、VM虚拟机、docker镜像&#xff08;下载链接见文末&#xff09;。 由于最近工作比较忙&#xff0c;暂时无法写一篇内容丰富的测试&#x…

springboot树形结构接口, 懒加载实现

数据库关系有父子id的, 作为菜单栏展示时需要用前端需要用到懒加载, 所谓懒加载就是接口有一个标志位isLeaf, 前端请求后通过该字段判断该节点是否还有子节点数据 创建数据库表 t_company_info结构有id和parentId标识, 用来表示父子关系 /*Navicat Premium Data TransferSourc…