Java Day18

面向对象4.0

一 重写的意义

子类可以继承父类中没有被私有化的方法和非私有化成员变量,但是有的时候会出现开发中父类的方法继承给子类使用,但是子类使用不太符合子类的情况,如果子类方法重新定义,重新命名,又会导致代码冗余,开发压力较大。此时就要用到重写。
1. 重写【Override】

前提条件
1. 重写是存在与继承中子类,或者【遵从中的实现类】
2. 重写情况下要求子类中的方法和父类中的方法,方法声明完全一致
3. 方法体按照子类的情况来完成

注意事项
1. 子类重写父类方法,要求必须加上@Override严格格式检查
2. @Override会检查子类重写的方法,方法声明是否和父类一致


2 继承情况下:
1. 父类的方法不符合子类的情况
2. 需要重写的情况下,但是子类不重写没有任何的语法错误
3. 会导致代码在实际运行阶段不符合生活逻辑和需求
所以我们需要用到abstract修饰父类方法,这样子类就必须重写,否则就报错提醒。
abstract修饰的方法,子类必须重写
/**

 * LOL英雄类,每一个英雄都有QWER技能* * @author Anonymous*//** 第一步:* 		使用abstract关键字修饰要求子类重写的方法* 【方法报错】* 		Abstract methods do not specify a body* 		abstract修饰的方法没有方法体* 【Eclipse快速修复】* 		Ctrl + 1* 		选择 Remove Method Body 删除方法体* * 第二步:* 【方法报错】* 		The abstract method q in type LOLHero can only be defined by an abstract class* 		LOLHero类内的abstract修饰方法q(),有且只能定义在一个abstract修饰的类内* 【类名报错】* 		The type LOLHero must be an abstract class to define abstract methods* 		LOLHero类必须是一个abstract类,才可以定义abstract方法* 【语法要求】* 		abstract修饰的方法,必须在定义在abstract修饰的类内或者XXXXXXXXXXXXXXXXXXXXXXXXX* 【Eclipse快速修复】* 		Ctrl + 1* 		选择 Make Type 'LOLHero' abstract 使用abstract修饰LOLHero类* * 第三步:* 【子类报错】* 		The type Thresh must implement the inherited abstract method LOLHero.q()* 		Thresh类必须实现继承LOLHero类内的abstract方法q* 		因为abstract修饰的方法,在父类abstract类内没有方法体,子类如果想要使用abstract修饰的方法* 		必须完成方法体的实现* 【Eclipse快速修复】* 		Ctrl + 1* 		选择 Add unimplemented methods 添加未实现方法*/
abstract class LOLHero {abstract public void q();abstract public void w();abstract public void e();abstract public void r();
}/*** 锤石类继承LOLHero类* * @author Anonymous**/
class Thresh extends LOLHero {@Overridepublic void q() {System.out.println("死亡判决");}@Overridepublic void w() {System.out.println("魂引之灯");}@Overridepublic void e() {System.out.println("厄运钟摆");}@Overridepublic void r() {System.out.println("幽冥监牢");}}/*** 维鲁斯类继承LOLHero类* * @author Anonymous**/
class Varus extends LOLHero {@Overridepublic void q() {System.out.println("穿刺之箭");}@Overridepublic void w() {System.out.println("枯萎箭袋");}@Overridepublic void e() {System.out.println("恶灵箭雨");}@Overridepublic void r() {System.out.println("腐败链锁");}}public class Demo1 {public static void main(String[] args) {Thresh saolei = new Thresh();saolei.q();saolei.e();saolei.w();saolei.r();System.out.println("--------------------------");Varus varus = new Varus();varus.q();varus.w();varus.e();varus.r();}
}
  1. abstract修饰的方法 没有方法体

  2. abstract修饰的方法,要求定义在abstract修饰的类内,或者接口interface内

  3. abstract修饰的类,你认为有没有类对象???
    abstract修饰的类内,是有可能存在abstract修饰的方法,而abstract修饰的方法是没有方法体的,如果能够得到一个abstract修饰类的对象,通过对象如何调用这些没有方法体的abstract方法。

  4. abstract修饰的类,然后呢类内没有任何的一个abstract修饰的方法,请问有意义吗?
    毫无意义!!!

三 重载
要求
1. 重载是要求在同一个类内,或者接口interface内
2. 重载要求方法名必须一致!!!
3. 重载要求方法的参数必须不一致!!!
4. 重载对于方法的返回值没有任何的约束!!!

重载作用

  1. 简化代码结构,在同一个类内同名方法功能一致,但是参数满足多样化
  2. 简化程序员的开发压力
  3. 能够做到统一化处理方式【后面项目中案例给大家安排】
4. class Person {public void game() {System.out.println("大吉大利,今晚吃鸡");}public void game(String name) {System.out.println("玩" + name);}public int game(String name, int time) {System.out.println("玩" + time + "个小时" + name);return 1;}
}public class Demo1 {public static void main(String[] args) {Person person = new Person();person.game();person.game("LOL");person.game("WOT", 2);}
}

四 this关键字
在一个构造方法中,通过this关键字调用其他构造方法

格式:
1. 要求在一个构造方法中,Constructor
2. this(实际参数);
3. 会根据实际参数的类型,个数,顺序来选择对应的构造方法。

/*

  • this关键字在一个构造方法,调用其他构造方法
  • 注意事项:
  •  1. 不能通过this关键字调用当前所在构造方法,无穷递归!!!错误!!!
    
  •  2. this(实际参数); 根据实际参数的类型,个数和顺序来完成的
    
  •  3. Constructor call must be the first statement in a constructor
    
  •  	通过this关键字调用其他构造方法,必须在当前方法体的第一行!!!
    
  •  4. 能不能在一个构造方法中,通过this关键字,同时调用两个构造方法???
    
  •  	不能!!!因为构造方法调用必须在第一行,如果存在两个必然有一个在第二行,语法报错
    
  •  5. 两个构造方法,能不能通过this关键字相互调用???
    
  •  	不允许,无穷递归!!!
    
  •  6. 规范化,统一化方法执行操作,提高代码的安全性和一致性!!!
    

*/

class Dog {private String name;private String color;private int age;public Dog() {this(null, null, 0);}public Dog(String name) {this(name, null, 0);}public Dog(String name, String color) {this(name, color, 0);}public Dog(String name, String color, int age) {this.name = name;this.color = color;this.age = age;}public void setName(String name) {this.name = name;}public String getName() {return name;}} public class Demo2 {}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部