面向对象的三个基本特征封装、继承、多态
封装是类和对象概念的主要特征,何为封装?封装是把事物抽象成一类,事物本身有自己的特征和自己的行为,将这些行为和行为隐藏起来只有自己和一些信任的对象才可访问。java封装的表现形式的修饰的关键字有public protected private 其中public的暴露程度是最大的,其次是protected(包访问权限)private(私有)仅仅自身才能看见访问。例如:package com.slove.com;
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;
}
}
上面的Person类中的name和age属性只有自己内部的方法才能访问到 。Person中的setName,getName,getAge,setAge则是所有类都能访问到 。此时我们就可以说,类中的成员变量被私有化了 。
继承,java中的继承和现实生活中的儿子继承老子的情况差不多(可以这样理解,但是有很多地方还是不同的)java中继承的表现形式有实现继承(对抽象类的继承),接口继承,和类的继承。接下来看看这三种形式的代码:
class Shape {
private float perimeter;
public float area;
public void getArea() {
System.out.println("面积面积面积Shape");
}
}
class Circle extends Shape {
public void getArea() {
System.out.println("面积面积面积Circle "+area);
}
}
当你用下面这几句话调用的时候会发现,Circle这哥们太不厚道了,拿Shape里面的area就跟拿自己的一样,这是因为perimeter和area用的public关键字修饰 ,如果用关键字private修饰的话子类中就无法访问了
Circle c = new Circle();
//c.perimeter = 5.0f ; //此处是会报错的
c.area = 3.1f;
c.getArea();
上面代码体现的是类的继承,抽象类的继承和类的继承区别在于,抽象类不能被实例化,因此要子类对齐方法覆盖然后子类去实例化之后才能用。下面这段代码如果自来Circle中没有对抽象类Shape中的抽象方法getArea覆盖的话编译的时候就会报错。
abstract class Shape {
public float perimeter;
public abstract void getArea();
public void getName(){}
}
class Circle extends Shape {
public void getArea() {
System.out.println("面积面积面积Shape");
}
}
接口实现和抽象类又有一点相似,接口中的方法没有方法体只有方法的定义,因此子类在实现了接口之后要对接口中定义的方法实现,有自己类中的类容。接口和抽象类都是在抽象类事物的共性,但是他们之间有存在区别,抽象类和实体的关系是:is-a的关系,接口和实体类的关系是like a 的关系。接口代码描述:
interface USB {
public void open();
public void colse();
}
public class BookPC {
public static void main(String[] args) {
usbInterface(new USBDriver());
usbInterface(new USBMose());
}
public static void usbInterface(USB u) {
u.open();
u.colse();
}
}
class USBMose implements USB {
public void open() {
System.out.println("USBMose is Open");
}
public void colse() {
System.out.println("USBMose is close");
}
}
class USBDriver implements USB {
public void open() {
System.out.println("USBDriver is Open");
}
public void colse() {
System.out.println("USBDriver is close");
}
}
多态是允许你讲某一个或者多个类设置成一个或多个子类对象的技术 ,就像上面代码陈述的那样,我只要使用USB接口不管是USB鼠标还是U盘,当我持有了一个USB型的对象的时候便可以使用鼠标和U盘
总结:
继承的特点:1.提高代码复用性;2.继承让类与类之间产生了关系,有了这个关系,才有了多态的特性。注意:千万不要为了获取其他类的功能,简化代码而继承,必须是类与类之间有所属关系才可以继承。所属关系 is a。java语言中只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类中定义了相同功能,但功能内容不同时,子类对象不确定要运行哪一个。但是java保留了这种机制,并用另一种体现形式来完成表示,多实现。java支持多层继承。也就是一个继承体系。如何使用一个继承体系中的功能呢?想要使用体系,先查阅体系父类的描述,因为父类中定义的是该体系中的共性功能,通过了解共性功能,就可以知道该体系的基本功能。那么这个体系已经可以基本使用了。那么在具体调用时,要创建最子类的的对象,为什么呢?一是因为有可能父类不能创建对象(抽象类);二是创建子类对象可以使用更多的功能,包括基本的,也包括特有的。
封装的好处:
a.将变化隔离
b.便于使用
c.提高重用性
d.提高安全性
多态:
多台中成员函数的特点:成员函数在多态调用时,编译看左边,运行看右边。子类中局部有变量就访问局部的,没有就访问成员的变量,成员中没有的就在父类中找;如果父类中没有,编译失败。
无论编译和运行,都参考左边的,即引用型变量所属的类型。也就是说父类中有自己的变量,则先找父类自己的成员。
包