黑马程序员---面向对象一

来源:互联网 发布:永久域名发布 编辑:程序博客网 时间:2024/04/28 09:43

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

 

黑马程序员---面向对象一

 

 

一、面向对象概述

       1. 定义

       面向对象是一种编程思想,一种编程范型,编程范式有:面向过程、面向结构、面向对象等等不同的编程范型。而面向对象是现在主流的程序设计范型,java是完全的面向对象的,必须熟悉面向对象的思想,才能进行java程序的开发。

       面向对象就是还原事物的特征,例如:一个人具有姓名、年龄的本身属性,还具有会说话、会游泳的技能方法,创建对象将这些属性和方法赋予给对象,我们需要调用的时候,再使用对象来调用就可以了。

       又如:台灯能够提供照明,照明是台灯的技能方法,我们需要光的时候,就调用台灯,让台灯来发光就可以了,不需要我们自己发光照明。也就是说将发光照明的功能赋予到台灯这个对象上,我们仅仅是调用了这个对象,使用了对象的发光功能。

       2.  特点

       面向对象的特点有:封装性、继承性、多态性

        Java编程过程中,这三个特性是必须熟悉的,也会频繁的使用到。

二、类与对象

         1.   类与对象的概述

           类:是对一类事物的描述,对一类事物共性的抽取,是具有相同属性的事物的统称,是一种抽象。类是一种静态的概念。

         对象:是对类的具体化。又称实例。对象是一种动态的机制。

         例如:人就是一个类,你、我、他是这个类的具体实例,也就是对象。Java是面向对象的语言,每个对象都应该拥有它自己的属性和方法,就拿人来说,肤色、身高等是人的属性,吃、喝、玩、说等都是方法,也就是说属性描绘了类的特点,而方法描述了类的功能,体现在Java的类中就像下面的代码这样:

<SPAN style="FONT-SIZE: 18px">Person{      private String name;       privateint age;Person(String name,int age){       this.name=name;     this.age=age;}       publicvoid say()       {              System.out.println(“我的姓名:”+name+”我的年龄”+age);}}


 

上面的代码是创建了一个类,name,age就是Person类中的成员属性,say是Person类中的成员方法。当我们需要将类实例化的时候,就需要创建一个实例化的对象,通过对象来调用类中的方法

<SPAN style="FONT-SIZE: 18px">       Person  p1=new  Person(“wangwu”,18);       p.say();


 

           对象是可以重复的创建的,每次创建的对象都是不一样的。eg:

<SPAN style="FONT-SIZE: 18px">        Person  p2=new  Person(“liliu”,20);        p.say();


 

           根据Person类可以创建出来很多的对象,每个对象的name和age属性都可以进行单独的设定,通过对象调用say方法,打印出来的内容也是不一样的。

           2. 对象的创建

           对象的创建在之前也说了,就是 类名 对象名=new类名();这是创建了有对象名的对象。另外,还可以创建匿名对象,即没有对象名。例如:

    <SPAN style="FONT-SIZE: 18px">    Person  p2=new  Person(“liliu”,20);        p.say();


 

           匿名对象创建是一次性的,创建之后,可以在后面直接调用类中的方法,匿名对象的使用处:对对象的方法只调用一次时,使用匿名对象比较简化;可以将匿名对象作为实际参数进行传递,也是为了简化代码。

           一个小问题: 为什么使用匿名对象?为什么会简化代码?

           对象的创建,需要在堆内存中开辟空间存放对象的内容,在栈内存中开辟空间存放对象变量,这些都是需要在内存中开辟空间的,而且对象存在的时间会很长。使用匿名对象,就免去了在栈内存中开辟空间,可以节省内存空间,而且在使用之后,对象就会立马被销毁,不会在内存中存在很长时间。所以说匿名对象可以简化代码,减小内存的开销,提高程序的的性能。

          3. 类中的属性

         属性:类中的属性分为全局变量、局部变量。

         全局属性:实例变量是可以不进行初始化,比如一个整型的实例变量假如没有初始化,则默认值为0

         局部属性:局部变量是在方法内部声明的变量,生命期仅在方法内,方法结束后变量就消失了;局部变量必须初始化再使用,否则会报错,也就是说,假如你在方法内定义了一个局部变量,并且没有赋值,那么你在使用这个变量的时候一定得赋值,不然就报错了。同时,局部变量可屏蔽全局变量。

         4. 类中的方法

         方法中定义的是类的功能,方法就是类的行为。对于面向对象的开发来说,类中的方法是被封装起来的一个一个的功能。

public void say(){        System.out.println(“我的黑马梦想”);}


 

           方法是由方法头和方法体构成,方法头包括:访问控制符(如publicprivate等)、返回值类型、方法名、参数列表组成。声明为void的方法,返回值为空。类中的方法可以进行重载(Overload)和重写(Override亦叫覆写)。

          重载:是指在同一个类中,具有相同的方法名,不同的参数列表的方法之间的一种机制。参数列表的不同体现在:类型不同、个数不同、顺序不同,只要满足任一一个,就可以进行方法重载。通过长方形、圆的面积的计算的代码来说明:

