一、面向对象
1、面向过程和面向对象
(1)面向过程:(代表:C)
注重步骤,因果关系----不需对象的提取和模型的建立
(2)面向对象:(代表:java)
注重对象,利用关系连接对象---将整个实现成抽象成一个个对象,特征作为属性,行为作为方法
【注】 C++:既支持面向过程,又支持面向对象,
一般说java和c++区别时,应提到面向对象和面向过程
2、对象---一个抽象概念,表示一类事物,具有共同的特征和行为
(1)一个类实例化出来的个体---对象
(2)创建对象的方式
- new------在堆空间中分配内存
- 反射机制---Class对象调用newInstance()
- 动态代理----通过字节重组生产一个替代原始对象的代理对象 proxy.newProxyInstance (JDK)
- clone---克隆方式(原型模型),对象调用clone(),copy一个相同的对象
- 反序列化----序列化 --对象从内存到硬盘,整个对象分块按顺序传输到硬盘
反序列化--对象从硬盘到内存,将对象块一点点传到硬盘组成一个整对象
【注】特殊的String对象
String对象的两种创建方式:
第一种方式: String str1 = "aaa"; 是在常量池中获取对象("aaa" 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象)
第二种方式: String str2 = new String("aaa") ; 一共会创建两个字符串对象一个在堆中,一个在常量池中
3、面向对象三大特征:
封装、继承、多态
二、封装-----私有化+set get
1、封装步骤
(1)私有化:属性用private修饰---只允许本类使用
(2)set get封装属性:为外界提供访问入口
2、封装作用
代码打包成一个整体, 不允许外部对象直接访问对象的内部信息
(1)保证内部结构的安全
(2)屏蔽复杂,暴露简单
三、继承----extend
1、继承关系 -----is a关系
子类 extends 父类{
}
2、继承作用
(1)基本作用:代码复用,父类中有的属性,子类中可以不用重新声明
(2)因为有了继承关系才有后期的方法覆盖和多态
3、继承特点
- 一个子类只能继承一个父类,只允许单继承,不允许多继承(C++可以),可间接继承
多个子类可以继承一个父类
-
子类继承父类除构造方法外剩下都可以继承---即父类的属性和方法相当于被复制到子类
父类中private修饰的私有属性可以继承但不能在子类中直接访问,可通过get方式间接访问
-
耦合度高,修改父类影响子类
四、多态----父类引用指向子类对象
1、多态的前提----有继承关系
多态---多种形态,编译时一种形态,运行时一种形态
animal a=new Cat();
编译看左边----animal类型引用----Animal.class
---判断调用的方法是否属于该类 ,属于子类特有方法--编译不通过;
属于父类方法(子父类共有)---编译通过,动态绑定
运行看右边--new子类对象,子类对象动态执行父类引用调用的方法---动态绑定
当
2、对象类型转换
(1)两种转型必须有继承关系才可以转型
(2)基本数据类型---自动类型转换和强制类型转换(需要加强制类型转换符)
引用数据类型---向上转型和向下转型
(3)引用:值保存的是内存地址的对象,特称为引用
个人觉得 其实还是对象,只是它的值是地址而一般对象的值是数据
3、向上转型----自动转换,调用和子类共有方法
子对象 转换成 父对象(父类型的引用指向子类型的对象,自动转换)
父类的引用只能调用和子类对象共有的方法
4、向下转型---强制转换,可调用子类特有方法
父对象 转换成 子对象(需要在父对象前加一个子类,强制转换)
为了父类型的引用也能调用子类对象特有的方法
[注]强转前要用instanceof判断是否可转
5、多态的两种实现方式
(1)重写(覆盖)-----方法名同,参数列表同
(2)重载-----方法名同,参数列表不同
[注]重写和重载具体可以看 方法内容介绍中。
6、多态实现步骤:
(1)将具体的不同对象抽象成一个大类作为父类 【animal】
(2)具体构建不同的具体类,并用extends继承父类,【dog,cat 】
可根据需要进行方法覆盖,重写父类里的方法【eat()】
但不可增加新的方法,因为父类里没有的方法,通过父类对象传参时,编译不通过
(3)功能类传参抽象类对象,通过抽象类的对象连接具体类的对象,
(4)测试时,需要什么对象,直接new具体对象即可,子类转为父类是自动转换的【dog--》animal】
调用被子类重写的方法,一般会根据后面new的什么类型子类对象,具体调用子类中重写后的具体方法实现