黑马程序员——面向对象<一> 笔记第三篇

来源:互联网 发布:梅西大学怎么样 知乎 编辑:程序博客网 时间:2024/05/01 11:27

面向对象、封装、构造方法

-----Java培训、Android培训、期待与您交流! -------

1 面向对象

对象:真实存在唯一的事物。

类:同一种类型的事物公共属性与公共行为的抽取。是一个抽象的概念.

面向对象的核心思想:找适合对象做适合的事情。

 

对象:在现实生活中存在具体的一个事物。;

类:实际就是对某种类型事物的共性属性与行为的抽取。

人类认识世界:对象----à类。

在java中:     类 -----à对象。

 

1.1 面向对象的概述

“面向对象”(英语:Object Oriented,简称OO)是一种以事物为中心的编程思想。

面向对象程序设计(英语:Object-orientedprogramming,缩写:OOP),是一种程序开发的方法。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性

面向对象时相对于面向过程而已的(c则是一个典型的面向过程的语言),站在面向对象的角度去看问题,你则是对象的动作的指挥者。如果站在面向过程的角度去看问题,你则是动作的执行者

 

面向过程

强调的是功能行为,面向过程是一种以过程为中心的编程思想。“面向过程”他们不支持丰富的“面向对象”特性(比如继承、多态),就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向过程在这一系列工作的执行中,强调的是工作的执行。

 

1.2局部变量和成员变量

成员变量:  定义在类中变量

局部变量:  定义在方法中变量

 

成员变量与局部变量的区别:

1.        应用范围 

1.        成员变量在整个类内都有效   

2.        局部变量只在其声明的方法内有效

2.        生命周期 

1.        成员变量: 它属于对象,它随着对象的创建而创建,随着对象的消失而消失

2.        局部变量: 使用完马上释放空间。

                                     voidshow(int id){    

                                               for(inti=0;i<10;i++){

                                                       for(intj=0;j<10;j++){

                                                                 System.out.println(id);

                                                        }

                                              }

                                     }

                                     这时候  id,i,j者是在方法内声明的,全是局部变量

                                     j当里层for循环执行它的生命周期开始,当里层for结束,j消失

                                     i当外层for循环执行它的生命周期开始,当外层for结束,j消失

                                     id在方法被调用时开始,方法结束时,id消失.

3.        存储位置  成员变量属于对象,它存储在堆内,堆内的实体,当没有引用指向其时,才垃圾回收清理局部变量存在栈内存中,当不在使用时,马上就会被释放。

4.        初始值

成员变量它存储在堆中,如果没有赋初值,它有默认值。

1.   整数byte、short、int、long =0;

2.   char='\uoooo';

3.   boolean =flase;

4.   String =null;

5.   类类型 =null;

6.        数组 =null;

                                局部变量,如果要想使用必须手动初始化.( 否则报错。)

                              i.     方法中,参数列表中,语句中。

                            ii.     必须给初始化值,没有初始值,不能使用

                           iii.     在栈内存中

        

1.3匿名对象

匿名对象:没有名字的对象就称作为匿名对象。(没有引用类型变量指向的对象称作为匿名对象)

 

匿名对象要注意的细节

         1.一般不要给匿名对象赋予属性值,因为永远都无法访问到匿名对象的属性。

         2.两个匿名对象永远都不可能是同一个对象。

 

匿名对象好处:简化书写。

 

匿名对象的应用场景:        

         1.如果需要调用一个对象的方法一次的时候,然后这个对象就不再不使用了,那么这时候可以使用匿名对象。

         2.可以作为参数传递给一个方法调用。

class Demo4 {

 

    public static void main(String[] args)

    {  

       /*   对象.属性

       //创建一个学生对象.

       Student s = new Student();  //普通的方式创建对象。

       s.num = 110;

       s.name = "狗娃";

       System.out.println("编号:"+ s.num +"名字:"+ s.name);

      

       //new Student().name = "狗剩"; //匿名对象    

       //System.out.println("名字:"+ new Student().name);  //null

       System.out.println("同一个对象吗?"+ (new Student() == new Student()));  // "=="用于比较两个基本类型的数据时,比较的是两个数据是否相等。用于比较对象数据的时候比较的是两个对象的内存地址是否一致,也就是判断两个对象是否为同一个对象。

       */

      

       //需求:调用study方法。

      

    /*  Student s = new Student();

       s.study();*/

      

       //匿名对象

       new Student().study();

    }

}

 

