Day06 Java封装,继承,super关键字,方法重载,多态笔记

封装

记住一句:属性私有,使用set()/get()  快捷键alt+insert

如有两个Java文件,分别为Application.java 和Student.java

如下: 

在Application.java 直接new一个Student类的对象后可以直接调用Student类的成员变量stunum,

而如果将int stunum;变成private int stunum 则在Application.java中无法调用,会报错,加上private就相当于对变量stunum封装了,外部无法直接访问了。

虽然无法直接访问stunum了,但是可以通过set()/get()实现外部对变量stunum的访问,如下通过set()设定stunum=10,同时通过getStunum()获得stunum 

这就是封装的意义吧,让用户不能直接访问,而需要通过方法的调用才能访问。

封装意义:

1.提高程序安全性,保护数据

2.隐藏代码细节

3.统一接口

4.系统可维护增强

继承

关键字extends,子类 extends 父类,子类继承父类,就拥有父类的所有方法,

例子:父类People类,子类Student类,Student类继承People类,在People类有一个say()方法,在Application.java文件新建Student类的对象,通过对象直接调用say()方法

 Super详解

 例1

方法重写中构造器的调用

 运行结果:

从运行结果可以看出,先调用了父类的无参构造再调用了子类的无参构造,因此在子类构造方法的第一行其实隐藏了super(); 若父类只有有参构造呢?

如果父类只有有参构造,在super中调用父类无参构造报错,而调用有参可以通过,如下可以看到在Student1通过super("name") 可以成功调用People1的有参构造

 总结例1:

1.构造器要么调用父类的,要么调用子类的,super和this不能同时调用构造方法

2.super只能出现于子类的方法构造方法中,且放在第一行

方法重写

重写的条件:

1.必须是public修饰的方法才能被重写

2.需要有继承关系,子类重写父类的方法

3.方法名必须相同,方法体不同,参数列表必须相同

4.方法修饰符:范围可以扩大但不能缩小:public>protected>default>private

5.抛出的异常范围可被缩小,但不能扩大

 例2 向上转型,方法重写中方法的调用

A类继承B类,首先在A.java和B.java分别写两个静态方法test(),在Application.java中实例化两个A的对象分别叫a,b

 运行结果:一个调用A类方法,一个调用B类方法

 若两个test()方法改为非静态方法,

 运行结果:两个都执行A类的方法

 总结例2:

加了static是静态方法,即类的方法;不加static是实例方法,是对象的方法。

加static时因为b是B类定义的,调用B类的类方法,不加static,因为b是A类创建的实例化对象,调用A类的实例方法。

能调用哪些方法是引用决定的,具体要执行哪个类的方法,是引用指向的对象决定的。

多态

方法才有多态,属性没有多态!!

一个对象的实际类型是确定的如:new Student();

但是可指向的引用类型就不确定了

例3

 在People2类中定义了run()方法,Student2类继承People2类,在Student2类定义了run()方法和eat()

在Application3.java中分别实例化两个Student2对象s1,s2,s1指向子类引用,s2指向父类引用(结合Day05 创建对象的内存分析加以理解) 

对以下三种情况测试:

1.当run()方法只在父类中有定义

2.当run()方法在父类中有定义且子类有重写run方法

3.当eat()方法只在子类中定义

测试结果:

对情况1:s2可以成功调用父类的run方法

对情况2:s2可以成功调用子类的run方法

对情况3:s2无法调用子类的eat()方法,报错了

例3总结:

对象能执行哪些方法:看对象左边的类型,和右边关系不大

只要子类没有重写父类的方法A,就调用父类的方法A,如果子类重写了方法A,就调用子类的方法A

猜你喜欢

转载自blog.csdn.net/m0_67042480/article/details/128983905
今日推荐