Day09_封装、继承、重写
封装
该露的露,该藏的藏
程序设计追求“高内聚,低耦合”。高内聚:类的内部数据操作细节自己完成,不允许外部干涉。低耦合:仅暴露少量的方法给外部使用
封装(数据的隐藏)
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
记住这句话:属性私有,get/set
方法用不了多少封装,主要是属性
封装的好处:
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统的可维护性增加
方法重载的小知识
get/set一般不会重载,构造器重载多点
在Java中判断一个类两个方法是否相同,方法名,参数列表
继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
extends的意思是“扩展”。子类是父类的扩展。
Java只有单继承没有多继承(一个儿子只有一个父亲,一个父亲可以有多个儿子)
//继承
public class Student extends Person {
}
//组合
public class Student {
Person person;
}
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上来讲应该具有“is a”的关系
子类继承父类,就会拥有父亲的全部方法(修饰符需要不是private)
'money' is not public in 'com.oop.demo05.Person'. Cannot be accessed from outside package
“ money”未在“ com.oop.demo05.Person”中公开。 无法从外部包访问
Object类(所有类的父类,默认的父类)
super(和this作对比,this代表当前的super代表父)
public class Person /*extends Object*/{
public Person() {
//隐藏的代码:调用了父类的无参构造
super();
System.out.println("person无参构造执行");
}
}
Call to 'super()' must be first statement in constructor body
调用“ super()”必须是构造函数主体中的第一条语句
当父类中有有参构造时,无参构造必须要显式声明,否则子类的无参构造会报错,如果非要使用可以再子类无参构造中调用父类的有参构造(因为如果不调用会默认调用无参构造super())
There is no default constructor available in 'com.oop.demo05.Person'
“ com.oop.demo05.Person”中没有默认的构造函数
super注意点:
1.super调用父类的构造方法,必须放在第一行
2.super必须只能出现在子类的方法或构造方法中
3.super和this不能同时调用构造方法(因为都需要在第一行)
对比this:
代表对象不同:
-
this:本身调用者这个对象
-
super:代表父类对象的引用
前提:
- this:没有继承也可以使用
- super:只能在继承条件才能使用
构造方法:
- this()本类的构造
- super()父类的构造
方法重写(多态的前提)
重写都是(非静态的公有)方法的重写和属性无关
public class A extends B {
public static void test(){
System.out.println("A-->test");
}
}
public class B {
public static void test(){
System.out.println("B-->test");
}
}
A.test();
B a = new A();
a.test();
静态方法隶属于类,所以输出结果只和左边有关
静态方法不能被重写!!!
一些不能被重写的方法:
1.static 方法 属于类,他不属于实例(对象)
2.final 常量(在常量池里)
3.private方法
重写总结
需要有继承关系,子类重写父类的方法
条件:
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大,但是不能缩小 public>protected>default>private
- 抛出的异常:范围可以被缩小但不能扩大
重写,子类和父类的方法一致,但是方法体不同
为什么需要重写?
1.父类的功能子类不一定需要或者不一定满足

浙公网安备 33010602011771号