面向对象程序设计
前言
今天我为大家简单的介绍下面向对象程序设计,若是有些地方不能理解,那就得花下功夫了,因为面向对象程序设计是我们 java 语言中的重点内容,不能有一点含糊,不过也不可能一开始就深究其原理,我们这次只是为大家介绍个大概,今后还会详细讲解其中的知识点。
面向对象的程序设计语言通常都包含三大特征
1. 封装
2. 继承
3. 多态
封装
信息隐藏
信息隐藏是对象的一种保护机制,使得它的属性或方法不被外部的程序直接访问;外界对类内部定义的数据(对象的成员变量)直接操作会导致数据的错误、混乱或安全性问题。
例:
public class Customer {
private int id;
private int vipLevel = 3;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getVipLevel() {
return vipLevel;
}
public void setVipLevel(int vipLevel) {
this.vipLevel = vipLevel;
}
}
类的封装表现形式通常为:将类中的属性通过private私有化,然后提供public方法以此对外提供访问接口(例如set,get方法)
在本例中, id 和 vipLevel 属性就被封装起来,外部无法直接访问操作该属性,只能通过 set 和 get 方法来进行操作。
继承
java中通过继承,可以提高类的可扩展性,以及代码的可复用性;继承是一种 is a 的关系
语法
[修饰符] class 子类名 extends 父类名称{
//属性、方法的声明
}
例:
父类
public class Father {
public String firstName;
private double money;
public void run() {
System.out.println("奔跑");
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
子类
public class Son extends Father{
}
本例中,子类 Son 继承了 父类 Father ,获得了父类中任何非私有的属性和方法,例如 FirstName 属性 和 run()方法,但子类无法继承私有属性 money ,在这里 money 被封装起来了,只有 Father 类才能直接调用,不过子类可以通过 getMoney()方法获得 money 的值 和 setMoney(double money) 方法修改 money 的值。
关于继承注意事项
- java中一个父类可以存在多个子类
- java中一个子类只能有一个父类
- Java中虽然不能多继承,但是可以使用多重继承到达多继承目的
- 子类继承父类之后,子类中可以使用父类的非私有元素(属性,方法) ``````代码可复用性
- 子类除了可以直接使用父类中的非私有元素外,还可以扩展自己的信息``````代码可扩展性
- 在创建子类对象时,通常是先调用父类构造器(不是创建父类对象)完成初始化操作,再执行子类构造器完成子类对象的创建以及初始化(调用默认构造器)
- 如果父类中不存在默认构造器,则子类中需要通过super显式的调用父类的其他构造器
- 构造器不能被继承,只能被子类调用(初始化子类时)
多态
方法重写( Override)
子类继承父类后,对父类中的某些方法覆盖,重新实现;在创建子类对象后再调用该方法时,此时使用的就是被重写之后的方法,而不是父类的方法
public class Animal{
public void eat(){
System.out.pritnln("吃食物");
}
}
public class Dog extends Animal{
/**方法重写*/
@Override
public void eat(){
System.out.println("吃骨头");
}
}
注意事项:
- 方法的重写发生在继承关系的子类中,一般为子类重写父类的方法
- 被重写的方法名称必须跟父类方法名保持一致
- 被重写的方法中参数的个数,顺序,类型必须跟父类方法一致,否则,该操作称之为重载而非重写
- 被重写的方法返回值必须跟父类方法一致
- 子类中重写的方法访问权限不能小于父类
方法重载(Overload)
方法的重载是面向对象程序多态的一种实现策略,表现是在同一个类中的多个同名方法的不同体现形式。
public class PrintDemo {
public void write(int i){
System.out.println(i);
}
public void write(float f){
System.out.println(f);
}
public void write(String s){
System.out.println(s);
}
public static void main(String[] args) {
PrintDemo pd = new PrintDemo();
pd.write(3.14F);
pd.write("hello");
pd.write(10);
}
}
注意事项
- 方法的重载一般发生在同一个类或者存在继承关系的多个类中
- 重载必须要保证被重载方法参数类型,个数,顺序至少有一项不一致(当然也不能全部不一致)
- 方法的重载跟返回值无关
方法的重写和重载都是多态一种实现策略
多态是面向对象三大特征中最重要的一种特征,多态可以体现方法层面,方法层面的多态由重载和重写实现;另外多态最重要的体现在变量层面,可以使用一个父类的引用变量指向任何的子类对象,从而实现引用动态绑定机制。
例:
public class Animal{
String name;
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(name+"吃东西");
}
}
public class Dog extends Animal{
public Dog(String name){
super(name);
}
}
public class Test{
public static void main(String[] args){
//父类引用指向子类对象(向上转型)
Animal a = new Dog();
//下转型
Dog d = (Dog)a;
}
}
使用多态可以提高程序的可扩展性,多态也称之为动态绑定
使用父类引用指向子类对象,引用则只能调用子类继承了父类的属性和方法,不能调用子类自定义的属性和方法。
可以使用父类引用指向子类对象,但是如果使用子类引用指向父类对象时,操作不当将会导致类型转换异常
java.lang.ClassCastException
结语
今天只是为大家粗略的介绍了下面向对象,里面还有许多需要深究的问题。我在这里没有提出,希望大家在下面能多练,向上转型和向下转型有机会我会带大家拓展一下,现阶段大家只需要将我所列出的知识点与语法牢记。