方法覆盖
- 1.什么条件构成方法重载?
- 2.方法覆盖的注意事项
- 3.方法覆盖的经典案例
- 4.覆盖toString方法
1.什么条件构成方法重载?
OverrideTest02.java
/*
什么时候我们会考虑使用方法覆盖呢?
子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,
子类有权利对这个方法进行重新编写,有必要进行"方法的覆盖"
方法的覆盖又叫做:方法重写,英语单词叫做:Override、Overwrite,都可以。
比较常见的:方法覆盖、方法重写、override
回顾一下方法重载!!!!
什么时候考虑使用方法重载overload?
当在一个类当中,如果功能相似的话,建议将名字定义的一样,这样代码美观,并且方便编程
什么条件满足之后能够构成方法重载overload?
条件一:在同一个类当中
条件二:方法名相同
条件三:参数列表不同(个数、顺序、类型)
重要结论:
当子类对父类继承过来的方法进行"方法覆盖"之后,
子类对象调用该方法的时候,一定执行覆盖之后的方法
当我们代码怎么编写的时候,在代码编写级别构成方法重写?
条件一:两个类必须要有继承关系
条件二:重写之后的方法和之前的方法具有:
相同的返回值类型
相同的方法名
相同的形式参数列表
条件三:访问权限不能更低,可以更高(这个可以先记住)
父类原先是public,不能低于public
父类原先是protected,子类可以是public
条件四:重写之后的方法不能比之前的方法抛出更多的异常,可以更少.(这个先记住)
父类子类没有异常,父类抛出异常,程序正常运行
父类子类没有异常,子类抛出异常,程序报错:
*/
public class OverrideTest02{
public static void main(String[] args){
//创建鸟对象
Bird b = new Bird();
//让鸟儿移动
b.move();//鸟儿在飞翔!!!
b.sing(1000);//Animal sing...
Cat c = new Cat();
c.move();//猫在走猫步!!!
};
}
class Animal{
public void move(){
System.out.println("动物在移动!");
}
public void sing(int i){
System.out.println("Animal sing...");
}
}
class Bird extends Animal{
//对move方法进行覆盖,方法重写,override
//最好将父类中的方法原封不动的复制过来(不建议手动编写)
// 方法覆盖就是给继承过来的方法给覆盖了
public void move(){
System.out.println("鸟儿在飞翔!!!");
}
public void sing(){
System.out.println("Animal sing...");
}
}
class Cat extends Animal{
public void move(){
System.out.println("猫在走猫步!!!");
}
}
2.方法覆盖的注意事项
- 注意1:方法覆盖只是针对于方法,和属性无关
- 注意2:私有方法无法覆盖
- 注意3:构造方法不能被继承,所以构造方法也不能被覆盖.
- 注意4:方法覆盖只是针对于实例方法,静态方法覆盖没有意义.
这几个注意事项学习完多态之后就明白了
3.方法覆盖的经典案例
OverrideTest03.java
//方法覆盖比较经典的案例
//一定要注意:方法覆盖/重写的时候,建议将父类的方法复制粘贴,这样比较保险
public class OverrideTest03{
public static void main(String[] args){
//创建中国人对象
// Chinese p1 = new Chinese("张三");//错误原因:没有这样的构造方法
Chinese p1 = new Chinese();
p1.setName("张三");
p1.speak();//张三正在说汉语
//创建美国人对象
// American p2 = new American("jack");//错误原因:没有这样的构造方法
American p2 = new American();
p2.setName("jack");
p2.speak();//jack speak english!
}
}
class People{
//属性
private String name;
//构造
public People(){}
public People(String name){
this.name = name;
}
//setter and getter
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
//人都会说话
public void speak(){
System.out.println(name + "....");
}
}
//中国人
class Chinese extends People{
//中国人说汉语
//所以子类需要对父类的speak()方法进行重写
public void speak(){
System.out.println(this.getName() + "正在说汉语");
}
}
//美国人
class American extends People{
//美国人说英语
//所以子类需要对父类的speak()方法进行重写
public void speak(){
System.out.println(this.getName() + "speak english!");
}
}
//子类中调用的方法Speak首字母误写成大写,则会调用父类的speak方法,导致输出结果为:
4.覆盖toString方法
/*
关于Object类中的toString()方法
1.toString()方法的作用是什么?
作用:将"java对象"转换成"字符串的形式".
2.Object类中toString()方法的默认实现是什么?
public String toString(){
return getClass().getName()+ "@" + Integer.toHexString(hasCode());
}
toString方法名的意思是转换成String
含义:调用一个java对象的toString()方法就可以将该java对象转换成字符串的表示
3.那么toString()方法给的默认实现够用吗?
*/
public class OverrideTest04{
public static void main(String[] args){
//创建一个日期对象
MyDate t1 = new MyDate();
//调用toString()方法(将对象转换成字符串形式)
//问:你对这个输出结果满意吗??????不满意,希望输出XXX年XX月XX日
//System.out.println(t1.toString());//MyDate@1db9742
//重写MyDate的toString()方法之后的结果
System.out.println(t1.toString());
// 大家是否还记得,当输出一个引用的时候,println方法会自动调用的toSring方法
System.out.println(t1);
MyDate t2 = new MyDate(2008,8,8);
System.out.println(t2);//2008年8月8日
//创建学生对象
Student s = new Student(1111,"zhangsan");
//重写toString()方法之前
System.out.println(s);//
}
}
//日期类
class MyDate{
private int year;
private int month;
private int day;
public MyDate(){
this(1970,1,1);
}
public MyDate(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public void setYear(int year){
this.year = year;
}
public int getYear(){
return year;
}
public void setMonth(int Month){
this.month = month;
}
public int getMonth(){
return month;
}
public void setDay(){
this.day = day;
}
public int getDay(){
return day;
}
//从Object类中继承过来的那个toString()方法已经无法满足我的业务需求了
//我在子类MyDate中有必要对父类的toString()方法进行覆盖/重写
//我的业务要求是:调用toString()方法进行字符串转化的时候,
//希望的结果是XXXX年XX月XX日,这种格式
//重写一定要复制粘贴,不要手动编写,会错的
public String toString(){
return year + "年" + month + "月" +day + "日";
}
}
class Student{
int no;
public Student (int no,String name){
this.no = no;
this.name = name;
}
// 重写 方法覆盖
public String toString(){
return "学号:" + no + ",姓名:" +name;
}
}
打印结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)