一.封装
1.什么是封装?
把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节。数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问。
2.封装的步骤?
1.使用private 修饰需要封装的成员变量。
2.提供一个公开的方法设置或者访问私有的属性。通过(get/set)方法获取
3.封装的好处与作用?
封装的作用:1. 框架 2. 工具类
封装的好处: 1. 提高了数据的安全性 2. 操作简单 3. 隐藏了方法的实现。
二.继承
1.继承的格式?
A extends B
A: SubClass 子类
B:SuperClass,超类,父类,基类
2.封装的好处?
1.减少代码的冗余,提高代码的复用性 2.提高了代码的扩展性 3.为多态提供了前提
3.说明?
1.子类继承父类以后就拥有了父类中的属性和方法(我们不认为可以继承父类中的构造器)
2.子类继承父类一定要存在"is a"的关系
3.父类中属性被私有化后,子类不能直接进行访问,但是我们可以通过间接的方式进行访问(set/get),虽然父类中的属性不能被直接访问,但是我们还是认为该属性被继承到了。
4.子类除了可以继承属性和方法外,还可以在定义自己独有的属性和方法
5.父类的概念是相对的,父类分为:直接父类和间接父类
6.子类除了可以获取直接父类的属性和方法外,还可以获取间接父类的属性和方法
7.所有类都会继承Object类。如果一个类没有显示的继承某个类,那么这个类将默认继承Object类
8.一个父类可以有多个子类,但是一个子类只能有一个父类(Java的单继承特性)
4.方法的重写?
子类继承父类后,如果对父类中的方法不满意那么可以考虑使用方法的重写(覆盖,重写)
说明:
1.子类继承父类后,如果对父类中的方法进行了重写,那么在通过子类对象调用父类中被重写的方法,实际调用子类重写的方法。
细节:
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
1.父类被重写的方法和子类重写的方法的方法名和形参列表必须相同
2.父类重写的方法的权限修饰符不小于子类重写方法的权限修饰符
父类被重写的方法的返回值 子类被重写方法的返回值 结果
Number Number及Number的子类 可以
void void 可以
int double 不可以
3.子类方法抛出的异常不能大于父类被重写方法的异常
注意:
1.如果父类的方法被private修饰那么该方法不可以被子类重写
2. 如果和子类相同的方法,那么同时加static(不是方法的重写)要么不加static(是方法的重写)
4.@Override //注解:用来说明当前的方法是一个重写的方法
总结:super 和 this 的区别:
1.代表的事物不一样:
this:代表所属方法的调用者对象。
super:代表父类对象的引用空间。
2.使用前提不一致:
this:在非继承的条件下也可以使用。
super:只能在继承的条件下才能使用。
3.调用构造方法:
this:调用本类的构造方法。
super:调用的父类的构造方法
三.多态
1.多态性:一类事物的多种形态
2. 多态性的理解:
1.广义上:方法的重写,重载,子类对象的多态性
2.狭义上:子类对象的多态性
3.子类对象的多态性:父类的引用指向子类的对象
public classTest {public static voidmain(String[] args) {//父类的引用指向子类的对象
Person p = newWoman();//虚拟方法应用(动态绑定):编译看左边,运行看右边
p.eat();
p.show();//多态的缺点:不能调用子类中独有的方法和属性
/** 需求: 在多态的情况下如何调用子类中自己独有的方法和属性
* 向下转型*/Woman woman=(Woman)p;
woman.buy();//ClassCastException - 类型转换异常//因为P对象的本身就是一个Woman所以转成Man就会抛异常//Man m = (Man)p;//m.run();
/** 需求:如何防止类型转换异常
* a instanceof A: a 对象是否是A类型的一个实例。如果是返回true,否则返回false*/
if(p instanceofWoman) {
System.out.println("true");
}else{
System.out.println("false");
}
}
}