面向对象——封装、继承、多态

封装

把数据私有化(private),使得需要存入(set)或获得(get)数据需要通过方法进行。

public class Person{
    //对属性的封装
    //一个人的姓名、年龄均属于其私有属性
    //这种情况下,无法直接存入或获取属性
    private String name;
    private int age;
  
    //对其进行方法的封装
    //通过调用方法来控制属性的存入和获取
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }  
}

继承

如果类A继承类B,那么类B就是类A的父类,类A就是类B的子类。

注意:

 

1、继承用extends和implements来表示
  a、extends针对普通父类使用
  b、implements针对接口使用
2、一个子类只能继承一个父类,但可以继承多个接口
3、子类不能继承父类带final、private修饰的方法和属性

以下我们从三个方面来说明继承:

1、普通父类的继承(private、protected、public、final、static)

public class Father {
    /*
     * 父类:
     *         1、private的小金库
     *         2、protected修饰的工作
     *         3、public修饰的卧室
     */
    private int money;
    protected String work;
    public String bedroom;
    
    /*
     * 获取小金库及存入小金库的方法
     */
    public void setMoney(int money){
        this.money = money;
    }
    public int getMoney(){
        return money;
    }
    //建立一个无法继承的final方法
    final String sport(){
        return "下班去运动";
    }
    static String ring(){
        return "戒指安静地带在无名指上";
    }

    public String getBedroom() {
        return bedroom;
    }

    public void setBedroom(String bedroom) {
        this.bedroom = bedroom;
    }
}
public class Son extends Father{
    //子类继承父类
    /*
     * 子类继承了父类的存入小金库的方法和进入卧室的方法,
     * 比较两个方法,我们可以看到,setMoney里面有super(超类),
     * 而setBedroom里面直接可以用this,
     * 这说明了子类没有继承父类中的money属性
     * 而继承了父类中的bedroom属性
     * 则子类没法继承父类的private方法
     */
    public void setMoney(int money){
        super.setMoney(money);
    }
    public void setBedroom(){
        this.bedroom = bedroom;
    }
    //下面这个方法会报错,因为父类定义了final
//    public String sport(){
//        
//    }
    
    //下面这个方法也会报错,因为用static修饰了ring,不能再被继承
//    public String ring(){
//        
//    }
}

2、抽象类的继承

public abstract class Dog {
    public String name;
    /*
     * 建立一个Dog抽象类
     * 1、定义一个run方法
     * 2、判断是否eat
     * 3、定义一个sleep方法
     */
    //以下两个类都是abstract修饰,所以子类一定要继承
    //抽象类不可定义private方法
    protected abstract void run();
    public abstract boolean eat();
    /*
     * sleep方法没有abstract修饰,
     * 所以需要有方法体,
     * 同时子类不一定要继承
     */
    
    public void sleep() {
    }    
}
public class Pupper extends Dog {
    /*
     * Pupper类继承Dog类的方法
     * Dog类定义的抽象方法都需重写(public、protected)
     * 没有定义抽象类的不一定要重写
     */
    public void run() {
        System.out.println("Pupper can't run very fast!");
    }
    public boolean eat() {
        return true;
    }
}

3、接口的继承

public interface Base {
    //接口Base定义了增删改查的方法
    public void add();
    public void delete();
    public void update();
    public void query();
}
public interface Dictionary extends Base {
    //继承Base类中的基础方法
    public void choice();
}
public class DictionaryD implements Dictionary {
    /*
     * DictionaryD继承接口Dictionary,
     * 此时需要继承所有的Dictionary接口中的方法
     */
    public void add() {
    }
    public void delete() {
    }
    public void update() {
    }
    public void query() {
    }
    public void choice() {
    }
}

 多态

多态就是同一个行为具有多个不同的表现形式或形态的能力
多态存在的三个必要条件:
1、继承
2、重写
3、父类引用指向子类对象

实现多态的3种手段:
1、虚方法
2、抽象类
3、接口

abstract class Human {
    //定义人类有吃的抽象方法
    abstract void eat();
}
public class Man extends Human{
    //男人继承人类的方法
    public void eat() {
        System.out.println("男人就该大口喝酒大口吃肉,但别被老婆发现");
    }
}
public class Woman extends Human{
    //女人同样继承人类的吃方法,但是和男人的吃方法不同
    public void eat() {
        System.out.println("女人就该在众人面前保持矜持的吃法,但没人看就吃多");
    }
}
public class HumanDemo {
    public static void main(String []arg){
        //向上转型
        Human m = new Man();
        Human w = new Woman();
        m.eat();
        w.eat();
        //向下转型
        Man M = (Man)m;
        M.eat();
    }
}

 

posted @ 2016-10-08 20:15  伊人叫我改名叫睿睿  阅读(141)  评论(0)    收藏  举报