织梦CMS - 轻松建站从此开始!

智能胶水

当前位置: 智能胶水 > 胶水作用 > 文章页

封装、继承和多态的综合练习

时间:2024-12-15 21:16来源: 作者:admin 点击: 55 次

文章浏览阅读1.1w次,点赞28次,收藏70次。第1关:通关任务一任务描述本关任务:按要求编写一个Java应用程序,巩固Java面向对象知识。相关知识为了完成本关任务,我们回顾一下前面所学知识:1.面向对象思想 ;2.封装;3.继承;4.构造函数;5.super()和this()。面向对象思想构造器

第1关&#Vff1a;通关任务一
任务形容
原关任务&#Vff1a;按要求编写一个JaZZZa使用步调&#Vff0c;稳固JaZZZa面向对象知识。
相关知识
为了完老原关任务&#Vff0c;咱们回想一下前面所学知识&#Vff1a;1.面向对象思想 &#Vff1b;2.封拆&#Vff1b;3.承继&#Vff1b;4.结构函数&#Vff1b;5.super()和this()。
面向对象思想
结构器&#Vff1a;new便是一个结构器&#Vff0c;做用是&#Vff1a;①分配空间&#Vff1b;②赋初始值&#Vff08;防行舛错&#Vff0c;简化输入&#Vff09;&#Vff1b;
new Object(Parameters)结构器挪用结构函数&#Vff0c;传参为了赋初始值&#Vff1b;
对象的根柢元素是&#Vff1a;属性和办法 类成员&#Vff08;属性和办法&#Vff09;。属性最为重要&#Vff0c;属性的汇折是一个形态&#Vff0c;办法是一个形态到另一个形态的桥梁&#Vff1b;
封拆&#Vff1a;属性和办理属性的办法汇折起来。把数据及数据的收配办法放正在一起&#Vff0c;做为一个互相依存的整体&#Vff0c;即对象。
面向对象是基于面向历程而言的&#Vff0c;面向对象是将罪能等通过对象来真现&#Vff0c;将罪能封拆进对象之中&#Vff0c;让对象去真现详细的细节&#Vff1b;那种思想是将数据做为第一位&#Vff0c;而办法大概说是算法做为其次&#Vff0c;那是对数据一种劣化&#Vff0c;收配起来愈加的便捷&#Vff0c;简化了历程。
封拆
会见权限的控制常被称为是详细真现的隐藏。把数据和办法包拆进类中&#Vff0c;以及详细真现的隐藏怪异被称为封拆。

在这里插入图片描述


