一、类和“对象”:
类是一种抽象出来的,可以说是对某些事物的概括他们属性、行为的集合。可以很抽象,也可以具体一点,比如:动物类,就可以包含哺乳动物、软体动物、鸟类、鱼类···。我们从中又可以拿出比动物类具体一点的哺乳类,包含着犬科类、猫科类···。还能在具体,比如猫科类还可以再分为好多类。各种类都有其行为和属性。类在我们生活中无处不在,但却是一种抽象的存在。而我们能直接接触到的就是“对象”,
对象是类的实例,是一个“东西”,它真真实实的存在。比如你有哥哥、弟弟,家里总共三个男孩。当你们三个都在时,假如你的爸爸喊了一声“儿子”,你清楚他是在喊你,还是哥哥又或者弟弟呢?举一个不太恰当的例子,“儿子”就属于一个类,当他含你的名字或者哥哥的名字时,你就明白了他在呼唤谁,而这里的“你”或者“哥哥”就属于对象了。
二、面向对象的三大特点:
1、封装:
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接使之与外部发生联系。系统的其他对象只能通
过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户无需知道
对象内部的细节,可以通过该对象对外提供的接来访问该对象。
封装的好处:封装之后就形成了独立实体,独立实体可以在不同的环境中重复使用,显然封装可以降低程序的耦合度,提高程序的扩展性,以及重用性或复用性。对外只提供了简单的安全的操作入口,所以封装之后,实体更安全了。
2、继承:
来看看我们现实生活中的继承:
继承时子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性,或子类从父类继承方法,使得子类具有与父类相同的行为。兔子和羊于食草动物类,狮子和豹属于食肉动物类。食草动物和食肉动物又属于动物类。所以继承需要符合的关系是: is-a (Bird is-a Animal),父类更通用,子类更具体。虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性,也会具有自身的特性。
继承的好处:
在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中, 让其它类共享。因此可以定义一个通用类,然后将其扩展为其它多个特定类,这些特定类继承通用类中的特征和动作。继承是Java 中实现软件重用的重要手段,避免重复,易于维护。
值得注意的是:
1)Java中只有单继承,没有多继承,即一个类只能有一个“父类”。要实现多继承可以使用接口。
2)java中规定,子类继承父类,除构造方法和被private修饰的数据不能继承外,剩下都可以继承。
3)java中的类没有显示的继承任何类,则默认继承Object类,Object类是java语言提供的根类,也
就是说,一个对象与生俱来就有Object类型中所有的特征。
3、多态:
它的前提是封装形成独立体,独立体之间存在继承关系,从而产生多态机制。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是“同一个行为”发生在“不同的对象上”会产生不同的效果。我们来看看下面代码:
public class Animal {
public void move(){
System.out.println("Animal move!");
}
}
public class Cat extends Animal{
//方法覆盖
public void move(){
System.out.println("I can jump");
}
//子类特有
public void catchMouse(){
System.out.println("I can catch mouse");
}
}
[点击并拖拽以移动]
public class Bird extends Animal{
//方法覆盖
public void move(){
System.out.println("I can fly");
}
//子类特有
public void catchBug(){
System.out.println("I can catch bugs");
}
}
Cat类和Bird类同时继承自Animal类。我们对上面的类进行测试:
/*
在没有接触到继承和多态之前,我们一直使用这样的方式来创建对象。很容易理解,
运行结果为:
Animal move!
I can jump
I can fly
*/
public class Test01 {
public static void main(String[] args) {
//创建Animal对象
Animal a = new Animal();
a.move();
//创建Cat对象
Cat c = new Cat();
c.move();
//创建鸟儿对象
Bird b = new Bird();
b.move();
}
}
其实Cat对象和Bird对象还可以像这样来创建:
/*
这就是多态,多态就是“同一个行为(move)”作用在“不同的对象上”会有不同的表现结果,
java允许一个父类型的引用指向一个子类型的对象。
也就是说允许这种写法:
Animal a2 = new Bird(),因为Bird is a Animal是能够说通的。其中Animal a1 = new Cat()
或者Animal a2 = new Bird()都是父类型引用指向了子类型对象,都属于向上转型(Upcasting),
或者叫做自动类型转换。
*/
public class Test02 {
public static void main(String[] args) {
//左边为父类引用,右边是子类对象。
Animal a1 = new Cat();
a1.move();
Animal a2 = new Bird();
a2.move();
}
}
/*
再来看看一下程序。结果是编译失败:
java: 找不到符号
符号: 方法 catchMouse()
位置: 类型为Exercises.Animal的变量 animal
这是因为在编译的时候,看的是左边的 Animal 类型的引用,而Animal类中没有catchMouse()方法。
其实你想完成的这一步被称为“向下转型”。前面的向上转型是可以自动进行的,不难理解,因为前面
提到过一个子类,他的父类只有一个,向上自然是父类。而向下转型就不一样了,一个父亲可以有多个儿子,
如果你不指定是谁的话,是找不到的,所以我们可以使用()来进行强制类型转换,将Animal转换为Cat
再去让他 catchMouse()就没有问题了。
*/
public class Test03 {
public static void main(String[] args) {
Animal animal = new Cat();
animal.move();
animal.catchMouse();
}
}
以上代码编译是会报错。我们只要记住,编译看左边,运行看右边就可以避免这样的问题。
多态存在的三个必要条件分别是:
● 继承
● 方法覆盖
● 父类型引用指向子类型对象