面向对象的基本特性包括三点:封装 继承 多态。
1封装性
封装性是一种信息隐蔽技术,它体现于类的说明,是对象重要的特性。封装使数据和操作该数据的方法(函数)封装为一个整体,形成独立性很强的模块,使得用户只能看到对象的外部特性(对象可以接受哪些信息,可以进行何种处理),而对象的内部特性(内部private的属性和实现处理能力的算法)用户是看不到的。简言之就是封装使对象的设计者和对象的使用者分开,使用者只要知道对象可以做什么,无需知道是怎么做出来的。借助封装有助于提高类和系统的安全性。
看一下下面的例子:
没有封装的程序:
class Person{
String name;
int age;
public void say(){
System.out.println(“NAME:***”+name+” AGE:***”+age);
}
}
public class Demo01{
public static void main(String arg[]){
Person p=new Person();
p.name=“Michael”;
p.age = –26;
p.say();
}
}
运行结果:
未封装时程序可以通过编译运行也没有问题,但是年龄是不可以为负值的。这就是属性直接对外可见造成的笑话。
封装后的程序:
class Person{
private String name;
private int age;
public void say(){
System.out.println(“NAME:***”+name+” AGE:***”+age);
}
}
public class Demo02{
public static void main(String arg[]){
Person p=new Person();
p.name=“Michael”;
p.age=-26;
p.say();
}
}
运行结果:
由于进行了封装,属性对外不可见,所以编译时提示上图灰色区域中的内容。
对于封装的属性的设置和取得应该通过setter和getter方法,通过Setter和Getter方法设置封装的属性并对年龄值进行检查的程序如下:
class Person{
private String name;
private int age;
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
public void setAge(int a){ //Setter是入口,Getter是出口,在setter方法处检查年龄是否在允许的范围内。
if(a>=0&&a<120){
age=a;
}else{
age = -1;
System.out.println("年龄非法");//提示年龄非法;
}
}
public int getAge(){
return age;
}
public void say(){
System.out.println("NAME:***"+name+" AGE:***"+age);
}
}
public class Demo04{
public static void main(String arg[])
{
Person p=new Person();
p.setName("Michael");
p.setAge(-26);
p.say();
}
}
此时运行后提示年龄非法:
2继承性
继承是一种由已有类创建新类的机制,利用继承,可以先创建一个共有属性的一般类,根据这个一般类再创建具有特殊属性的新类。新类继承一般类的方法并根据需要增加它自己的新方法。有继承而得到的类称为子类,被继承的类称为父类(超类),当然子类也可以成为父类。如下图,由下向上看,双炸飞机类和歼击机类都继承了战斗机类的特点但又分别具有自己新的功能,同样,战斗机类和民用机类都具有飞机类所有的特点也都扩展了属于自己的新功能。也就是说双炸飞机和歼击机既具有飞机的全部特点又拥有战斗机的全部特点。
用程序说明一下:
class Person{
String name;
int age;
public String getInfo()
{
return "姓名:---"+this.name+"\n"+"年龄:---"+this.age;
}
}
//Student类继承Person类
class Student extends Person
{
String school;//Student类中扩展的属性
}
public class Demo01 {
public static void main(String args[])
{
Student s = new Student();
//在 Person 类中为属性赋值
s.name = "Michael";
s.age = 25;
//在 Student 类中为属性赋值
s.school = "Camoridge University " ;
System.out.println(s.getInfo()+"\n"+"学校:---"+s.school);
}
}
运行结果如下
3多态性
同一个信息被不同的对象接收到时可能产生完全不同行为,这就是多态性。通过继承过程中的方法重写就可以实现多态。多态可以改善程序的组织构架,提高程序的可读性,也是程序更容易扩充。
用下面的程序说明一下:
class A
{
public void fun1()
{
System.out.println("使用父类方法!");
}
}
class B extends A
{
// 此方法重写父类中的fun1()方法
public void fun1()
{
System.out.println("父类方法已被子类方法重写!"+"\n"+"使用子类方法");
}
}
public class Overrid
{
public static void main(String args[])
{
A a = new A();
B b = new B();
a.fun1();
b.fun1();
}
}
运行结果如下:
同样使用了fun1()方法,在父类和子类中产生了完全不同的结果。
在此简单说明一下重写和重载的区别。重写(Override)是发生在子类和父类之间,为满足需要,子类对从父类中继承来的方法进行重写,方法的名称和参数类型或个数相同但是子类方法的访问权限不可以比父类更严格。而重载(Overloading)只发生在同一个类中,方法的名称相同,但是参数的个数或者类型不同。