疯狂java讲义_day_04——第五章:重载、重写,多态,继承,访问控制级别

1. 方法重载(overload)

定义:同一个类中的方法,方法名相同,形参列表不同,则被称为方法重载。
记忆:同类同名 不同参
方法的返回值类型、修饰符,与方法重载没有任何关系,可以不同。

2. 方法重写(override)

重写是父类与子类之间多态性的一种表现。
重载是一个类中多态性的一种表现。

方法重写遵循的规则(三同两小一大):

  • ① 三同:方法名相同,形参列表相同,方法类型相同(都是类方法 或 都是实例方法)
  • ② 两小:返回值类型:子类 <= 父类 , 抛出的异常类:子类 <= 父类
  • ③ 一大:子类方法的访问权限 >= 父类方法的访问权限

其它注意点:

  • 子类无法访问和重写带有 private 的父类方法
  • 子类中通过 super. 访问父类的实例变量和实例方法,通过父类类名. 访问父类的类变量和类方法
  • super 和 this 都不能出现在 static 修饰的方法中

3. 多态

class BaseClass {
    public int book = 6;
    public void base() {
        System.out.println("父类的普通方法");
    }
    public void test() {
        System.out.println("父类被覆盖的方法");
    }
}
public class SubClass extends BaseClass {
    public String book = "疯狂java讲义";
    public void sub() {
        System.out.println("子类的普通方法");
    }
    public void test() {
        System.out.println("子类覆盖父类的方法");
    }
    public static void main(String[] args) {
        BaseClass ploy = new SubClass();
        // 重点: ↓
        ploy.test(); // 子类覆盖父类的方法
        System.out.println(ploy.book); // 输出父类的 book  6
        System.out.println(((SubClass) ploy).book); // 输出子类的 book  疯狂java讲义
        ((SubClass) ploy).sub();  强制类型转换来调用运行时类型 SubClss 的方法
    }
}
  • BaseClass ploy = new SubClass(); 引用变量 ploy 的编译时类型是 BaseClass ,运行时类型为 SubClass 。
  • 其中的 BaseClass ploy = new SubClass(); 引用变量只能调用它编译时类型 BaseClass 的方法,而不能调用它运行时类型 SubClass 的方法。如果非要调用 SubClass 的方法 sub() ,则必须强制类型转换 ((SubClass) ploy).sub();
  • 强制类型转换时需要同时注意两点:
    ① 基本类型之间的转换:与布尔类型之间不能进行类型转换
    ② 引用类型之间的转换:只能在具体继承关系的两个类型之间转换,即一父一子
    例如:
        Object obj = Integer.valueOf(5);
        System.out.println(obj); // 5

        // 下面代码强制类型转换,编译可以通过,但运行时会报异常
        String str = (String) obj;
        System.out.println(str);

上述代码中 obj 编译时类型为 Object ,实际类型为 Integer ,由于 Integer 和 String 没有继承关系,所以将 obj 强制类型转换为 String 类型会报错。
修改如下:

        if (obj instanceof String) {
            String str = (String) obj;
        }

        Object obj = new Object();
        obj = "父转子,向下转型,强制类型转换";
        String str = (String) obj;
        System.out.println(str);

多态总结:
子转父,向上转型,系统自动完成
父转子,向下转型,强制类型转换
强制类型转换前,先用 instanceof 运算符判断是否可用成功转换

4. 继承

  • java语言是单继承,C++是多继承
  • 子类扩展了父类,子类是一个特殊的父类

继承会破坏封装,比如:

// Bird 和 Ostrich(鸵鸟)内部都有 fly 这个方法
// 但调用 b.fly()时,执行的是 Ostrich 重写后的 fly 方法
	Bird b = new Ostrich();
	b.fly();

为了保证父类有良好的封装性,设计父类应遵循如下规则:
① private:将父类所有成员变量都设置成 private 修饰
② public:可被其他类访问,可被子类重写
③ public final :可被其他类访问,不可被子类重写
④ protected:不可被其他类访问,可被子类重写
在这里插入图片描述

5. 初始化块

  • 初始化块是 Java 类里可出现的第四种成员(前面依次有成员变量、方法、构造器)
  • 初始化块的语法格式:【修饰符】 { }
  • 初始化块的修饰符只能是 static ,或者不写
  • 初始化块没有名字和标识,因此无法通过类、对象来调用
  • 初始化块在构造器之前执行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值