面向对象的三大特征
创建类的对象 = 类的实例化 = 实例化类
类和对象的使用(面向对象思想落地的实现):
-
创建类,设计类的成员
-
创建类的对象
-
通过“对象,属性“或”对象,方法“调用对象的结构
如果创建了一个类的对个对象,则每个对象都独立的拥有一套类的属性。意味着,如果我们修改一个对象的属性a,则不影响另外一个对象的属性a的值。
子类对象的实例化全过程
-
从结果上看:(继承性)
子类继承父类以后,就获取了父类中声明的属性和方法。
创建子类对象,在堆空间中,就会加载所有父类中声明的属性。
-
从过程上来看:
当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用父类的构造器,接着调用其父类的父类的构造器,直到到Object类为止。所以我们可以在内存中看到父类的结构。
匿名对象 :在创建对象时,没有直接声明名称。
Class Phone { Phone p = new phone();//普通方式创建对象 p.sendEmail();//匿名对象只能直接调用方法 new Phone().sendEmail();//匿名对象调用属性 new Phone().price = 1999; }
1.封装性
把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作[方法],才能对数据进行操作。
优点
-
隐藏实现细节
-
可以对数据进行验证,保证安全合理
实现步骤
- 将属性进行私有化
private
【不能直接修改属性】 - 提供一个公共的(
public
)set
方法,用于对属性判断并进行赋值 - 提供一个公共的(
public
)get 方法,用于获取属性的值
- 将属性进行私有化
2.继承性
继承可以解决代码复用,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,所有子类只需要继承父类,便可使用这些属性和方法。
继承的基本用法: class
子类 extends
父类{}
1. 子类会自动拥有父类定义的属性和方法
1. 父类又叫超类,基类。
1. 子类又叫派生类。
继承细节:
-
子类必须调用父类的构造器,完成父类的初始化
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
-
如果希望指定去调用父类的某个构造器,则显式的调用一下 :super(参数列表)。
-
super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器。
-
父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)。
-
子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
super关键字
super
代表父类的引用,用于访问父类的属性,方法,构造器基本语法
-
访问父类属性(不能访问
private
属性)super.属性名
-
访问父类方法(不能访问
private
方法)super.方法名(参数列表);
-
访问父类构造器
super(参数列表);只能放在构造器的第一句,只能出现一句!
-
super和this的比较
区别点 | this | super |
---|---|---|
访问属性 | 访问本类中的属性,如果本类中没有此属性则从父类中继续查找 | 从父类开始查找属性 |
调用构造器 | 访问本类中的方法,如果本类中没有此方法则从父类中继续查找 | 从父类开始查找方法 |
调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
特殊 | 表示当前对象 | 子类中访问父类对象 |
3.多态
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在
封装和继承基础之上的。
多态的具体表现
-
方法的多态(方法的重写和重载)
方法的重写即子类继承父类,重写父类方法
方法的重载指在一个类中有多个方法名相同但参数不同的方法
-
对象的多态
- 一个对象的编译类型和运行类型可以不一致
- 编译类型在定义对象时,就确定了,不能改变
- 运行类型是可以改变的
- 编译类型看定义 = 的左边,运行类型看右边
多态注意事项:
- 多态的前提是:两个对象(类)存在继承关系
- 多态的向上转型
- 本质:父类的引用指向了子类的对象
- 语法:父类类型 引用名 = new 子类类型();
- 特点: 可以调用父类中的所有成员(需遵守访问权限),不能调用子类中的特有成员;
- 多态的向下转型
- 语法:子类类型 引用名 = (子类类型)父类引用;
- 只能强转父类的引用,不能强转父类对象
- 要求父类的引用必须指向的是当前目标类型的对象
- 当向下转型后,可以调用子类类型中的所有成员
java
的动态绑定机制
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行地址绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
多态的应用
-
多态数组 :数组的定义类型为父类类型,里面保存的实际元素类型子类类型(
调用子类特有方法需要用到向下转型
) -
多态参数 :方法定义的形参类型为父类类型,实参类型允许为子类类型