第四章(1)、面向对象概述和封装

一、面向对象

        首先看看面向对象和面向过程的区别,面向过程就是对程序的每一个步骤或者每一个流程的具体实现,而面向对象是对对象的使用,具体的步骤或流程由对象去处理,而我们操作的还是这个对象。举个例子:就拿洗衣服来说吧,在没有洗衣机之前,手洗衣服的过程就有:把衣服放到桶里-->倒洗衣粉-->搓衣服-->反复清洗-->拧干-->晾衣服,这就是面向过程,而使用洗衣机就方便许多:把衣服放到洗衣机-->倒洗衣粉-->按下清洗键-->晾衣服,其他步骤就由洗衣机帮咱们做了,这就是面向对象,对象就是洗衣机,搓衣服-->反复清洗-->拧干这些步骤洗衣机就帮咱们做了。

        面向过程注重的是过程,具体需要去怎么做;面向对象侧重的是对象,让对象去做。java的程序设计其实就是创建对象和操作对象,维护对象之间的关系,面向对象有三大特征:封装、继承、多态,后面章节在一一讲述。

        在java中,万事万物都是对象,对象依赖于类而存在的,对象是类的具体实例,类是一个抽象的概念。

二、类

        类是有属性(成员变量)和行为(成员方法)组成,格式:[权限修饰符] class 类名 {  }。使用类里面的功能需要创建对象,格式:类名 对象名 = new 类名(),使用对象去调用类中的成员变量和成员方法,格式:对象名.成员变量名;对象名.成员方法名()

代码如下:

        在以上代码中,成员变量在定义时也是可以先赋值的,例如:数据类型 变量名 = 值,如果不赋值,那就是系统赋给的默认值,基本类型的默认值前面讲过了,这里就不赘述了,而引用数据类型的默认值都是null。在java程序中除了成员变量还有局部变量,局部变量定义在方法上(形式参数,讲方法时讲过)或者方法内部,在使用该变量前必须赋值,不然程序会报错。

代码如下:

注意事项:定义成员变量和局部变量时,变量名可以一样,但是在方法中使用变量时,使用的是就近原则;成员变量可以在程序中全局使用,局部变量只能在其方法内部使用。

        创建对象时,可以采用匿名对象的方式创建,一般是在该对象仅仅使用一次的时候再去使用匿名对象,如果要多次使用时,这种方式不适合,匿名对象还可以当做实际参数。

代码如下:

三、private关键字

       private是一个权限修饰符,表示是私有的,被private修饰的成员只能在该类中使用,在此之前我们已经接触了public关键字,表示公共的,刚好跟private有点相反,被public修饰的成员谁都可以访问。前一节中,调用成员变量的格式是:对象名.变量名,如果成员变量被private修饰了的话,就不能这么去访问了,想要去访问的话,就需要对外提供访问方式了,对于程序的数据无非就是去设置它和获取它,这时就可以提供setXxx()和getXxx()给别人使用,这也算是java中的一种规范,setXxx()就是给数据设置值的方法,在这个方法中可以过滤掉一些不合理的数据,比如给学生录入成绩,如果使用 “对象名.变量名”的方式去录入,万一录入了负数我们也无能为力,如果使用“setXxx()”方式去录入,就可以在这个方法中做判断,如果是负数,就不让录入并给出提示,getXxx()就是获取数据,也可以在这个方法中对数据后,把结果给调用者返回去。

代码如下:不加入private

从以上的结果来看,分数为负数,显然是不合理的,就不应该把成员变量score直接给别人使用,而是将其封装(隐藏)起来并提供调用方式,这时就使用private关键字。

代码如下:加入private关键字

以上代码可以看到,对不合理的数据进行了过滤,这就是封装的好处,提高的了安全性,保证的数据的合理性。其实成员变量都是要封装起来的,需要的话再去对外提供访问方式。

四、构造方法

        从讲述面向对象开始到前面讲述的封装性,我们都是通过去创建对象来调用类中的成员变量和成员方法(以下统称成员),对象的创建是由java提供的构造方法去调用的,但是我们之前并没有看到它,因为它是java默认提供的,就是给我们创建对象用的,格式:权限修饰符 方法名(){},这是默认的格式,跟成员方法不同,构造方法没有返回值,连void都没有,方法名要和类名一样,由java提供的默认构造方法,也称为无参构造方法,就是没有形式参数的构造方法,构造方法也是可以有参数的(带参构造方法),这就需要我们自己去写,先来看看无参构造方法的。