public class Area {     /* 计算长方形的面积 */     public int area(intwidth, int height) {            return width *height;     }     /* 计算圆的面积 */     public double area(floatradius) {            return 3.14 *radius * radius;     }}


 

             例子中计算圆面积的方法的参数和长方形面积方法的参数的个数不相同,但是使用的是同一个方法名area,同步传入不同的参数,实现不同的功能,这就是方法重载。方法的重载增强了程序的可读性和易于维护。

           重写重写是在继承中存在的,在两个类(子类和父类之间存在的关系)中,子类重写父类的方法,方法名相同,参数也相同的一种。

public class B extends A {       publicString a(String name) {              return"welcome to you :" + name;       }}class A {       publicString a(String name){              return"hello";       }}


 

             重写需要注意的问题:(1)静态类只能重写静态的(2)子父类方法必须是一模一样(权限、返回类型)(3)只能高权限方法重写低权限方法。(编译的时候不会报错,但是运行的时候不会达到你设定的想法)

 

三、面向对象之封装

         1. 封装定义

         封装,顾名思义就是隐藏。对象的属性,方法,没必要要外界知道,外界只需要在使用的时候调用这些对象的属性、方法即可,仅对外部提供公共访问方法。在面向对象的思想中,一切物体皆对象,我们以对象为单位进行编程,将这个对象所有的属性方法包装在一起,就是封装。

         2.封装的好处

       (1)将对象内部的变化隐藏,外部只需要得到功能即可,内部的任何变化是不需要知道的。(2)便于使用。封装起来的对象只需要调用成员名就可以使用。(3)提高代码的重用性。只要得到对象,任何外部都可以调用对象中的公共成员。(4)提高安全性。将变化隐藏,外部不用修改内部的代码,只有调用即可,内部的异常在内部处理,或者抛出异常,使外部知道,提高了代码的安全。

         3. 封装的原则

         不需要对外提供的内容隐藏,把属性隐藏,只提供公共方法提取。

         4. 构造函数

         构造函数是与类名相同、无返回值的函数。

         构造函数是为了给对象进行初始化,对象一建立就会运行与之对象的构造函数,当类无构造函数的时候,系统就会默认的加入空参数的构造函数。

         构造函数只运行一次。

 

Person{      private String name;      private int age;Person() //空参的构造函数{}Person(String name,int age)  //带有参数的构造函数{ //在对象创建的时候,给对象进行初始化,将对象的name和age属性进行赋值this.name=name;           this.age=age;}}


          5.构造代码块

         构造代码块和构造函数的作用是一样的,只是构造代码块是没有函数名的,只有{}包围着的代码。

         一般在构造代码块中的代码是对象具有共性的初始化。构造代码块是给所有的对象进行统一初始化的。

         对象一建立,构造代码块就运行了,而且构造代码块优先构造函数运行。

Person{      private String name;      private int age{System.out.println(“构造代码块在所有的对象建立的时候都会被打印一次”);}Person(){       System.out.println(“构造函数”);}} Person p1=new Person();Person p2=new Person();


 

例子中的运行结果为:

构造代码块在所有的对象建立的时候都会被打印一次

构造函数

构造代码块在所有的对象建立的时候都会被打印一次

构造函数

 

           6.关键字:this

          this表示的本类的对象,代表它所在函数所属对象的引用。即:哪个对象在调用函数,this就代表哪个对象。

          this的原理:this其实只是在栈内存中的一个隐藏变量,当对象调用的时候,将对象引用地址赋值给this变量。

          this的应用:当定义类的功能中,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。

           this可用于构造函数之间互相调用,但是this语句只能放在该构造函数的第一行

Person{      private String name;      private int age;Person(String name){       this.name=name;}Person(String name,int age){       this(name);this.age=age;//this(name); 引用构造函数的时候必须放在第一行,放在这里是错误的。}}


 

             7.关键字:static

            Static是一个Java中关键字,用来修饰成员方法、成员属性的修饰词(只能修饰成员)。

           被static修饰的成员变量是静态成员变量,与普通的变量不同,静态成员变量不在堆内存中,而是存在与内存中的方法区,而且静态成员变量可以使用  类名.静态成员  的方式调用

            static的特征:(1)随着类的加载而加载(2)随着类的消失而消失(3)优先与对象而存在

           注意:静态方法只能调用类中的静态成员,静态的方法只能被静态的方法覆盖(即重写)

           静态代码块:与构造代码块有相同之处,静态代码块只需在构造代码块前添加static修饰,而且静态代码块比代码块先执行。

Person{      private String name;       privateint age;static{       this.name=name;}}


 

       注意:类的加载过程:

         1、先装载.class文件,创建Class对象,对静态数据(由static声明的)进行初始化,而且只进行一次初始化。

         2、newBuild()在堆上进行空间分配。

         3、执行非静态块。

         4、执行所有方法外定义的变量的初始化。

         5、执行构造器。

 

 

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

0 0
原创粉丝点击