面向对象编程有三大特征: 封装、继承和多态。
1.封装
1)封装介绍
封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起数据被保护在内部.程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。
2)封装的理解和好处
隐藏实现细节 : 方法(连接数据库)<--调用(传入参数.)2)可以对数据进行验证,保证安全合理
Person {name, age}Person p = new Person();p.name = "iack";p.age = 1200;
3)封装的实现步骤(三步)
(1)将属性进行私有化private[不能直接修改属性]
private int Xxx;
(2)提供一个公共的(public)set方法,用于对属性判断并赋值
public void setXxx(类型 参数名){//Xxx 表示某个属性//加入数据验证的业务逻辑属性 = 参数名;}
(3)提供一个公共的(public)get方法,用于获取属性的值
public 数据类型 getXxx(){//权限判断,Xxx 某个属性return Xxx;}
2.继承
1)继承介绍
继承可以解决代码复用 , 让我们的编程更加靠近人类思维 . 当多个类存在相同的属性 ( 变量 ) 和方法时 , 可以从这些类中抽象出父类, 在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可。画出继承的示意图
2)继承的基本语法
class 子类 extends 父类{}
1)子类就会自动拥有父类定义的属性和方法
2)父类又叫 超类,基类
3)子类又叫派生类
3)super基本介绍
super 代表父类的引用,用于访问父类的属性、方法、构造器
(1)访问父类的属性,但不能访问父类的private属性
(2)super.属性名:访问父类的方法,不能访问父类的private方法super.方法名(参数列表):
(3)访问父类的构造器:
(4)super(参数列表);只能放在构造器的第一句,只能出现一句!
super和this的比较
3.多态
1)多态基本介绍
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时,就确定了,不能改变
(3)运行类型是可以变化的编译类型看定义时 = 号 的左边,运行类型看 = 号的 右边
比如:
Animal animal = new Dog(); [编译类型是Animal,运行类型Dog]
animal = new Cat();[animal 的运行类型变成了 Cat, 编译类型仍然是 Animal)
2)多态注意事项和细节讨论
多态的 前提是: 两个对象(类)存在继承关系
多态的 向上转型:
(1)本质:父类的引用指向了子类的对象
(2) 语法:父类类型 引用名 = new 子类类型();
(3)特点: 编译类型看左边,运行类型看右边。
可以调用父类中的所有成员(需遵守访问权限),
不能调用子类中特有成员;
最终运行效果看子类的具体实现!
多态的 向下转型:
(1)语法: 子类类型 引用名 (子类类型)父类引用;
(2)只能强转父类的引用,不能强转父类的对象
(3)要求父类的引用必须指向的是当前目标类型的对象
(4)当向下转型后,可以调用子类类型中所有的成员
3)java的动态绑定机制*
Java 重要特性 : 动态绑定机制
java的动态绑定机制: .
(1)当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
(2)当调用对象属性时,没有动态绑定机制,哪里声明,那里使用
示例:
public class DynamicBinding {public static void main(String[] args) {//a的编译类型A 运行类型BA a=new B();//向上转型System.out.println(a.i);//调用对象属性,输出10System.out.println(a.sum());//调用对象方法,输出40System.out.println(a.sum1());//调用对象方法,输出30}
}
class A{//父类public int i=10;//动态绑定机制public int sum(){//父类sum()return getI()+10;//}public int sum1(){//父类sum1()return i+10;//}private int getI() {return i;}
}
class B extends A{//子类public int i=20;//动态绑定机制public int sum1(){return i+10;//}public int sum(){return getI()+20;//}private int getI() {//子类getI()return i;}
}