型面向对象那点儿事——封装、继承、多态

那些年陪咱们一块儿走过的面向对象语言,如今天天早上起来,依然陪在咱们身边。在你尚未清醒的时候,你是否听见它在你耳边反复絮叨:封装、继承、多态..........嘿嘿,也许你会说:No。不要紧,我会在这里絮叨一番的.........
java

  面向对象特性一:封装。对象的状态信息隐藏在对象内部,不容许外部程序直接访问,而是经过类提供的方法来实现对内部信息的操做和访问。要实现封装就须要依赖访问控制符:pubilc、private、缺省和protected。它们分别表明四个访问控制权限。控制级别从大到小的顺序为:public--->protected--->default--->private。ide

一、private:用它修饰的成员,只能在列内部被访问,因此用它来修饰属性最合适。能够把属性隐藏在类内部。工具

二、缺省:又称包访问权限。当类成员或类不使用任何访问控制符修饰的时候,咱们认为它是默认访问控制权限,只能被同一包下的其余类访问。学习

三、protected:子类访问权限。能够被同包的类访问,也能够被不一样包下的子类访问。测试

四、public:公共访问权限。能够被全部类访问。this

  面向对象特性2、继承。简单一点说,就是一种父子关系。子类使用extends关键字实现继承关系。经过继承,子类能够继承除私有成员外的全部方法和属性,同时子类能够有本身的方法和属性。程序演示:spa

父类:对象

public class Father {
private int a=1;
protected int b=2;
public int c=3;
int d=4;
}

子类:继承

public class Son extends Father{
    public static void main(String[] args) {
        Son s=new Son();
        s.b=1;
        s.c=2;
        s.d=4;
        //s.a=0;a 受private修饰,不可访问。程序在这出错
    }
}

注意父类属性的访问控制,以及extends关键字。get

在继承的学习中要注意,java是单继承的。若是一个类没有指定继承其余父类,则它的父类是Object。下面介绍两个重要的关键字,this/super。this是当前对象的引用。super表明父类对象的引用。对于子类它能够重写父类的方法,那么,在访问父类方法时候,就可使用super。程序演示:

public class Father {
public void say(){
    System.out.println("爸爸说了,不能和陌生人说话!");
}
}

子类:

public class Son extends Father{
    public void say(){
        System.out.println("嗯嗯,爸爸说得对!");
    }
    public void print(){
        super.say();//访问父类方法
        this.say();//访问子类
    }
    public static void main(String[] args) {
        Son s=new Son();
        s.print();
    }
}

程序注释,已经标明。运行一下,看到结果就会明白了。

 面向对象特性3、多态。一个对象,多种状态。父类引用能够指向父类对象也能够指向子类的对象。以多态的形式来传递参数,加强灵活性。

多态两点基本定理:

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

2. 发生多态时,若是子类中重写了父类的方法,再调用这个方法,调用的是子类重写以后的方法。

public class Father {
public void say(){
    System.out.println("爸爸说了,不能和陌生人说话!");
}
}

子类:

public class Son extends Father{
    public void say(){
        System.out.println("嗯嗯,爸爸说得对!");
    }
    public static void main(String[] args) {
        Father f=new Son();
        f.say();
    }
}

运行程序能够发现,运行了子类方法,输出的结果为——嗯嗯,爸爸说的对!

程序举例:

父类:

public class Emp {
    private String name;
    private int id;
    private int sal;
                             
    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Emp(String name, int id, int sal) {
        super();
        this.name = name;
        this.id = id;
        this.sal = sal;
    }
    protected String getName() {
        return name;
    }
    /*setter、getter方法*/
    public double getYearSal(){
        return 0;
    }
}

子类:

public class XZEmp extends Emp{
    private String team;
    private int comm;
                    
    public XZEmp() {
        super();
    }
    public XZEmp(String name, int id, int sal,String team, int comm) {
        super(name, id, sal);
        this.team = team;
        this.comm = comm;
    }
    protected String getTeam() {
        return team;
    }
    protected void setTeam(String team) {
        this.team = team;
    }
    protected int getComm() {
        return comm;
    }
    protected void setComm(int comm) {
        this.comm = comm;
    }
    public double getYearSal(){
        return 12*this.getSal()+this.comm;
    }
                    
}

Emp工具类:

public class EmpUtils {
public void del(Emp emp){
    System.out.println(emp.getName()+"被删除了!");
}
public double getMoney(Emp emp){
    return emp.getYearSal();
}
}

测试类:

public class TestEmp {
public static void main(String[] args) {
    Emp emp=new XZEmp("dd",121,5000,"java",12000);
    EmpUtils u=new EmpUtils();
    u.del(emp);
    System.out.println(u.getMoney(emp));
}
}
相关文章
相关标签/搜索