2封装

权限修饰符 : 权限修饰符的作用就是控制修饰的内容的可见范围的。

         public是公共的,public修饰的成员属性任何人都可以直接访问。

         private是私用的,private修饰的成员属性只能在本类中访问。

 

封装的步骤

1. 把需要封装的属性使用private修饰。

         2. 提供公共的方法设置以及获取私有的成员属性。

                   命名规范:

                            set属性名() , get属性名()

 

疑问1:封装一个属性的时候一定要提供get以及set方法吗?

         不一定 , 看需求而定。

封装的习惯:一般实体类的所有成员属性都会封装起来的。

 

封装的好处:

         1.提高了数据的安全性。

         2.操作简单。

         3.隐藏实现。

 

//设置类的属性为private(关键字),不能使用对象名.属性名的方式直接访问对象的属性。

public class Demo {

    public static void main(String[] args) {

       // 创建对象

       Employee jack = new Employee();

 

       //编译报错

       jack.name ="jack";

       jack.id ="123456";

       jack.gender ="";

 

       // 编译报错

       jack.gender ="不是男人";

       jack.work();

    }

}

 

class Employee {

   //使用了private修饰了成员变量

    private Stringname;

    private Stringid;

    private Stringgender;

 

    public void work() {

       System.out.println(id +":" +name +":" +gender +" 努力工作中!!!");

    }

}

 

 

3构造方法

3.1构造方法的作用

构造方法的作用:给对应的对象进行初始化。

构造方法的定义格式:        

修饰符  函数名(形参列表...){

                   初始化对象的语句

         }

 

构造函数要注意的细节:

1. 构造函数是没有返回值类型的。

2. 构造函数的函数名必须 与类名一致。

3. 构造函数是由jvm调用的, 每创建了一个对应的对象,那么java虚拟机就会调用对应的构造方法一次。

4. 如果一个类没有显式的写上构造方法的时候,那么java编译器会为该类添加一个无参的构造方法。

5. 如果一个类已经显式的写上了一个构造方法的时候,那么java编译器不会再为该类添加无参的构造方法了。

6. 在一个类中构造函数是可以以函数重载的形式存在多个。

 

疑问1 :每创建一个对象,java虚拟机就会调用对应的构造方法一次。

                   我们之前还没有学构造方法,那么java虚拟机还会调用构造方法吗?

                  

         java虚拟机还是会调用构造方法的,调用的是无参的构造方法的,这个无参的构造方法是由

         java编译器添加的。

 

反编译:JDK给我们提供了一个javap的工具让我们反编译的。

 

Javap(反编译)用法:       

         javap-l -p -c   class文件

 

java编译器添加的无参构造方法的修饰符是什么?

无参构造方法的权限修饰符是与类的修饰符一致的。

 

构造方法作用:对对象进行初始化.

 

3.2构造代码块:

作用:给所有的对象进行统一的初始化。

构造代码块的书写格式:

         {

                   初始化工作

         }

注意: 构造代码块的代码是在创建所属的类的对象时候调用,每创建一次对象,都会调用一次构造代码块的代码。

 

构造代码块要注意的细节:

1. 构造函数的赋值动作是最后执行的,是位于成员变量的显式初始化、与构造代码块之后执行。

2. 一编译的时候,声明变量的语句会被java编译器放到最前面。

3. 成员变量的显式初始化动作与构造代码块的代码实际上是在构造函数中执行的,构造代码块的代码是会优先于构造函数执行的。

4. 成员变量的显式初始化与构造代码块的代码执行的先后顺序是按照当前的代码顺序执行的

 

3.3构造函数与普通函数的区别

1.一般函数是用于定义对象应该具备的功能。而构造函数定义的是,对象的初始化内容。

2.构造函数是在对象建立时由jvm调用,给对象初始化。一般函数是在对象建立后,当对象调用该功能是才执行。

3.普通函数可以使用对象多次调用,构造函数就在创建对象时调用。

4.构造函数的函数名要与类名一样,而普通函数只要符合标识符的命名规则即可。

5.构造函数没有返回值

 


0 0
原创粉丝点击