代码如下:

        从结果中可以看出,在创建对象时,构造方法就被调用了,这样我们就可以用构造方法来初始化数据了,意思就是在创建对象后哪些数据立马就要使用,就可以在构造方法中先对这些数据进行操作,创建好对象后,直接就可以通过对象去调用了。下面再来看看带参构造方法。

代码如下:

        从以上代码可以看出,带参构造方法可以和setXxx()方法一样给成员变量赋值,但是有一点就是,如果提供了带参构造方法,无参构造方法就不能使用了,如果既想使用无参构造方法,也想使用带参构造方法,就需要我们全部都要写出来,因为我们提供了构造方法,java就不再给我们提供默认的无参构造方法了。因为都是构造方法,所以方法名都是一样的,这就涉及到了方法的重载,方法重载:方法名相同,参数列表不同(形式参数的个数不同或者参数的数据类型不同),跟返回值无关(如果前面两个条件满足,不论方法是否有返回值,它们都是一样的方法,就不是方法重载,在同个类中不能出现一样的方法),例如:

1)public void method(String name,int age) 和 public intmethod(String name,int age) 是一样的方法

2)public void method(String name) 和 public int method(String name,int age) 是方法的重载

3)public void method(String name,String sex) 和 public void method(String name,int age) 是方法的重载

    

        同时提供无参构造方法和带参构造方法,代码如下:

        s对象和s1对象是两个不同的对象,它们之间的数据是没有共享的。建议:无论任何时候,都自己提供无参构造方法。

        本节就先讲述到这里,下一节讲述this关键字和static关键字。

五、this关键字

        this字面的意思是这个,它代表当前的类的对象,像前面在讲述封装的时候,通过对象名去调用setXxx()和getXxx()方法,this就代表的调用setXxx()和getXxx()方法的那个对象,在java中对变量使用的规则是就近原则,曾经说过变量、方法、类的名称一般起的要见名思意,比如一个Student类,成员变量就有name(姓名)、age(年龄)等,当使用构造方法或者setXxx()方法去给这些变量赋值的时候,就得给形式参数(简称形参)另取别的名,这样就做不到见名思意,所以形参的名字和成员变量名字相同时,就可以使用this关键字去区分开来,下面看看代码中使用this关键字。

代码如下:不使用this关键字时

使用this关键字

总结:谁调用了那个方法,this就代表谁。例如:s.getName(),this就代表了s。

        在类中,构造方法也可以去调用构造方法,在使用this去调用构造方法时,这段代码要放在第一行。代码如下:

六、static关键字

        static字面的意思是静态的,第一次接触static关键字时,是在main()方法上(public  void  static main(String args)),static不仅可以修饰方法,还可以修饰成员变量,但是不能修饰局部变量,在static中不能使用this关键字,静态方法(static修饰的方法)只能去调用静态方法和静态成员变量,但非静态方法可以去调用静态方法和静态成员变量。

特点:

1)随着类的加载而加载(比如创建对象时new);

2)优先于对象存在;(this是创建对象后才有的,所以static中不能使用this,普通的成员方法和成员变量也是创建对象后才加载到内存的);

3)成员被当前类的所有对象共享;(前面说过,不同对象间的数据不能共享,是针对成员没有被static修饰,如果此成员需要被共享,就可以设为静态的);

4)成员可以直接通过类名去调用(类名.静态成员名),也可以通过对象去调用(对象名.静态成员名);

代码如下;

七、代码块

        在java中,使用 {} 括起来的代码就是代码块,根据代码声明的位置不同来区分:1)局部代码块(在方法里,用来限定变量的生命周期);2)构造代码块:在类中的位置跟成员变量和成员方法一样,称为成员位置,用 {} 括起来的代码。在构造方法执行前(创建对象),先执行构造代码块;3)静态代码块:也是在类中的成员位置用 static{} 括起来的代码。

代码如下:

        从以上的结果中可以看出,第一次创建对象时,首先执行了静态代码块,然后执行构造代码块,最后执行构造方法,第二次和第三次创建对象时,静态代码块不在执行,而是执行了构造代码块和构造方法,且都是先执行构造代码块后执行构造方法。总结:代码块的执行顺序:静态代码块 ---》构造代码块---》构造方法,静态代码块就执行了一次,静态代码块可以用来对类进行初始化。

公众号二维码

猜你喜欢

转载自blog.csdn.net/itmzz/article/details/86533689