Java多态性练习

方法的重载
方法的名称相同,参数不同,和返回值类型无关。可以在一个类内或者父子类之间 调用规则:类型最佳匹配原则
class A5 {
public void pp(){
System.out.println("A5.pp()");
}
public int pp(){} 语法错误,因为在系统中识别一个方法是用【方法名称+参数类型列表】
进行,系统会将这两个pp方法识别为同一个方法。注意:在一个类中不允许方法相同
public void pp(int k){
System.out.println("A5.pp(int)");
}
}
class B5 extends A5 {
public void pp(String k){
System.out.println("B5.pp(String)");
}
public void pp(String k,int k1){}
public void pp(int k,String k1){}}

要求:方法名称相同并且参数不同。参数不同有3种情况:参数个数不同、参数类型不同、参数顺 序不同 和参数名称无关 和返回类型无关 为什么返回类型不同判断不同的方法? 例如调用方法时不需要处理返回值pp(10),容易造成混淆

public double pp(int k){}
public int pp(int k){}
一个方法有返回值,调用处实际上可以不接收。假设系统可以按照返回类型将这两个方法识别
为不同方法,则调用pp(10)就没办法判断到底执行哪个

和范围无关

public void pp(){}
protected void pp(){}语法报错

和方法抛出的异常无关

方法的重载可以出现父子类之间,也可以是在一个类内。但是方法的覆盖一定是父子类之间,不能 在一个类内实现方法的覆盖

多态的优点
消除类型之间的耦合关系
可替换性、可扩充性
接口性、灵活性、简化性
public class Test1 {
public static void main(String[] args) {
Fa ff = new Son();
ff.pp(10);//因为在父类中声明的方法为Integer类型,所以在执行前会自动执行装箱操
作,所以调用的是从父类中继承到的pp(Integer),而不是最佳匹配的pp(int)
}
}
class Fa {
protected void pp() {
System.out.println("Fa.pp()");
}
public void pp(Integer kk){
System.out.println("Fa.pp(Integer)");
}
}
class Son extends Fa {
public int pp(int k) {
System.out.println("Son.pp(int)");
return 10;
}
}
public class Test1 {
public static void main(String[] args) {
Fa ff = new Son();
ff.pp(10);
}
}
class Fa {
protected void pp() {
System.out.println("Fa.pp()");
}
public void pp(Integer kk){
System.out.println("Fa.pp(Integer)");
}
}
class Son extends Fa {
public void pp(Integer kk){
System.out.println("Son.pp(Integer)");
}
public int pp(int k) {
System.out.println("Son.pp(int)");
return 10;

练习题

1、为“无名的粉”写一个类class WuMingFen 要求: 1.有三个属性 面码:String theMa 粉的分量(两) int quantity 是否带汤 boolean likeSoup

//一般情况下,不允许定义类在default包中,因为default包中的类其它包无法访问
//包名称的命名规则:全小写,采用域名反转
package com.yan;
//类名称,一般名词,采用大写字母开头,大写字母分词
public class WuMingFen {
private String theMa;
private int quantity;//采用简单类型定义属性,最大的问题是很难判定是默认值还是赋的
值
private boolean likeSoup=true;//按照一般的业务规则,可以一般有汤
//一般在具体开发中,建议采用私有属性,公有的get/set方法的形式定义属性
public String getTheMa() {
return theMa;
}
//业务规则:面码一旦告知则不能修改,所以可以不提供这个set方法,则面码属性就是只读属性
public void setTheMa(String theMa) {
this.theMa = theMa;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) 
//通过get/set方法可以进行一些参数的合法性验证
if(quantity<1)
quantity=1;
this.quantity = quantity;
}
public boolean isLikeSoup() {//如果针对boolean类型的属性,默认get方法的命名规
则是isXxxx不是getXxx;但是如果将属性修改为Boolean,则还是getxxx
return likeSoup;
}
public void setLikeSoup(boolean likeSoup) {
this.likeSoup = likeSoup;
}
}

2.写一个构造方法 以便于简化初始化过程 如 WuMingFen f1 = new WuMingFen(“牛肉”,3,true);

// 添加一个带参构造器
// 构造器不是成员,所以不能继承
// 构造器方法不能有返回值类型,连void都不能有,否则就是普通方法,不是构造器
// 构造器方法名称必须和类名称一致
// 构造器如果不定义,则系统自动提交默认的无参构造器方法;如果定义构造器方法则系统不再
提供构造器
public WuMingFen(String theMa, int quantity, boolean likeSoup) {
// 方法参数likeSoup和属性名称一致,在当前方法中的likeSoup实际上就是局部变量,
而不是属性;如果需要使用属性,则必须通过this.进行引用
this.likeSoup = likeSoup;
this.theMa = theMa;
this.quantity = quantity;
}

3.重载构造方法 使得初始化过程可以多样化 WuMingFen f2 = new WuMingFen(“牛肉”,2);

//方法的重载
//方法名称相同,参数不同[个数、顺序、类型],和返回值类型无关,和参数名称无关
public WuMingFen(String theMa,int quantity){
this(theMa,quantity,true);//调用上面定义的构造器,并传入相关的参数
}

4.如何使得下列语句构造出来的粉对象是酸辣面码、2两、带汤的 WuMingFen f3 = new WuMingFen();

//方法的重在,但是按照业务规则,给属性赋默认值
public WuMingFen(){
//酸辣面码、2两、带汤
this.likeSoup=true;
this.theMa="麻辣";
this.quantity=2;
//方法2 this("麻辣",2,true);
}

5.写一个普通方法 check() 用于查看粉是否符合要求。即将对象的三个属性打印在控制台上

public void check() {
System.out.println("无名粉:面码" + this.theMa + ",重量" + quantity +
"," + (likeSoup ? "有汤" : "无汤"));
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值