面向对象编程有三大特征: 封装、继承和多态。
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 运行类型B
A a=new B();//向上转型
System.out.println(a.i);//调用对象属性,输出10
System.out.println(a.sum());//调用对象方法,输出40
System.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;
}
}