那些年陪咱们一块儿走过的面向对象语言,如今天天早上起来,依然陪在咱们身边。在你尚未清醒的时候,你是否听见它在你耳边反复絮叨:封装、继承、多态..........嘿嘿,也许你会说: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)); } }