1. 封装

所谓的封装性指的是隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
引入封装性的原因:

  • 我们程序设计追求“高内聚,低耦合”。
    高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
    低耦合 :仅对外暴露少量的方法用于使用。
  • 使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题,当一个对象的数据可以随便访问,那么在程序的多个地方修改数据,很容易造成对象数据的混乱,所以将数据封装起来,向外部透露固定的数据访问方法,可以避免这些问题。

java中数据访问的四种权限修饰符
权限从小到大顺序为:private < 缺省 < protected < public

java 接收子类参数_父类

2. 继承

继承性指的是多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可获得这些相同的属性和方法,此处的多个类称为子类(派生类),单独的这个类称为父类(基类或超类)。可以理解为:“子类 is a 父类”。

继承示意图如下:

java 接收子类参数_java-ee_02


继承的语法格式:

class A extends B{}
A:子类、派生类、subclass
B:父类、超类、基类、superclass

子父类的继承中子类继承了父类,就继承了父类的方法和属性,此外, 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。子类虽然继承了父类的属性和方法,但子类不能直接访问父类中私有的(private)的成员变量和方法,且Java只支持单继承和多层继承,不允许多重继承,即一个子类只能有一个父类,但一个父类可以派生出多个子类。

继承的作用:

  1. 继承的出现减少了代码冗余,提高了代码的复用性。
  2. 继承的出现,更有利于功能的扩展。
  3. 继承的出现让类与类之间产生了关系,提供了多态的前提。

3. 多态

多态性指的是父类对象的引用指向子类,表现为编译时类型和运行时类型不一致。
说明:

  1. 对象的多态 —在Java中,子类的对象可以替代父类的对象使用。
  2. 一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。
  3. 方法声明的形参类型为父类类型,可以使用子类的对象作为实参调用该方法。

虚拟方法的使用
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父
类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法
确定的。
栗子:

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);
    }
}