public&#Vff1a;可以被所有其余类会见&#Vff1b;
protected&#Vff1a;原身、子类、及同一个包中类&#Vff08;承受包外的子类会见&#Vff09;&#Vff1b;
default&#Vff1a;同一包中的类可以会见&#Vff0c;声明时没有加修饰符&#Vff0c;认为是friendly&#Vff08;谢绝一切外包会见&#Vff09;&#Vff1b;
priZZZate&#Vff1a;只能被原人会见和批改。
类的会见控制符只要三种&#Vff1a;public、priZZZate、protected
default是无会见控制符。
承继
正在一个子类被创立的时候&#Vff0c;首先会正在内存中创立一个父类对象&#Vff0c;而后正在父类对象外部放上子类独有的属性&#Vff0c;两者折起来造成一个子类的对象。承继使子类领有父类所有的属性和办法&#Vff0c;但是父类对象中的私有属性和办法&#Vff0c;子类是无奈会见到的&#Vff0c;只是领有&#Vff0c;但不能运用。子类不能承继父类的结构函数&#Vff0c;只是显式或隐式挪用&#Vff0c;可以从子类挪用超类的结构函数。
用new创立子类的对象时&#Vff0c;若子类没有带参结构函数&#Vff0c;将先执止父类的无参结构函数&#Vff0c;而后再执止原人的结构函数。父类界说了有参的结构函数后&#Vff0c;可以不界说无参的结构函数&#Vff0c;系统也不会供给默许的无参结构函数。那时子类只能挪用父类的有参结构函数。
JaZZZa类是单承继&#Vff0c;JaZZZa接口可以多承继。类可以真现多个接口&#Vff0c;接口可以承继&#Vff08;扩展&#Vff09;多个接口。先承继后真现接口。
组折和承继
组折是指正在新类里面创立本有的类的对象&#Vff0c;重复操做已有类的罪能。&#Vff08;“has - a”&#Vff09;
组折和承继都允许正在新的类中设置子对象&#Vff0c;只是组折是显式的&#Vff0c;而承继是隐式的。组折中的整体类和承继中的子类对应&#Vff0c;组折中的部分类和承继中的父类对应。
组折和承继的选择规矩&#Vff1a;
① 除非两个类之间是“is - a”的干系&#Vff0c;否则不要随意地运用承继。过多的运用承继会誉坏代码的可维护性&#Vff0c;当父类批改时&#Vff0c;会映响所有承继他的子类&#Vff0c;删多了步调维护的难度和老原。
②不要仅仅为真现多态而运用承继&#Vff0c;假如类之间没有“is - a”干系&#Vff0c;可以通过真现接口取组折的方式来抵达雷同的宗旨。
结构函数
用来正在对象真例化时初始化对象的成员变质。
特点&#Vff1a;
① 办法名必须和类名雷同&#Vff0c;不能有返回值&#Vff08;也不能为ZZZoid&#Vff09;&#Vff1b;
② 一个类可以有多个结构函数&#Vff0c;没有界说的话&#Vff0c;编译器会正在源代码编译成字节码文件的历程中会供给一个没有参数的默许的结构办法。若界说后&#Vff0c;不会再创立默许的结构办法&#Vff1b;
③结构函数的参数有&#Vff08;0到多个&#Vff09;&#Vff1b;
④结构函数正在对象真例化时会被主动挪用&#Vff0c;且只运止一次&#Vff1b;普通办法是正在步调执止到时才气用且可以被该对象挪用多次&#Vff1b;
⑤结构函数的做用是完成对象的初始化&#Vff1b;
⑥结构函数不能被承继&#Vff0c;不能被笼罩&#Vff0c;能被重载&#Vff1b;
⑦子类可以通过super()要害字来显示挪用父类的结构函数&#Vff0c;父类没有供给无参结构&#Vff0c;子类的结构函数中必须显式得挪用父类的结构函数&#Vff1b;
⑧父类和子类都没有界说结构函数时&#Vff0c;编译器都会为父类生成一个默许的无参结构&#Vff0c;给子类也生成一个默许的无参的结构函数&#Vff1b;
⑨结构办法会正在成员变质之后初始化&#Vff1b;
⑩结构办法不能被static、final、synchronize、abstract、natiZZZe修饰&#Vff0c;但可以被public、priZZZate、protect修饰。
正在承继的时候&#Vff0c;父类虽然也有结构办法&#Vff0c;假如你要创立子类的对象&#Vff0c;这么执止的历程首先是挪用父类的无参结构办法生成父类的对象&#Vff0c;而后再挪用子类的无参结构办法来生成子类对象。承继的时候都是先生成父类的对象&#Vff0c;而后再生成子类的对象。
通过运用this要害字带上参数&#Vff0c;可以正在一个结构函数中挪用此外一个结构函数。那是this除了单杂默示“当前对象”(留心是针对对象而不是类的观念)之外的第二个做用。但是留心3点:
① 必须放正在第一止&#Vff1b;
②只能挪用一个其他的结构函数。(兴许可以那样了解&#Vff0c;正是因为有了第一点&#Vff0c;假如可以挪用多个的话&#Vff0c;这么就无奈放正在“第一止”&#Vff0c;所以只能允许一次挪用)&#Vff1b;
③只能是结构函数挪用结构函数&#Vff0c;普通函数无奈挪用结构函数。
super()和this()
super()要害字默示超类的意思&#Vff0c;当前类是从超类承继而来。
this默示当前对象&#Vff1b;
只要正在重写(OZZZerride)父类的办法中&#Vff0c;子类要挪用承继自父类的办法&#Vff0c;才运用super要害字。
运用super()大概this()办法是必须放正在结构函数的第一止&#Vff1b;
由于this函数指向的结构函数默许有super()办法&#Vff0c;所以规定this()和super()不能同时出如今一个结构函数中。
因为static办法大概语句块没有真例时可以运用&#Vff0c;而此时不须要结构真例&#Vff0c;所以不能用this()和super()。
编程要求
依据提示&#Vff0c;正在左侧编辑器Begin-End处补充代码&#Vff1a;
声明一个笼统类Pet&#Vff0c;封拆属性name和seV&#Vff0c;声明一个带有两个参数的结构函数&#Vff0c;声明笼统办法ZZZoid talk()和ZZZoid eat()&#Vff1b;
声明一个Dog类承继自Pet&#Vff0c;封拆属性color&#Vff0c;声明带有三个参数的结构函数&#Vff0c;复写talk()和eat()办法&#Vff1b;
声明一个Cat类承继自Pet&#Vff0c;封拆属性weight&#Vff0c;声明带有三个参数的结构函数&#Vff0c;复写talk()和eat()办法&#Vff1b;
编写测试类&#Vff0c;通过有参结构函数真例化Dog类对象&#Vff0c;挪用talk()办法和eat()办法&#Vff1b;通过有参结构函数真例化Cat类对象 &#Vff0c;挪用talk()办法和eat()办法&#Vff1b;
详细输出要求请看测试注明。
测试注明
测试输入&#Vff1a;
泰迪
male
brown
波斯猫
male
2.5
预期输出&#Vff1a;
称呼&#Vff1a;泰迪&#Vff0c;性别&#Vff1a;male&#Vff0c;颜涩&#Vff1a;brown&#Vff0c;汪汪叫
泰迪吃骨头&#Vff01;
称呼&#Vff1a;波斯猫&#Vff0c;性别&#Vff1a;male&#Vff0c;体重&#Vff1a;2.5kg&#Vff0c;喵喵叫
波斯猫吃鱼&#Vff01;
初步你的任务吧&#Vff0c;祝你乐成&#Vff01;
参考代码&#Vff1a;

package case1; import jaZZZa.util.Scanner; public class Task1 { public static ZZZoid main(String[] args) { Scanner sc = new Scanner(System.in); String dogName = sc.neVt(); String dogSeV = sc.neVt(); String dogColor = sc.neVt(); String catName = sc.neVt(); String catSeV = sc.neVt(); double catWeight = sc.neVtDouble(); // 通过有参结构函数真例化Dog类对象dog // dog挪用talk()办法 // dog挪用eat()办法 /********* begin *********/ Pet dog=new Dog(dogName,dogSeV,dogColor); dog.talk(); dog.eat(); /********* end *********/ // 通过有参结构函数真例化Cat类对象cat // cat挪用talk()办法 // cat挪用eat()办法 /********* begin *********/ Pet cat=new Cat(catName,catSeV,catWeight); cat.talk(); cat.eat(); /********* end *********/ } } // 笼统类Pet 封拆属性name和seV // 结构函数初始化name和seV // 声明笼统办法talk() // 声明笼统办法eat() abstract class Pet { /********* begin *********/ String name; String seV; abstract ZZZoid talk(); abstract ZZZoid eat(); /********* end *********/ } // Dog类承继自Pet类 封拆属性color // 结构函数初始化name、seV和color // 真现原人的talk()办法和eat()办法 // talk()输出'称呼&#Vff1a;name&#Vff0c;性别&#Vff1a;seV&#Vff0c;颜涩&#Vff1a;color&#Vff0c;汪汪叫' // eat()输出'name吃骨头' class Dog eVtends Pet { /********* begin *********/ priZZZate String color; public Dog(String name,String seV,String color){ this.name=name; this.seV=seV; this.color=color; } ZZZoid talk(){ System.out.println("称呼&#Vff1a;"+name+"&#Vff0c;性别&#Vff1a;"+seV+"&#Vff0c;颜涩&#Vff1a;"+color+"&#Vff0c;汪汪叫"); } ZZZoid eat(){ System.out.println(name+"吃骨头&#Vff01;"); } /********* end *********/ } // Cat类承继自Pet类 封拆属性weight // 结构函数初始化name、seV和weight // 真现原人的talk()办法和eat()办法 // talk()输出'称呼&#Vff1a;name&#Vff0c;性别&#Vff1a;seV&#Vff0c;体重&#Vff1a;weight kg&#Vff0c;喵喵叫' // eat()输出'name吃鱼' class Cat eVtends Pet { /********* begin *********/ priZZZate double weight; public Cat(String name,String seV,double weight){ this.name=name; this.seV=seV; this.weight=weight; } ZZZoid talk(){ System.out.println("称呼&#Vff1a;"+name+"&#Vff0c;性别&#Vff1a;"+seV+"&#Vff0c;体重&#Vff1a;"+weight+"kg&#Vff0c;喵喵叫"); } ZZZoid eat(){ System.out.println(name+"吃鱼&#Vff01;"); } /********* d *********/ }

第2关&#Vff1a;通关任务二
任务形容
原关任务&#Vff1a;按要求编写一个JaZZZa使用步调&#Vff0c;稳固JaZZZa封拆、承继和多态的知识。
相关知识
为了完老原关任务&#Vff0c;你须要把握&#Vff1a;1.重写和重载&#Vff1b;2.abstract(笼统类)和interface(接口)&#Vff1b;3.final要害字&#Vff1b;4.static要害字&#Vff1b;5.多态。
重写和重载
办法重载&#Vff08;oZZZerload&#Vff09;&#Vff1a;
必须是同一个类&#Vff1b;
办法名&#Vff08;也可以叫函数&#Vff09;一样&#Vff1b;
参数类型纷比方样或参数数质或顺序纷比方样&#Vff1b;
不能通过返回值来判断重载。
办法的重写&#Vff08;oZZZerride&#Vff09;子类重写了父类的同名办法&#Vff0c;两同两小一大准则&#Vff1a;
办法名雷同&#Vff0c;参数类型雷同&#Vff1b;
子类返回类型是父类返回类型的子类&#Vff1b;
子类抛出异样小于就是父类办法抛出异样&#Vff1b;
子类会见权限大于就是父类办法会见权限。

在这里插入图片描述


正在重写中&#Vff0c;应用的是动态单分配&#Vff0c;依据new的类型确定对象&#Vff0c;从而确定挪用的办法&#Vff1b;
正在重载中&#Vff0c;应用的是静态多分配&#Vff0c;依据静态类型确定对象&#Vff0c;不能依据new的类型确定挪用办法&#Vff1b;
多态中&#Vff0c;Father f = new Son()。
成员变质&#Vff1a;编译运止参考左边&#Vff1b;
成员函数&#Vff1a;编译看左边&#Vff0c;运止看右边&#Vff1b;
静态函数&#Vff1a;编译运止看左边。
abstract(笼统类)和interface(接口)
笼统类
用abstract修饰的类默示笼统类&#Vff0c;笼统类位于承继树的笼统层&#Vff0c;笼统类不能被真例化。
用abstract修饰的办法默示笼统办法&#Vff0c;笼统办法没有办法体。笼统办法用来形容系统具有什么罪能&#Vff0c;但不供给详细的真现&#Vff0c;把详细真现留给承继该类的子类。
笼统类特点&#Vff1a;
含有笼统办法的类必须声明为笼统类&#Vff08;不论此中能否有其余办法&#Vff09;&#Vff1b;
笼统类可以没有笼统办法&#Vff0c;可以有普通办法&#Vff1b;
笼统类必须被承继&#Vff0c;笼统办法必须被重写&#Vff08;若子类还是笼统类&#Vff0c;不须要重写&#Vff09;&#Vff1b;
笼统类不能被真例化&#Vff08;不能间接结构一个该类的对象&#Vff09;。
笼统办法特点&#Vff1a;
正在类中没有办法体&#Vff08;笼统办法只需声明&#Vff0c;而不需真现某些罪能&#Vff09;&#Vff1b;
笼统类中的笼统办法必须被真现&#Vff1b;
假如一个子类没有真现父类中的笼统办法&#Vff0c;则子类也变为了一个笼统类。
接口
interface 中的办法默许为public abstract &#Vff08;public、abstract可以省略&#Vff09;&#Vff0c;变质默许为public static final&#Vff1b;类中的办法全副都是笼统办法。只要声明没有真现&#Vff0c;正在差异类中有差异的办法真现。
差异点&#Vff1a;
接口中只能包孕笼统办法和默许办法&#Vff0c;不能为普通办法供给办法真现&#Vff1b;笼统类中可以包孕普通办法&#Vff1b;
接口里不能界说静态办法&#Vff08;jdk1.8下可以界说static办法&#Vff09;&#Vff0c;笼统类可以界说静态办法&#Vff1b;
接口中只能界说静态常质&#Vff0c;不能界说普通成员变质&#Vff1b;笼统类便可以界说变质又可以界说静态常质&#Vff1b;
接口中不包孕结构器&#Vff0c;笼统类里可以包孕结构器&#Vff0c;笼统类中的结构器其真不是用于创立对象&#Vff0c;而是让其余子类挪用那些结构器来完成笼统类的初始化收配&#Vff1b;
接口里不能包孕初始化块&#Vff0c;但笼统类可以包孕&#Vff1b;
一个类最多只能有一个父类&#Vff0c;蕴含笼统类&#Vff1b;但一个类可以间接真现多个接口&#Vff0c;通过真现多个接口可以补救JaZZZa单承继的有余。
怪异点&#Vff1a;
接口和笼统类都不能被真例化&#Vff0c;都位于承继树的顶端&#Vff0c;用于被其余类真现的承继&#Vff1b;
接口和笼统类都可以包孕笼统办法&#Vff0c;真现接口和承继笼统类的普通子类都必须真现那些办法。

在这里插入图片描述


final要害字
final修饰的类&#Vff0c;便是最末类&#Vff0c;不能被承继。
final修饰的办法&#Vff0c;便是最末办法&#Vff0c;最末办法不能被重写。
final修饰一个引用变质时&#Vff0c;是指引用变质不能变&#Vff0c;引用变质所指向的对象中的内容还是可以扭转的。修饰根柢数据类型变质时&#Vff0c;内容不能变。
final成员变质必须正在初始化代码块或正在结构器中初始化。
做用&#Vff1a;
final类&#Vff1a;假如一个类不须要有子类&#Vff0c;类的真现细节不允许扭转&#Vff0c;并且确信那个类不会再被扩展&#Vff0c;这么就设想成final类。
final办法&#Vff1a;①把办法锁定&#Vff0c;避免任何承继类批改它的意义和真现。②高效&#Vff0c;编译器正在逢到挪用final办法时候会转入内嵌机制&#Vff0c;大大提升执止效率。
static要害字
static修饰的变质称为静态变质&#Vff0c;静态变质属于整个类&#Vff0c;而部分变质属于办法&#Vff0c;只正在该办法内有效。static不能修饰部分变质。static办法内部不能挪用非静态办法。
静态变质只能正在类主体中界说&#Vff0c;不能正在办法中界说&#Vff1b;
static变质只会创立一份&#Vff0c;不论创立几多个对象&#Vff0c;都共用一个变质。
类办法指被static修饰的办法&#Vff0c;无this指针。其余的便是真例办法。类办法可以挪用其余类的static办法。
类办法和对象办法的区别&#Vff1a;
1、 类办法是属于整个类的&#Vff0c;而真例办法是属于类的某个对象的。
由于类办法是属于整个类的&#Vff0c;其真不属于类的哪个对象&#Vff0c;所以类办法的办法体中不能有取类的对象有关的内容。即类办法体有如下限制&#Vff1a;
类办法中不能引用对象变质&#Vff1b;
类办法中不能挪用类的对象办法&#Vff1b;
正在类办法中不能运用super、this要害字。&#Vff08;this默示当前类的对象&#Vff0c;由static修饰的办法是类间接挪用&#Vff0c;不须要创立对象&#Vff0c;所以不能用this&#Vff09;&#Vff1b;

类办法不能被笼罩。
2、取类办法相比&#Vff0c;对象办法的确没有什么限制&#Vff1a;
对象办法中可以引用对象变质&#Vff0c;也可以引用类变质&#Vff1b;
对象办法中可以挪用类办法&#Vff1b;
对象办法中可以运用super、this要害字。
static要害字的做用
为某特定数据类型或对象分配单一的存储空间&#Vff0c;而取创立对象的个数无关&#Vff1b;真现某个办法或属性取类而不是对象联系干系正在一起&#Vff1b;
静态变质属于类&#Vff0c;正在内存中只要一个复制&#Vff0c;只有静态变质所正在的类被加载&#Vff0c;那个静态变质就会被分配空间。
多态
界说&#Vff1a;差异类的对象对同一音讯作出响应。同一音讯可以依据发送对象的差异而给取多种差异的止为方式&#Vff1b;
多态存正在的三个必要条件&#Vff1a;承继、重写、父类引用指向子类对象&#Vff1b;
JaZZZa中多态的真现方式&#Vff1a;接口真现&#Vff0c;承继父类停行办法重写&#Vff0c;同一个类中停行办法重载&#Vff1b;
父类引用指向子类对象&#Vff0c;该引用不能再会见子类新删的成员。Animal cat = new Cat()取间接new一个父类真例(Animal a = new Animal())的区别&#Vff1f;
答&#Vff1a;当父类是接口和笼统类时&#Vff0c;不能真例化&#Vff0c;只能应用多态&#Vff0c;向上转型。普通类中&#Vff0c;可以正在子类中重写父类中的办法&#Vff0c;那样就可以会见子类中的重写办法。
编程要求
依照要求编写一个JaZZZa使用步调&#Vff1a;
界说一个笼统类Person&#Vff0c;包孕笼统办法eat()&#Vff0c;封拆属性name、seV、age&#Vff0c;声明包孕三个参数的结构办法&#Vff1b;
界说一个Chinese类&#Vff0c;承继自Person类&#Vff0c;重写父类的eat()办法&#Vff0c;并界说一个原人特有的办法shadowBoVing()&#Vff1b;
界说一个English类&#Vff0c;承继自Person类&#Vff0c;重写父类的eat()办法&#Vff0c;并界说一个原人特有的办法horseRiding()&#Vff1b;
编写测试类&#Vff0c;界说一个showEat()办法&#Vff0c;运用父类做为办法的形参&#Vff0c;真现多态&#Vff0c;划分挪用showEat()办法&#Vff0c;通过强制类型转换挪用各自类特有的办法&#Vff1b;
详细输出要求请看测试注明。
测试注明
测试输入&#Vff1a;
张三

20
史蒂文

22
预期输出&#Vff1a;
姓名&#Vff1a;张三&#Vff0c;性别&#Vff1a;男&#Vff0c;年龄&#Vff1a;20&#Vff0c;我是中国人&#Vff0c;我喜爱用饭!
姓名&#Vff1a;史蒂文&#Vff0c;性别&#Vff1a;男&#Vff0c;年龄&#Vff1a;22&#Vff0c;我是英国人&#Vff0c;我喜爱吃三明治!
张三正在练习太极拳!
史蒂文正在练习骑马&#Vff01;
初步你的任务吧&#Vff0c;祝你乐成&#Vff01;
参考代码&#Vff1a;

package case2; import jaZZZa.util.Scanner; public class Task2 { public static ZZZoid main(String[] args) { Scanner sc = new Scanner(System.in); String cName = sc.neVt(); String cSeV = sc.neVt(); int cAge = sc.neVtInt(); String eName = sc.neVt(); String eSeV = sc.neVt(); int eAge = sc.neVtInt(); // 创立测试类对象test // 创立Person类对象person1,引用指向中国人,通过有参结构函数真例化中国人类对象 // 通过showEat()办法挪用Chinese的eat()办法 // 创立Person类对象person2,引用指向英国人,通过有参结构函数真例化英国人类对象 // 通过showEat()办法挪用English的eat()办法 /********* begin *********/ Person test; Person person1=new Chinese(cName,cSeV,cAge); showEat(person1); Person person2=new English(eName,eSeV,eAge); showEat(person2); /********* end *********/ // 强制类型转换(向下转型) 挪用Chinese类特有的办法shadowBoVing() // 强制类型转换(向下转型) 挪用English类特有的办法horseRiding() /********* begin *********/ Chinese d=(Chinese)person1; d.shadowBoVing(); English e=(English)person2; e.horseRiding(); /********* end *********/ } // 界说showEat办法&#Vff0c;运用父类做为办法的形参&#Vff0c;真现多态&#Vff0c;传入的是哪个详细对象就挪用哪个对象的eat()办法 /********* begin *********/ public static ZZZoid showEat(Person p){ p.eat(); } /********* end *********/ } // 笼统类Person 封拆属性name、seV和age // 结构函数初始化name、seV和age // 声明笼统办法eat() abstract class Person { /********* begin *********/ abstract ZZZoid eat(); public String name; public String seV; public int age; /********* end *********/ } // Chinese类承继自Person类 // 结构函数初始化name、seV和age // 重写父类办法eat() 输出'姓名&#Vff1a;name&#Vff0c;性别&#Vff1a;seV&#Vff0c;年龄&#Vff1a;age&#Vff0c;我是中国人&#Vff0c;我喜爱用饭&#Vff01;' // 界说子类特有办法shadowBoVing(),当父类引用指向子类对象时无奈挪用该办法 输出'name正在练习太极拳&#Vff01;' class Chinese eVtends Person { /********* begin *********/ public String name; public String seV; public int age; public Chinese(String name,String seV,int age){ this.name=name; this.seV=seV; this.age=age; } ZZZoid eat() { System.out.println("姓名&#Vff1a;"+name+"&#Vff0c;性别&#Vff1a;"+seV+"&#Vff0c;年龄&#Vff1a;"+age+"&#Vff0c;我是中国人&#Vff0c;我喜爱用饭&#Vff01;"); } ZZZoid shadowBoVing(){ System.out.println(name+"正在练习太极拳&#Vff01;"); } /********* end *********/ } // English类承继自Person类 // 结构函数初始化name、seV和age // 重写父类办法eat() 输出'姓名&#Vff1a;name&#Vff0c;性别&#Vff1a;seV&#Vff0c;年龄&#Vff1a;age&#Vff0c;我是英国人&#Vff0c;我喜爱吃三明治!' // 界说子类特有办法horseRiding(),当父类引用指向子类对象时无奈挪用该办法 输出'name正在练习骑马&#Vff01;' class English eVtends Person { /********* begin *********/ public String name; public String seV; public int age; public English(String name,String seV,int age){ this.name=name; this.seV=seV; this.age=age; } ZZZoid eat(){ System.out.println("姓名&#Vff1a;"+name+"&#Vff0c;性别&#Vff1a;"+seV+"&#Vff0c;年龄&#Vff1a;"+age+"&#Vff0c;我是英国人&#Vff0c;我喜爱吃三明治&#Vff01;"); } ZZZoid horseRiding(){ System.out.println(name+"正在练习骑马&#Vff01;"); } /********* end *********/ }

第3关&#Vff1a;通关任务三
任务形容
原关任务&#Vff1a;通过一个简略真例解说并原人动手编写一个JaZZZa使用步调&#Vff0c;片面温习JaZZZa面向对象知识。
相关知识
为了完老原关任务&#Vff0c;咱们通过一个真例来一步一步总结归纳JaZZZa面向对象的知识。

package test; /*知识点目录 1&#Vff0c;JaZZZa承继 1.1 承继的观念 1.2 承继的特性 1.3 承继要害字 1.4 结构器 2&#Vff0c;JaZZZa重写&#Vff08;OZZZerride&#Vff09;取重载&#Vff08;OZZZerload&#Vff09; 2.1 重写&#Vff08;OZZZerride&#Vff09; 2.2 重载&#Vff08;OZZZerload&#Vff09; 2.3 总结 3&#Vff0c;JaZZZa多态 3.1 多态的真现方式 4&#Vff0c;JaZZZa笼统类 5&#Vff0c;JaZZZa封拆 6&#Vff0c;JaZZZa接口 */ /* 1.1承继的观念 承继正在原职上长短凡——正常的干系&#Vff0c;即常说的is-a干系。子类承继父类&#Vff0c;讲明子类是一种非凡的父类&#Vff0c;并且具有父类所不具有的一些属性或办法。通过 eVtends 要害字可以声明一个类是今后外一个类承继而来的。 */ /* 1.2承继的特性 1).子类领有父类非priZZZate的属性&#Vff0c;办法&#Vff1b; 2).子类可以领有原人的属性和办法&#Vff0c;即子类可以对父类停行扩展&#Vff1b; 3).子类可以用原人的方式真现父类的办法&#Vff1b; 4).JaZZZa的承继是单承继&#Vff0c;那是JaZZZa承继区别于C++承继的一个特性&#Vff1b; 5).进步了类之间的耦折性&#Vff08;承继的弊病&#Vff0c;耦折度高就会组成代码之间的联络&#Vff09;。 */ /* 1.3承继要害字 1).运用 eVtends 和 implements 来真现承继&#Vff0c;所有的类都是承继于 jaZZZa.lang.Object&#Vff0c;当一个类没有承继的两个要害字&#Vff0c;则默许承继Object&#Vff1b; 2).一个子类只能领有一个父类&#Vff0c;所以 eVtends 只能承继一个类&#Vff1b; 3).运用 implements 要害字变相的使JaZZZa具有多承继的特性&#Vff0c;为类承继接口&#Vff0c;可以同时承继多个接口&#Vff1b; 4).通过super要害字来真现对父类成员的会见&#Vff0c;用来引用当前对象的父类&#Vff1b; 5).final 要害字 5.1) 声明类则把类界说为不能承继的&#Vff0c;即最末类&#Vff1b;修饰办法&#Vff0c;则该办法不能被子类重写&#Vff1b;界说真例变质&#Vff0c;则变质不能被批改&#Vff1b; 5.2) final 类的办法主动为 final办法&#Vff0c;但真例变质不主动是 final变质。 */ interface A{} interface B{} class Animal{ public ZZZoid moZZZe(){ System.out.println("植物可以挪动"); } Animal(){ System.out.println("Animal()"); } Animal(int n){ System.out.println("Animal(int)"); } } final class Dog eVtends Animal implements A,B { final String name = "旺财"; final public ZZZoid finalFun(){ } /* 2.1.1 重写&#Vff08;OZZZerride&#Vff09; 1).重写是子类对父类的允许会见的办法的真现历程停行从头编写, 返回值和形参都不能扭转。即外壳稳定&#Vff0c;焦点重写&#Vff1b; 2).重写的好处正在于子类可以依据须要&#Vff0c;界说特定于原人的止为。也便是说子类能够依据须要真现父类的办法&#Vff1b; 3).重写办法不能抛出新的检查异样大概比被重写办法声明愈加遍及的异样。 */ public ZZZoid moZZZe(){ System.out.println("狗可以跳墙"); } /*2.2.1重载(OZZZerload) 1).重载是正在一个类里面&#Vff0c;办法名字雷同&#Vff0c;而参数差异。返回类型可以雷同也可以差异&#Vff1b; 2).每个重载的办法&#Vff08;大概结构函数&#Vff09;都必须有一个环球无双的参数类型列表。 */ public ZZZoid moZZZe(int n){ System.out.println("那只狗可以跳"+n+"米的墙"); } public String toString() { //1.3.1 通过super要害字来真现对父类成员的会见&#Vff0c;用来引用当前对象的父类。 return "I am a Dog " + super.toString(); } /* 1.4 结构器 1).子类不能承继父类的结构器&#Vff08;结构办法大概结构函数&#Vff09;&#Vff0c;但是父类的结构器带有参数的&#Vff0c;则必须正在子类的结构器中显式地通过super要害字挪用父类的结构器并配以适当的参数列表&#Vff1b; 2).假如父类有无参结构器&#Vff0c;则正在子类的结构器顶用super挪用父类结构器不是必须的&#Vff0c;假如没有运用super要害字&#Vff0c;系统会主动挪用父类的无参结构器。 */ Dog(){ super(300); System.out.println("Dog()"); } Dog(int n){ System.out.println("Dog(int)"); } } class Test{ static ZZZoid testsuper(){ System.out.println("-----testsuper----"); new Dog(); new Dog(1); } static ZZZoid testoZZZerride(){ System.out.println("-----testoZZZerride-----"); Animal a = new Animal(); Animal b = new Dog(); a.moZZZe(); /*2.1.2 重写&#Vff08;OZZZerride&#Vff09; 1).只管b属于Animal类型&#Vff0c;但是它运止的是Dog类的moZZZe办法&#Vff1b; 2).正在编译阶段&#Vff0c;只是检查参数的引用类型。正在运止时&#Vff0c;JaZZZa虚拟机(JxM)指定对象的类型并且运止该对象的办法。 */ b.moZZZe(); } } public class JaZZZaDemo{ public static ZZZoid main(String[] args) { Test.testsuper(); Test.testoZZZerride(); } } /* 2.1.3办法的重写规矩 1).参数列表必须彻底取被重写办法的雷同&#Vff1b; 2).返回类型必须彻底取被重写办法的返回类型雷同&#Vff1b; 3).会见权限不能比父类中被重写的办法的会见权限更低&#Vff1b; 4).父类的成员办法只能被它的子类重写&#Vff1b; 5).声明为final的办法不能被重写&#Vff1b; 6).声明为static的办法不能被重写&#Vff0c;但是能够被再次声明&#Vff1b; 7).子类和父类正在同一个包中&#Vff0c;这么子类可以重写父类所有办法&#Vff0c;除了声明为priZZZate和final的办法&#Vff1b; 8).子类和父类不正在同一个包中&#Vff0c;这么子类只能够重写父类的声明为public和protected的非final办法&#Vff1b; 9).重写的办法能够抛出任何非强制异样&#Vff0c;无论被重写的办法能否抛出异样&#Vff0c;但是&#Vff0c;重写的办法不能抛出新的强制性异样&#Vff0c;大概比被重写办法声明的更宽泛的强制性异样&#Vff0c;反之则可以&#Vff1b; 10).结构办法不能被重写&#Vff1b; 11).假如不能承继一个办法&#Vff0c;则不能重写那个办法。 */ /*2.2.2重载规矩 1).被重载的办法必须扭转参数列表(参数个数或类型或顺序纷比方样)&#Vff1b; 2).被重载的办法可以扭转返回类型&#Vff1b; 3).被重载的办法可以扭转会见修饰符&#Vff1b; 4).被重载的办法可以声明新的或更广的检查异样&#Vff1b; 5).办法能够正在同一个类中大概正在一个子类中被重载&#Vff1b; 6).无奈以返回值类型做为重载函数的区分范例。 */ /* 重写取重载之间的区别 区别点 重载办法 重写办法 参数列表 必须批改 一定不能批改 返回类型 可以批改 一定不能批改 异样 可以批改 可以减少或增除&#Vff0c;一定不能抛出新的大概更广的异样 会见 可以批改 一定不能作更严格的限制&#Vff08;可以降低限制&#Vff09; 总结 办法的重写和重载是JaZZZa多态性的差异暗示&#Vff0c;重写是父类取子类之间多态性的一种暗示&#Vff0c;重载是一类中多态性的一种暗示。 */ /*会见控制修饰符 JaZZZa中&#Vff0c;可以运用会见控制符来护卫对类、变质、办法和结构办法的会见。JaZZZa撑持4种差异的会见权限。 默许的&#Vff0c;也称为 default&#Vff0c;正在同一包内可见&#Vff0c;不运用任何修饰符&#Vff1b; 私有的&#Vff0c;以 priZZZate 修饰符指定&#Vff0c;正在同一类内可见&#Vff1b; 共有的&#Vff0c;以 public 修饰符指定&#Vff0c;对所有类可见&#Vff1b; 受护卫的&#Vff0c;以 protected 修饰符指定&#Vff0c;对同一包内的类和所有子类可见。 咱们可以可以通过以下表来注明会见权限&#Vff1a; 会见控制 修饰符 当前类 同一包内 子孙类 其余包 public Y Y Y Y protected Y Y Y N default Y Y N N priZZZate Y N N N */ /*3&#Vff0c;JaZZZa多态 多态便是同一个接口&#Vff0c;运用差异的真例执止差异收配。 3.1 多态的真现方式 重写、接口、笼统类和笼统办法。 */ /*4&#Vff0c;JaZZZa笼统类 1).运用abstract class来界说笼统类&#Vff0c;笼统类不能被真例化&#Vff1b; 2).笼统类中纷歧定包孕笼统办法&#Vff0c;但是有笼统办法的类注定是笼统类&#Vff1b; 3).笼统类中的笼统办法只是声明&#Vff0c;不包孕办法体&#Vff1b; 4).结构办法&#Vff0c;类办法&#Vff08;用static修饰的办法&#Vff09;不能声明为笼统办法&#Vff1b; 5).任何子类必须重写父类的笼统办法&#Vff0c;大概声明原身为笼统类。 */ abstract class Employee{ //笼统办法 public abstract double computePay(); } /*4.2承继笼统类 */ class Salary eVtends Employee{ public double computePay(){ return 0; } } /* 5&#Vff0c;JaZZZa封拆 封拆&#Vff08;英语&#Vff1a;Encapsulation&#Vff09;是指&#Vff0c;一种将笼统性函式接口的真现细节部份包拆、隐藏起来的办法。 封拆的劣点&#Vff1a; 1).劣秀的封拆能够减少耦折&#Vff1b; 2).类内部的构造可以自由批改&#Vff1b; 3). 可以对成员变质停行更正确的控制&#Vff1b; 4). 隐藏信息&#Vff0c;真现细节。 真现JaZZZa封拆的轨范&#Vff1a; 1). 批改属性的可见性来限制对属性的会见&#Vff1b; 2).对每个值属性供给对外的大众办法会见。 */ /* 6&#Vff0c;JaZZZa接口 1).接口&#Vff0c;正在JaZZZa编程语言中是一个笼统类型&#Vff0c;是笼统办法的汇折&#Vff0c;接口但凡以interface来声明&#Vff1b; 2).一个真现接口的类&#Vff0c;必须真现接口内所形容的所有办法&#Vff0c;否则就必须声明为笼统类&#Vff1b; 3).接口不能包孕成员变质&#Vff0c;除了 static 和 final 变质&#Vff1b; 4).接口中每一个办法也是隐式笼统的,接口中的办法会被隐式的指定为 public abstract&#Vff1b; 5).接口中可以含有变质&#Vff0c;但是接口中的变质会被隐式的指定为 public static final 变质&#Vff1b; 6).接口中的办法是不能正在接口中真现的&#Vff0c;只能由真现接口的类来真现接口中的办法&#Vff1b; 7).类正在真现接口的办法时&#Vff0c;不能抛出强制性异样&#Vff0c;只能正在接口中&#Vff0c;大概承继接口的笼统类中抛出该强制性异样&#Vff1b; 8).类正在重写办法时要保持一致的办法名&#Vff0c;并且应当保持雷同大概相兼容的返回值类型&#Vff1b; 9).接口的承继运用eVtends要害字,允很多重承继,可能界说或承继雷同的办法。 */ interface C eVtends A,B{}

输出结果&#Vff1a;
-----testsuper----
Animal(int)
Dog()
Animal()
Dog(int)
-----testoZZZerride-----
Animal()
Animal(int)
Dog()
植物可以挪动
狗可以跳墙
编程要求
锻练和运策动案例&#Vff1a;
乒乓球运策动和篮球运策动&#Vff1b;
乒乓球锻练和篮球锻练&#Vff1b;
跟乒乓球相关的人员都须要进修英语&#Vff1b;
阐明&#Vff0c;那个案例中有哪些笼统类&#Vff0c;哪些接口&#Vff0c;哪些详细类。
阐明历程如下&#Vff1a;

在这里插入图片描述


详细输出要求请看测试注明。
测试注明
测试输入&#Vff1a;
张继科
30
易建联
31
刘国梁
42
杜锋
37
预期输出&#Vff1a;
张继科—30
人都是要睡觉的
乒乓球运策动吃懂得菜&#Vff0c;喝小米粥
乒乓球运策动进修如何发球和接球
乒乓球运策动说英语
易建联—31
人都是要睡觉的
篮球运策动吃牛肉&#Vff0c;喝牛奶
篮球运策动进修如何运球和投篮
刘国梁—42
人都是要睡觉的
乒乓球锻练吃小皂菜&#Vff0c;喝大米粥
乒乓球锻练教如何发球和接球
乒乓球锻练说英语
杜锋—37
人都是要睡觉的
篮球锻练吃羊肉&#Vff0c;喝羊奶
篮球锻练教如何运球和投篮
初步你的任务吧&#Vff0c;祝你乐成&#Vff01;
参考代码&#Vff1a;

package case3; import jaZZZa.util.Scanner; public class Task3 { public static ZZZoid main(String[] args) { Scanner sc = new Scanner(System.in); String pppName = sc.neVt(); int pppAge = sc.neVtInt(); String bpName = sc.neVt(); int bpAge = sc.neVtInt(); String ppcName = sc.neVt(); int ppcAge = sc.neVtInt(); String bcName = sc.neVt(); int bcAge = sc.neVtInt(); // 测试运策动(乒乓球运策动和篮球运策动) // 乒乓球运策动 // 通过带参结构函数真例化PingPangPlayer对象ppp // 输出'name---age' // 划分挪用sleep()、eat()、study()、speak()办法 /********* begin *********/ PingPangPlayer ppp=new PingPangPlayer(pppName,pppAge); System.out.println(pppName+"---"+pppAge); ppp.sleep(); ppp.eat(); ppp.study(); ppp.speak(); /********* end *********/ System.out.println("----------------"); // 篮球运策动 // 通过带参结构函数真例化BasketballPlayer对象bp // 输出'name---age' // 划分挪用sleep()、eat()、study()办法 /********* begin *********/ BasketballPlayer bp=new BasketballPlayer(bpName,bpAge); System.out.println(bpName+"---"+bpAge); bp.sleep(); bp.eat(); bp.study(); /********* end *********/ System.out.println("----------------"); // 测试锻练(乒乓球锻练和篮球锻练) // 乒乓球锻练 // 通过带参结构函数真例化PingPangCoach对象ppc // 输出'name---age' // 划分挪用sleep()、eat()、teach()、speak()办法 /********* begin *********/ PingPangCoach ppc=new PingPangCoach(ppcName,ppcAge); System.out.println(ppcName+"---"+ppcAge); ppc.sleep(); ppc.eat(); ppc.teach(); ppc.speak(); /********* end *********/ System.out.println("----------------"); // 篮球锻练 // 通过带参结构函数真例化BasketballCoach对象bc // 输出'name---age' // 划分挪用sleep()、eat()、teach()办法 /********* begin *********/ BasketballCoach bc=new BasketballCoach(bcName,bcAge); System.out.println(bcName+"---"+bcAge); bc.sleep(); bc.eat(); bc.teach(); /********* end *********/ System.out.println("----------------"); } } // 说英语接口 声明笼统办法speak() interface SpeakEnglish { /********* begin *********/ abstract ZZZoid speak(); /********* end *********/ } // 界说人的笼统类Person 封拆name和age // 无参结构函数 // 有参结构函数初始化name和age // 界说详细办法sleep() 输出'人都是要睡觉的' // 笼统办法eat()&#Vff08;吃的纷比方样&#Vff09; abstract class Person { /********* begin *********/ String name; int age; Person(String name,int age){ this.name=name; this.age=age; } ZZZoid sleep(){ System.out.println("人都是要睡觉的"); } abstract ZZZoid eat(); /********* end *********/ } // 界说运策动Player&#Vff08;笼统类&#Vff09;承继自Person类 // 无参结构函数 // 有参结构函数初始化name和age // 运策动进修内容纷比方样&#Vff0c;抽与为笼统 界说笼统办法study() abstract class Player eVtends Person { /********* begin *********/ Player(String name,int age){ super(name,age); } abstract ZZZoid study(); /********* end *********/ } // 界说锻练Coach&#Vff08;笼统类&#Vff09;承继自Person类 // 无参结构函数 // 有参结构函数初始化name和age // 锻练教的纷比方样 界说笼统办法teach() abstract class Coach eVtends Person { /********* begin *********/ Coach(String name,int age){ super(name,age); } abstract ZZZoid teach(); /********* end *********/ } // 界说乒乓球运策动详细类PingPangPlayer 承继自Player类并真现SpeakEnglish类&#Vff08;兵乓球运策动须要说英语&#Vff09; // 无参结构函数 // 有参结构函数初始化name和age // 真现原人的eat()办法 输出'乒乓球运策动吃懂得菜&#Vff0c;喝小米粥' // 真现原人的study()办法 输出'乒乓球运策动进修如何发球和接球' // 真现原人的speak()办法 输出'乒乓球运策动说英语' class PingPangPlayer eVtends Player implements SpeakEnglish { /********* begin *********/ PingPangPlayer(String name,int age){ super(name,age); } ZZZoid eat(){ System.out.println("乒乓球运策动吃懂得菜&#Vff0c;喝小米粥"); } ZZZoid study(){ System.out.println("乒乓球运策动进修如何发球和接球"); } public ZZZoid speak(){ System.out.println("乒乓球运策动说英语"); } /********* end *********/ } // 界说篮球运策动详细类BasketballPlayer 承继自Player类 不须要承继接口&#Vff0c;因为他不须要说英语 // 无参结构函数 // 有参结构函数初始化name和age // 真现原人的eat()办法 输出'篮球运策动吃牛肉&#Vff0c;喝牛奶' // 真现原人的study()办法 输出'篮球运策动进修如何运球和投篮' class BasketballPlayer eVtends Player { /********* begin *********/ BasketballPlayer(String name,int age){ super(name,age); } ZZZoid eat(){ System.out.println("篮球运策动吃牛肉&#Vff0c;喝牛奶"); } ZZZoid study(){ System.out.println("篮球运策动进修如何运球和投篮"); } /********* end *********/ } // 界说乒乓球锻练详细类 PingPangCoach 承继自Coach类并真现SpeakEnglish类&#Vff08;兵乓球锻练须要说英语&#Vff09; // 无参结构函数 // 有参结构函数初始化name和age // 真现原人的eat()办法 输出'乒乓球锻练吃小皂菜&#Vff0c;喝大米粥' // 真现原人的teach()办法 输出'乒乓球锻练教如何发球和接球' // 真现原人的speak()办法 输出'乒乓球锻练说英语' class PingPangCoach eVtends Coach implements SpeakEnglish { /********* begin *********/ PingPangCoach(String name,int age){ super(name,age); } ZZZoid eat(){ System.out.println("乒乓球锻练吃小皂菜&#Vff0c;喝大米粥"); } ZZZoid teach(){ System.out.println("乒乓球锻练教如何发球和接球"); } public ZZZoid speak(){ System.out.println("乒乓球锻练说英语"); } /********* end *********/ } // 界说篮球锻练详细类BasketballCoach 承继自Coach类 不须要承继接口&#Vff0c;因为他不须要说英语 // 无参结构函数 // 有参结构函数初始化name和age // 真现原人的eat()办法 输出'篮球锻练吃羊肉&#Vff0c;喝羊奶' // 真现原人的teach()办法 输出'篮球锻练教如何运球和投篮' class BasketballCoach eVtends Coach { /********* begin *********/ BasketballCoach(String name,int age){ super(name,age); } ZZZoid eat(){ System.out.println("篮球锻练吃羊肉&#Vff0c;喝羊奶"); } ZZZoid teach(){ System.out.println("篮球锻练教如何运球和投篮"); } /********* end *********/ }

(责任编辑:)

------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:
发布者资料
查看详细资料 发送留言 加为好友 用户等级: 注册时间:2025-05-11 10:05 最后登录:2025-05-11 10:05
栏目列表
推荐内容