一.封装
1.为什么要封装
在某些重要类内,如银行系统,账户信息,等拥有储存重要信息的能力的类内有一些重要的属性和方法不想让外部简简单单的就直接访问或者更改数值,如student.age = 5; 这种语句是这些重要类不愿意看到的.所以为了解决这一问题Java提供了private关键字,这一关键字使得其修饰的方法,变量,甚至是类都不能被其他的类使用.这就是封装,如:
classStudent{privateString name;privateString score;/***@returnthe name*/
publicString getName() {returnname;
}/***@paramname the name to set*/
public voidsetName(String name) {this.name =name;
}/***@returnthe score*/
publicprivate String getScore() {returnscore;
}/***@paramscore the score to set*/
public voidsetScore(String score) {this.score =score;
}
}
被private修饰符修饰过了的属性其他类是无法直接调用的,所以会设置一些方法能给这些属性赋值,也就是get/set方法,如果一些属性不想被获取数值可以给get方法也设置一个private修饰符
2.为封装准备的修饰符:
Java一共为封装准备了四种访问修饰符:public default protected private,这四个关键字的使用限定如下:
修饰符/使用范围
本类
同包类
不同包子类
其他
private
1
0
0
0
default
1
1
0
0
protected
1
1
1
0
public
1
1
1
1
3.一些访问量比较大的类,如Factory这种类,一般是只能有一个实例对象,那为了不允许外部随意就整一个新的对象出来,程序员可以使用各种单例模式的实现方法对这个类进行封装然后只留一个在类内就实例化的对象供外部访问
4.各种内部类也可以为封装提供便利
5.总的来说,封装就是为类的安全性以及延展性提供的
二.继承
1.继承的语法:
class ClassA extendsClassB{
}
2.继承的细节:
i.子类继承父类,现有父类再有子类,所以调用子类的构造方法时会先调用父类的构造方法(静态块加载时间远在构造之前);
ii.子类除了父类的构造方法和父类不想子类继承的属性方法外会继承父类的一切能力
iii.子类可重写父类方法,也就是另一种形式的覆盖,只不过是发生在子类中罢了,当子类要重写父类方法时,首先子类必须能继承父类的这个方法,其次这个方法的参数列表不可改变,然后返回值类型要么相同要么是子父类的关系
然后这个方法的访问修饰符不能严于父类,父类是default子类就不能用private限制它
iv.构造子类时会把子类和父类放在同一个内存空间里,当一个引用指向子类空间时且要使用其内部的属性方法时jvm会先在子类空间内寻找,如果找到就会使用子类的,否则还会跑去父类里面找
3.this,super关键字
i.this代表的是本类,super代表的是超类
ii.在构造方法里,子类默认第一行有super()
iii.构造方法里this(),super()必须在第一行,所以有this()无super()有super()无this()
三.多态
1.什么是多态
多态简单来说就是父类的引用指向子类的实例:
Class Test{
ClassA a= newClassB();
}
这个时候的ClassA是ClassB的父类,a是A的引用,但指向的是B的空间,这个时候的a能调用B继承下来的方法,但无法调用B特有的方法
2.为什么要用多态
有时候一个类,比如Bird,Fish,Dog这种类,都需要同一个方法名的方法 breath(),而使用多态后对于父类方法的重写能很好的解决这一问题
或者又有时候一个方法需要一个参数,而这个参数又需要多种类型,重载就显得笨重繁琐,这个时候使用多态,用父类作为方法参数就能解决它
四.抽象
1.抽象关键字:abstract 的使用:
abstract classTestAbstract{
String string;public voidfunction() {
}public abstract voidabstractFunction();
}
使用abstract修饰的类是抽象类,这种类内可以有普通成员变量,普通方法,也可以有抽象方法
2.抽象类的特性
i.这种类能被编译成.class文件
ii.抽象类不能被实例化,但可以有构造方法,静态块,构造块之类的
iii.抽象类的子类必须重写超类内的所有抽象方法,否则这个子类也需要声明为抽象的
iv.抽象类为什么要有构造方法:子类要被构造出来必须通过父类的构造方法,归根结底,没有父类的构造方法就不能有子类的诞生,子类所有的实例都有父类的构造方法参与构造