几天前,我们一同学习了Java面向对象三大特征之继承,今天我们将一起来学习两外两个:封装和多态。现在开始吧浅谈Java面向对象三大特征--封装,多态_封装

一:封装

   所谓的封装就是指将类中的属性私有化,对外提供公有的方法来使用即可。“高内聚低耦合”是软件开发过程中对模块的具体要求,如果一个类代表一个业务或模块,则他的属性可以看做是局部变量,来提高内聚性。

   具体实现为:

public class Person {
    private String name;// 私有属性
    private int age;// 私有属性
    public String getName() {// 提供访问私有属性的方法
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person(String name, int age) {//提供带参数的构造方法
        super();
        this.name = name;
        this.age = age;
    }
    public Person() {// 构造方法
        super();
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Person p = new Person("张三",20);
//      String name = p.name;不能通过这种方法来获得私有变量
//      int age = p.age;不能通过这种方法来获得私有变量
        String name  = p.getName();//通过提供的公有方法访问私有变量
        int age  = p.getAge();
        System.out.println("姓名:"+name);
        System.out.println("年龄:"+age);    
    }
}

结果:

姓名:张三
年龄:20

二:多态

   1:什么是多态

   多态指得是一个对象,多种状态。这里用到了继承的概念,子类继承父类之后,在使用时可以使用类似于“父类类名 对象名 = new 子类类名()”的形式来使用,但此时应注意以下几条:

   (1)发生多态时,只能调用父类的方法,不能调用子类的方法。

   父类:

public class Person {
    private String name;// 私有属性
    private int age;// 私有属性
    //为说明问题,省略了相应属性的get及set方法 
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
                                                                                                                                                                     
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public void study(){
        System.out.println("我是父类,我能学习");
    }
}

 子类:

public class Student extends Person {
    public Student() {
    }
    public void sing() {
        System.out.println("我是子类,我会唱歌");
    }
    public Student(String name, int age) {
        super(name, age);// 调用父类的构造方法,
    }
}

   测试类

public class Test {
    public static void main(String[] args) {
        Person p = new Student("小明", 20);
        p.study();//调用父类的方法没问题
//      p.sing();调用子类自己写的方法则不可以
    }
}

结果:

我是父类,我能学习

(2)发生多态时,如果子类重写了父类的某方法,则当被调用到这个方法时,调用的就是子类的了。

   父类同上。

   子类:

public class Student extends Person {
    public Student() {
    }
                                                               
    public void study(){
        System.out.println("我是重写的父类方法");
    }
    public Student(String name, int age) {
        super(name, age);// 调用父类的构造方法,
    }
}

   测试同上。

   结果:

我是重写的父类方法

(3)发生多态时,如果想要使用子类自己的方法,则需要强制类型转换。

   父类同上。

   子类同(1)。

   测试类:

public class Test {
    public static void main(String[] args) {
        Person p = new Student("小明", 20);
        Student stu = (Student)p;//强制类型转换,让P编程Student的对象
        stu.sing();//这时才可以调用子类自己的方法
    }
}

   结果:

我是子类,我会唱歌

   可能,刚开始学习这三大特征会有些难度,但随着我们的逐渐深入与理解,但终究会有一天全部掌握,不要灰心,继续加油浅谈Java面向对象三大特征--封装,多态_封装_02