--------------------------- 中关村黑马程序员训练营 --------------------------------
面向对象及对象的特征
.------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1.Java语言特点
简单性
解释性
面向对象
高性能
分布式处理
多线程
健壮性
动态
结构中立
安全性
开源
跨平台
2.什么是面向对象?
把许许多多相似的功能方法函数封装在一起,组成一个对象,由这个对象来调用它里面的所有的功能方法
3.类与对象关系
类: 是一组对事物的相关的属性(变量)和行为(方法)的集合。 是个抽象的概念(车设计图纸)
对象:是该类事物的一个具体存在的实列 。 是个具体的实例对象 (A汽车B汽车C汽车)
4.JAVA的开发,设计,特征
面向对象开发 就是不断的创建新对象,使用对象,指挥对象做事情。
面向对象设计 其实就是在管理和维护对象与对象之间的关系。
面向对象三大特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism)
A.封装(encapsulation)
定义: 是指隐藏 本类的成员(变量,方法)(私有化了)和实现细节, 只对外提供公共访问方法 。
好处: 隐藏本类的实现细节,只对外提共公共访问方法。提高代码安全性(避免外人篡改)。提高复用性
设计原则: 把不想让外界知道的实现细节给隐藏起来,只提供公共的访问方式
封装的体现:类(封装成员变量,方法);方法(封装代码),private修饰成员变量(封装成员变量)
B.继承(inheritance) // 使用继承体现is a关系。 谁(子类)是(is a)谁(父类)的一种
(1)定义:将多个类中 相同的 内 容抽取到 另一个类中,
那么多个类(子类)无需再定义这些内容 ,只要继承另一个类(父类)即可。
(2)继承的好处:
A:提高了代码的复用性(代码可多次使用)
B:提高了代码的维护性(便于代码的方便修改)
C:让类与类产生了一个关系(父子关系),是多态的前提 (双刃剑,即使好处又是弊端)
(3)继承的弊端:
A:让类与类之间的耦合性(关系)增强。(设计程序要:要低耦合(降低类与类的关系),高内聚(提升程序自身的独立性))
(4) Java中继承的特点
A. 只能单继承, 不支持多继承。(只有一个老爹)
B.支持多层继承
(5) Java中继承的注意事项
A.子类只能继承父类所有非私有的成员方法和成员变量
B. 子类不能继承父类的构造方法,但是可以通过super 关键字去访问父类构造方法
(5.5)Java继承中的成员关系
A:成员变量
a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单
b:子类的成员变量名称和父类中的成员 变量名称一样,这个怎么访问呢?
子类的方法访问变量的查找顺序: //就近原则
在子类方法的局部范围找,有就使用。
在子类的成员范围找,有就使用。
在父类的成员范围找,有就使用。
找不到,就报错。
B:构造方法
a:子类的构造方法默认会去访问父类的无参构造方法 super()
是为了子类访问父类数据的初始化
b:父类中如果没有无参构造方法,怎么办?
子类通过super(..)去明确调用父类的带参构造,再手动添加一个super()
子类通过this(...)调用本身的其他构造方法,但是一定会有一个构造方法去访问了父类的构造
让父类提供无参构造
C:成员方法
a:子类的成员方法和父类中的成员方法名称不一样,这个太简单
b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢?
通过子类对象访问一个方法的查找顺序:
在子类中找,有就使用
在父类中找,有就使用
找不到,就报错
(6)继承中子类的构造方法与父类的构造方法关系--1
(子)类中所有的构造方法(不带参,带参)默认都会访问父类中空参数的构造方法 super()
因为子类要继承父类,就要使用父类的数据,
所以子类在初始化之前,一定要先完成对父类的数据的初始化,才能使用父类的数据
所以 子类的所有的构造方法里的第一条语句上有一个默认 的:super(); ,
super()是子类构造方法调用父类的空参构造方法, 以完成对父类的数据的初始
(7) .继承中子类的构造方法与父类的构造方法关系___2
如果父类中没有空构造方法(被我搞没了),该怎么办呢?
报错 无法将父类的构造器应用到给指定类型
改错 1. 在父类人为定义一个空构造方法 ,在定义一个有带参构造方法(覆盖了默认空构造方法)
2.在父类不定义构造方法,用系统默认的空构造方法
所以我们定义父类的构造方法,一定要定义父类的空构造方法(可以是自定义的,也可以是默认的空构造方法)
不能单独定义有参构造方法,(而把默认的空构造方法给覆盖了)+在加个自定义的空构造方法
3.子类的构造方法里通过调用 super(参数name) ,去显示的调用父类的相对应的带参构造方法
这样也能达到对父类的数据的初始化
4.子类一个构造方法里有this()或this(有参)去调用本类的其他构造方法
(其他的构造方法(有super()或super(有参))能访问父类的对应的构造方法,也能初始化父类的数据)
总之,子类中一定要有一个能访问 父类的构造方法,否则父类数据就没有初始化。
5. 注意:super(…)或者this(….) 必须出现在构造方法内的第一条语句上,
就会有父类数据的多次初始化
(8) 子类成员方法复写父类的方法 注意事项
A 父类中私有成员方法不能被子类重写
(子类(外类)根本无法访问父类的私有方法)(子类父类都有相同的成员方法,子类会复写父类的成员方法,输出子类的方法体内容)
B子类的访问权限>=父类的访问权限
C父类静态方法,子类也必须通过静态方法进行重写。
(9)
方法重写和方法重载的区别?方法重载能改变返回值类型吗?
Override重写
在子类中出现一个方法,和父类的一个方法一模一样(返回值类型,方法名,参数列表都一样), 就是方法体内容不同,
子类对象调用此方法时,以使用子类的方法体为主(把父类的方法体内容给覆盖掉,编译看左边,运行看右边(多态表现))
/*子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。
子类方法的访问权限只能比父类的更大,不能更小。
如果父类的方法是private类型,那么,子类则不能覆盖重写,相当于子类中增加了一个全新的方法。
*/
Overload重载(load 加载)
同一个类中,出现多个方法,方法名相同, 参数列表不同 (参数类型,参数个数不同) ,与返回值类型无关
并且,方法重载能改变返回值类型,因为与返回值类型无关
C.多态(polymorphism
(1)定义:多态:同一个对象(事物),在不同时刻体现出来的不同状态。
(2)多态的前提:
A:要有继承或实现关系。//(子父类关系)
B:要有方法重写。 子类有特有的方法,所以要重写父类的方法。 //(子类方法(方法体内容)复写父类的方法(方法体内容))
C:要有 父类 或 父接口 引用指向子类对象。 //父 f = new 子();
(2.0)多态的好处:
A:提高了代码的维护性(继承保证,方便代码的修改,只用修改父类的代码)
B:提高了代码的扩展性(由多态保证) //useAnimal(Animal a)
(2.1) 多态的几种分类:
A:具体类多态
class fu{} class zi extends fu{}
Fu f = new zi();
B:抽象类多态(常用)
abstract class fu{} class zi extends fu{}
Fu f = new zi();
C:接口多态(最常用)(接口的具体子类,实现接口,添加自己的方法体内容)
interface fu{} class zi implements fu{}
Fu f = new zi();
(3)多态中的成员访问特点:
A:成员变量(重点)
多态时成员变量编译看左边(代表父类 ),运行结果看左边(父类)。 (运行父类的成员变量值)(父类的成员变量不能被子类覆盖)
(子类与父类的成员变量名相同,变量没有覆盖重写,所以要输出父类的变量值)
B:构造方法(访问子类的构造方法,先访问父类的构造方法)
创建子类对象的时候,访问子类的构造方法,先访问父类的构造方法,对父类的数据进行初始化。
C:成员方法(重点)
多态时成员方法编译看左边(父类) ( 必须是父类有的成员方法才能被编译通过)(代表父类 Fu f),
但运行结果看右边(子类) (输出子类的方法体内容)(因为有子类的方法覆盖重写了父类的方法)。
D:静态方法
编译看左边(代表父类 Fu f),运行看左边。
/*(静态方法和类相关,算不上重写,所以,访问还是左边的父类的静态方法)
class fu{public static void show(){sop("show fu")}}
class fu extends fu {public static void show(){sop("show zi")}}
class test{
fu f = new zi();
f.show(); } //输出父类的静态方法体内容 show fu*/
(4)多态的好处:
A:提高了代码的维护性(继承保证,方便代码的修改,只用修改父类的代码)
B:提高了代码的扩展性(由多态保证) //useAnimal(Animal a)
//建立一个父类的工具类
class AnimalTool{
//把类AnimalTool的构造方法,进行私有化,不能让外界建立对象,来调用这个类,
private AnimalTool(){}
public static void useAnimal(Animal a){//多态,Animal a指向所有的具体实例子类对象
//此就是多态的扩展性表现,对任意想要的具体 动物对象,都可实现造出来
a.eat();a.jiao();} }
(5)多态的弊端 :父类不能访问子类特有功能方法
(6)如何才能解决访问子类的特有功能呢? 多态中的转型
A.向上转型;
子---> 父 父类引用指向子类对象
Fu f = new Zi();
f.成员变量 //输出父类的成员变量值 //成员变量不能重写
f.成员方法 //输出子类的方法体内容//重写覆盖了父类的方法体
f.playGame();//输出子类的特有功能方法体内容
B.向下转型;
父---->子 父类引用f转为子类引用Zi z
Zi z = (Zi)f;
z.成员变量 //输出子类的成员变量值
z.成员方法 //输出子类的方法体内容
z.playGame();//输出子类的特有功能方法体内容