1. 封装
所谓的封装性指的是隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
引入封装性的原因:
- 我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。 - 使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题,当一个对象的数据可以随便访问,那么在程序的多个地方修改数据,很容易造成对象数据的混乱,所以将数据封装起来,向外部透露固定的数据访问方法,可以避免这些问题。
java中数据访问的四种权限修饰符
权限从小到大顺序为:private < 缺省 < protected < public
2. 继承
继承性指的是多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可获得这些相同的属性和方法,此处的多个类称为子类(派生类),单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”。
继承示意图如下:
继承的语法格式:
class A extends B{}
A:子类、派生类、subclass
B:父类、超类、基类、superclass
子父类的继承中子类继承了父类,就继承了父类的方法和属性,此外, 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。子类虽然继承了父类的属性和方法,但子类不能直接访问父类中私有的(private)的成员变量和方法,且Java只支持单继承和多层继承,不允许多重继承,即一个子类只能有一个父类,但一个父类可以派生出多个子类。
继承的作用:
- 继承的出现减少了代码冗余,提高了代码的复用性。
- 继承的出现,更有利于功能的扩展。
- 继承的出现让类与类之间产生了关系,提供了多态的前提。
3. 多态
多态性指的是父类对象的引用指向子类,表现为编译时类型和运行时类型不一致。
说明:
- 对象的多态 —在Java中,子类的对象可以替代父类的对象使用。
- 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
- 方法声明的形参类型为父类类型,可以使用子类的对象作为实参调用该方法。
虚拟方法的使用
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父
类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法
确定的。
栗子:
public class Test1 {
public static void main(String[] args) {
Person p = new Student("小明", 11001);//父类对象指向子类对象
p.printInfo();//p虽然为父类对象,但调用的是子类中的printInfo方法,父类中的为虚拟方法,实际上不调用
}
}
class Person{
private String name;
public Person(String name){
this.name = name;
}
public void printInfo(){
System.out.println("名字:" + name);
}
}
class Student extends Person{
private int id;
public Student(String name, int age){
super(name);
this.id = id;
}
@Override
public void printInfo(){
super.printInfo();
System.out.println("学号:" + id);
}
}
编译时p为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的printInfo()方法。——动态绑定
instanceof操作符的使用
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
- 要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
- 如果x属于类A的子类B,x instanceof A值也为true。
栗子
public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {…}
Person p = new Person();
System.out.println(p instanceof Person); //true
System.out.println(p instanceof Object); //true
System.out.println(p instanceof Student); //false
对象类型转换
从子类到父类的类型转换可以自动进行,从父类到子类的类型转换必须通过造型(强制类型转换)实现,无继承关系的引用类型间的转换是非法的,在造型前可以使用instanceof操作符测试一个对象的类型。
栗子
public class Test1 {
public static void main(String[] args) {
Student s = new Student("小明",23);
new Test1().cast(s);
}
public void cast(Person p){
if(p instanceof Student){//判断是否为子父类关系,为子父类关系才进行转型
Student s = (Student) p;
s.printInfo();
}
}
}
class Person{
private String name;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
private int id;
public Student(String name, int age){
super(name);
this.id = id;
}
public void printInfo(){
System.out.println( "学号:" + id);
}
}