黑马程序员:类,对象,面向对象以及三大特征

来源:互联网 发布:淘宝网店页头图片 编辑:程序博客网 时间:2024/05/18 03:50

-------android培训java培训、期待与您交流!-------

一、  类和对象

面向对象程序设计中两个重要的概念:类和对象

1、简单来说:对象的抽象化是类,类的具体化就是对象。类是一种抽象的概念,是对现实生活中事物的描述,类是对某一批对象的抽象,它不是实际存在的事物。对象是一个实际存在的实体,从这个意义上讲,万物都是对象。我们日常所说的人,都是人的实例,而不是人类。

2、现实中是先有对象,然后对这些对象进行描述,对对象的属性和方法进行抽取形成类。在Java语言中,用来事物的方式是:先定义类,然后通过类创建实例化的对象。类就好比生产汽车要用的“图纸”,图纸中包含汽车实体所需要的数据和方法,然后用图纸生产汽车。类和对象两个概念映射发到Java中,类就是用class定义的类,具体对象就是Java在内存中用new关键字创建的实体。

类实例化对象的代码演示:
class Car//生产汽车所用的图纸:就好比Java中类的概念{String color;int wheelnum;public void method(){System.out.println("自动挡");}}class Demo{public static void main(String[] args){Car c = new Car();//用图纸生产出的汽车:就好比Java中对象的概念}}

二、  面向对象

因为面向对象是在面向过程的基础上发展而来的,所以围绕着面向过程和面上对象展开对面向对象编程的简单分析。

用如下三个例子分析面向对象:

1)、 “猪八戒吃西瓜”

在面向过程的世界里,一切以函数为中心,函数最大,因此这件事情会用此语句表达:吃(猪八戒.西瓜);

在面向过程的世界里,一切以对象为中心,对象最大,因此这件事情会用此语句表达:猪八戒.吃(西瓜);

     对比两条语句不难发现,面向对象的语句更加接近自然语言的语法,主语,谓语,宾语一目了然,十分直观,因此程序员更易理解。

2)、 “将大象放进冰箱里”

        面向过程思想:强调的是一个过程:打开冰箱,存储大象,关闭冰箱

        面向对象思想:强调的是这个冰箱对象:冰箱打开,冰箱存储大象,冰箱关闭我们把(打开,存储,关闭)的功能存储在冰箱这个对象中。

3)、 “给电脑除尘”

        面向过程的思想:你自己买一套拆电脑的工具,然后自己摸索着把电脑拆开,卸下风扇,清理掉风扇上的灰尘,最后装上电脑后盖。

          面向对象思想:你把电脑拿到电脑维修店,付钱给老板后说半个小时后来取,然后你就回家吃饭了。吃完饭,过来取回除过尘的电脑你就可以继续使用电脑。在这个过程中,你面向的就是“电脑维修员”这个对象。你不需要自己进行除尘这个复杂的过程,相当于调用了“电脑维修员”这个对象。                                    

“给电脑除尘”面向过程代码演示:

