1.什么实面向对象
面向对象是基于面向过程,对象是将功能进行了封装。只要找到了具体的类,创建出对象,就可以调用其中的具体功能。面向对象也是用来解决问题的一种思维模式。
2.面向对象4大特征
1.抽象
1.抽象包括2个方面
数据抽象——就是用代码的形式表示现时世界中一类事物的特性,就是针对对象的属性。
过程抽象——就是用代码形式表示现实世界中事物的一系列行为,就是针对对象的行为特征。
引自:http://blog.sciencenet.cn/home.php?mod=space&uid=469621&do=blog&id=379622
2.抽象类的作用
当在定义一个父类的时候,父类只知道子类的具体功能是什么,可以无法描述清楚子类的功能体时,
这时父类中的这个功能就可以使用抽象方法来描述,当一个类中有了抽象方法,那么这个类就变成了抽象类。
3.抽象类的特点
1.抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
2.抽象关键字和那些关键字不能共存
static:因为静态修饰的内容是可以通过类名直接调用,而一个抽象方法被静态了,使用类名调用这个抽象的方法没有意义。
final:final修饰的方法子类是无法复写的,而abstract修饰的方法要求子类必须复写。
private:私有的内容子类无法得到。
3,抽象类中可以没有抽象方法,用于不能创建这个类。它主要用于设计模式中的适配器模式
为了更好的阐述抽象类,下面将使用一个例子来说明。
/*
* 抽象类:不具体
* 猫和狗
* 猫:
* 行为:吃、抓老鼠
* 狗:
* 行为:吃、看家
*/
//动物类(抽象类)
abstract class Animal {
abstract void eat();
}
//描述猫(没有继承抽象类eat的方法不能调用)
class Cat {
//吃
void eat() {
System.out.println("吃鱼");
}
//抓老鼠
void catchMouse() {
System.out.println("抓老鼠");
}
}
//描述狗
class Dog extends Animal {
void eat() {
System.out.println("啃骨头");
}
void lookHome() {
System.out.println("看家");
}
}
public class main {
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
}
}
2.继承
1.描述
一个类和另外一个类要产生关系,需要使用extends,把共性的内容抽取出来之后形成的一个类,
称为父类(基类、超类),而别的类继承这个父类称为子类,就形成子父类,这就是继承。
为了更好的阐述继承,下面将使用一个例子来说明。
<span style="font-size:14px;">/* * 描述手机 * 功能:打电话、发短信 */ //描述手机 class Phone { void call() { System.out.println("打电话"); } void sendMessage() { System.out.println("发短信"); } } /* * 手机升级 * 打电话显示号码、大头贴等 * 还可以发彩信 * 重新定义类,描述新功能,在继承以前的类中功能 */ class NewPhone extends Phone { void call() { //调父类功能 super.call(); //本类功能(子类) System.out.println("显示号码"); } void sendMessage() { //调父类功能 super.sendMessage(); System.out.println("发彩信"); } } public class nine { public static void main(String[] args) { NewPhone p = new NewPhone(); p.call(); p.sendMessage(); } }</span>
2.继承的好处
1.提高的代码的复用性。
2.让类与类之间产生了关系。为多态提供前提。
3.单继承、多继承、多重继承分析
1.Java只支持单继承,不支持多继承
2.Java支持多重继承。
class A{ } class B extends A{ } class C extends B{ }
4.继承中构造方法
1、构造方法中的super()调用父类构造方法,必须在子类构造方法中的第一句。
2、如果在子类的构造方法中使用this()调用本类的其他构造方法,这时这个构造方法中的super()
就没有了。但是在这个子类中,最后肯定有一个构造方法中有super()去调用父类的构造方法。
3、当父类中没有空参数的构造方法时,在子类的构造方法中必须手动显示指定调用父类的哪个构造方法。
4、构造方法不存在复写。
3.封装
1.描述
封装是把过程和数据包围起来,对数据的访问只能通过已定义的方法和接口,进行调用。
2.封装表现
1.函数就是一个最基本封装体。
2.类其实也是一个封装体。
3.封装的好处
1.提高了代码的复用性。
2.隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
4.多态
1.描述
父类的引用或者接口的引用指向了自己的子类对象。
2.多态的前提
1、必须有关系:继承,实现。
2、通常都有重写操作。
为了更好的阐述多态,下面将使用一个例子来说明。
从以下代码可以发现无论是dog,还是cat,eat是他们的共性,那么将eat进行抽取,抽取到父类中。
/*多态
* 类是描述事物的,基于类就可以创建出对象
* 多态是指的是一个对象的多种表现形态,但最终还是一个对象
*
* 多态:指的是父类的引用变量指向了自己的子类对象,把这种形式称为多态
*/
//描述动物
abstract class Animal {
abstract void eat();
}
当有了Animal抽象类之后,狗和猫只要继承这个类,实现他们特有的eat方法即可
//描述狗
class Dog extends Animal {
void eat() {
System.out.println("啃骨头");
}
}
//描述猫
class Cat extends Animal {
void eat() {
System.out.println("吃鱼");
}
}
通过上述代码发现,Animal类型既可以接受Dog类型,也可以接受Cat类型,当再让动物去做事时,不用面对具体的动物,
而只要面对Animal即可。因此上述method方法可以修改为
public class eight {
public static void main(String[] args) {
Dog d = new Dog();
method(d);
}
//接收传过来的值
public static void method(Animal a) {
a.eat();
}
}
method(Animal a)可以接受Animal的子类型的所有小动物,而method方法不用在关心是具体的哪一个类型。
即就是只建立Animal的引用就可以接收所有的Dog和Cat对象进来,让它们去eat。从而提高了程序的扩展性。
其实上述代码就已经形成了多态。