一.封装
回顾:
通过实例对象可以任意访问成员变量,这就造成了极大的安全隐患因此采用封装的手段
vate,default,protected,public;
private只能允许本类访问;
default允许允许同一包下访问;
protected允许继承本类的子类访问;
public允许外部类访问;
通常情况下,为了保证程序的高内聚低耦合所以,只暴露少量外部方法,将成员变量做private封装只提供get,set方法。例如:工具类Bean类。这样减少外部对类和方法内部的参与。
假如要写一个父类类,有很多方法需要子类继承并实现的,这样的通常使用protect修饰。
像public这样一般修饰提供给外部类使用的方法或成员,例如:utils工具类和构造方法
特别注意:
外部类修饰词只有两种默认即public和默认,因为其他修饰符对外部类无实际意义。
二.深入理解构造器
回顾:
用处:创建对象时初始化。
调用构造方法创建实例时,系统已经在堆内存分配内存空间,并初始化。
当构造方法结束时,将实例对象返回。
初始化规则:基本数据类型0,或者false,引用型数据类型都是null。
特别注意:
使用工厂模式,反射等方式,依然是依赖构造器实现的。
子类继承父类时,执行构造方法,都会先调用一次父类的构造方法。(按层次依次调用)
三.继承
回顾:
继承为单继承。
重写规则:“两同”(方法名相同,参数列表不同)“两小”(异常和返回值类型要小于父类)“一大”(访问权限要大于等于父类)
特别注意:
如果子类和父类有同名Field,则系统会分配两块内存空间(堆内存)分别存储两个Field,并在子类中把父类的Field隐藏起来。并不是完全覆盖了。可以通过super调用父类隐藏的Field或者是父类原有方法(重写之前的同名方法)。
四.多态
回顾:
什么是多态性:
在同一类中方法的重载,体现了方法的多态性。
同名方法在子类和父类之间产生多态,体现了类的多态性。
接口和抽象类也体现了接口的多态性。
特别注意:
多态存在的必要条件:
1必须要有继承
2必须要复写
3父类引用指向子类对象
class Father{
public int a=6;
public void test(){
syso.printf("父类方法");
}
punlic void fatherMotherd(){
syso.printf("父类方法");
}
}
class Son extends Father{
public float a=3.0;
public void test(){
syso.printf("子类方法");
}
public void sonMethord(){
syso.printf("子类特有方法");
}
}
class test{
public void main(String[] args){
//父类引用指向子类对象,这也是一种向上转型,是系统自动完成的。
//fason 的编译时类型是Father,而运行时类型是Son
Father fason=new Son();
//对象Field是不具备多态性的,系统总是访问编译时的Field,而不是运行时的Field,因此下面代码输出的a是6!
syso.printf("输出a="+fason.a);
//执行方法时分为以下几种情况:
//1.执行父类方法,这时没有体现出多态。
fason.fatherMethord();
//2.执行父类没有的方法,即子类的方法,这时会出现编译失败。因为在编译期,该引用的类型并没有该方法,因此此时需要向下转型!// (Son)fason;将其进行向下转型
//fason.sonMethord();//由于不能执行所以注释掉了!
//3.执行同名方法,这是就出现了多态,此时会根据执行时类型执行对应的方法。
fason.test();
//此刻输出的就是子类的方法,如果想要执行父类方法则需要super.test();
}
}