class Myself{public static void main(String[] args){System.out.println("打开电脑后盖");//我自己打开电脑后盖System.out.println("取出风扇除尘");//我自己取出风扇除尘System.out.println("关闭电脑后盖");//我自己装上电脑后盖}}
“给电脑除尘” 面向对象代码演示:
class Worker{private String tool = "工具";//私有数据,只能由本类成员直接访问。private static void method(){System.out.println(tool+"打开电脑后盖");System.out.println(tool+"取出风扇除尘");System.out.println(tool+"关闭电脑后盖");}//公共方法暴露该对象的功能,在其他类中调用public void run(){method();}}class Myself{public static void main(String[] args){Worker w = new Worker();w.run();//调用对外暴露的公共方法。}}

三、  面向对象的三大特征

1、封装

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

封装的意义:将变化隔离;便于使用;提高复用性;更加安全。

封装的原则:将不需要对外暴露的内容都隐藏起来,提供公共方法让其他类对其访问。

给电脑除尘的例子中,“电脑维修员”是一个对象,他具有打开电脑后盖,取出风扇除尘,给电脑装上后盖等技术。至于这些技术是怎么运用的,我们不知道。我们问他,他也不告诉我们。他的这些技术就好比类中的私有数据。但是他在店门口贴了一张广告:电脑除尘。这个广告就好比他暴露出来的公共方法。于是我们只要找到这个对象,然后自己调用这个公共方法即可完成对电脑的除尘。封装的这一特性:首先,除尘这件事对我自己来说变得简单了,另外我从之前的执行者(自己动手给电脑除尘)变成了指挥者(让别人给电脑除尘)。

2、继承:

父类和子类的关系,好比普通和特殊的关系。当子类继承父类后,子类可以获取父类中的属性和方法。继承是面向对象实现软件复用的重要手段。

继承的代码演示:

class Person{private int age;private String name;Person(int age, String name){this.age = age;this.name = name;}public void getAge(){System.out.println(age);}public void getName(){System.out.println(name);}}class Man extends Person{Man(int age, String name){super(age,name);}}class Demo{public static void main(String[] args){Man m = new Man(22,"ZhangSan");m.getAge();m.getName();}}

注意:子类Man继承父类Person中的所有属性和方法,包括private。但是其中私有属性需要子类调用从父类继承来的公共方法才能对其访问。

继承中的注意事项:

1)、 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数; 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

2)、 继承中往往会伴随着方法的覆盖,此时必须保证:子类方法的访问权限>=父类方法的访问权限。

重写(Override)的特点:

1)、也叫复写或者覆盖,发生在子父类或者实现类和接口中。

2)、方法的返回值类型相同,方法名相同,参数列表相同。

3)、当需要被重写的方法是static方法时,重写的方法也必须是static,否则编译失败。

4)、重写方法的访问权限>=被重写方法的访问权限,否则编译失败。

重载(Overload)的特点:发生在同一个类或接口中,若干个方法,它们的方法名相同,参数列表不同,对返回值类型没有要求,这种现象叫做重载。

3、多态

多态概念:Java引用变量又两种类型:一种是编译时类型,一种是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

如果编译时类型和运行时类型不一致,就可能出现所谓的多态了。(两个重要概念,编译时类型、运行时类型)。

多态的代码演示:

class Animals{int x = 2;public void eat(){System.out.println("吃");}public static void sleep(){System.out.println("睡");}}class Cat extends Animals{int x = 4;public void eat(){System.out.println("吃鱼");}public static void sleep(){System.out.println("打呼噜睡");}public void work(){System.out.println("抓老鼠");}}class Demo{public static void main(String[] args){Animals a = new Animals();a.eat();//打印吃Animal ac = new Cat();ac.eat();//ac调用子父类共有的方法:打印吃鱼System.out.println(ac.x);//ac访问成员变量:打印2ac.sleep();//ac调用静态成员:打印睡//ac.work();//编译失败,因为Animal类型没有work方法}}

由代码可见,a和ac都是Animal类型的变量,调用同一个方法时呈现除了不同的特性,这就是多态。

注意:

1)、引用变量在访问它所包含的成员变量时,系统总是试图访问它编译时的类型所定义的成员变量,而不是他运行时类型所定义的成员变量,所以成员变量不具备多态性。

2)、静态成员方法附属于类,多态的发生涉及到对象,所以静态成员不具备多态性。

3)、当出现多态时,引用变量只能调用引用变量所属类中的方法。如果该方法也在引用变量指向的对象中有定义,则运行对象中的方法;否则运行引用变量所属类中的方法。比如:上边代码中ac只能调用eat,sleep方法,不能调用work方法。并且ac调用eat方法时,执行的是吃鱼的动作。

总结:

         成员变量和静态成员没有多态性,所以编译和运行都看左边(引用型变量所属的类)。

         非静态成员方法具有多态性,所以编译看左边运行看右边(引用变量指向的对象)。

为避免误导初学者,本博客如有错误或者不严谨的地方,请在下方给予评论,以便及时修改!谢谢... ...

----------------------android培训java培训、期待与您交流!----------------------

详细请查看:www.itheima.com

0 0
原创粉丝点击