> 文档中心 > 狂神JAVASE系列-面向对象编程01

狂神JAVASE系列-面向对象编程01


1. 面向过程 VS 面向对象?   

面向过程编程:

        讲究一手按部就班,解决问题思考的方式按照步骤,第一步做什么,第二步做什么,适合处理一些较为简单的问题。

面向对象编程(Object-Oriented Programming,OOP):

        讲究分类的思维,解决问题首先需要思考的是需要用到哪些分类,然后对分类在进行单独的思考,最后对具体的分类下的细节在做面向过程的探索。适合处理较为复杂的问题,尤其是利于多人协作

        总而言之,面向对象和面向过程相辅相成,面向对象从宏观上把握,但是涉及到微观操作还是需要面向过程的思维方式。

==================================================================

什么是面向对象编程?

        面向对象的编程的本质思想就是:以类的方式组织代码,以对象组织(封装)数据(好好体会本句)。

面向对象编程的三大特性:

       

类是抽象的,对象是具体的事物。例如:狗就是类,XX家的狗旺财就是一个对象。

 2. 方法基础回顾

        

 

 

方法定义示例:      

//main方法    public static void main(String[] args) { /* 下述为定义方法的这个语法(规范) 修饰符 返回值类型 方法名(参数列表){     //方法体     return 返回值; }  */    }    //return结束方法,返回一个结果    public String sayHello(){ return "sayHello";    }    public void print(){ return;  //没有返回值 直接return  或者不写    }    public int max(int a,int b){ return a > b ? a : b;//三元运算符    }

  关于方法调用的问题:

        静态方法的调用

    非静态方法调用

分析:

        静态方法,也就是带有static关键字的,例如上面示例,对于静态方法,可以直接通过类名.方法名的方式直接调用,例如Student.say(),而非静态方法就无法直接通过类名.方法名的方式调用,会报错。

        那么非静态方法怎么去调用?

       非静态方法:就需要将这个类首先先实例化,也就是new一个对象出来,然后在对象.方法名去调用。具体如下所示

================

   public void a(){ b();    }    public void b(){     }======================   public static void a(){ b();    }    public static void b(){     }//前两个都是不会报错的,非静态去调用非静态 静态去调用静态=============================//为什么会报错?一个是静态方法,一个是非静态方法//static静态方法 是和类一起加载的     public static a(){ b();  //这样调用会报错    }//下面这个非静态方法,是需要类实例化之后才存在,也就是那一个存在的去调用不存在的显然是有问题    public void b(){     }

关于参数传递和引用传递   

public class Demon03 {    public static void main(String[] args) { //实际参数和形式参数的类型要对应int add = Demon03.add(1,2); //因为这个static是和类一起加载的,因此不用new直接就可以调用 System.out.println(add);    }    public static  int add(int a,int b){ return a+b;    }}
//值传递public class Demon04 {    public static void main(String[] args) { int a = 1; System.out.println(a); //1 Demon04.change(a); System.out.println(a); //1    }    public static void change(int a){ a = 10;    }}
    public static void main(String[] args) { Person person = new Person(); System.out.println(person.name); //null Demon05.change(person); System.out.println(person.name); //小君    }    public static void change(Person person){ /* persom是一个对象,指向的-->Person person = new Person();  这是一个具体的人,可以改变属性  */ person.name="小君";    }}//定义了一个Person类,有一个属性nameclass Person{    String name;}

思考为什么上述值传递就没有改变值?而引用传递就改变了?

3. 类与对象的创建

        类和对象是什么关系?

  •  类是一种抽象的数据类型,是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物

                动物,植物等

                Person类 Pet类 Car类 

  • 对象就是抽象概念的具体实例

        李四?李四家里的狗子 旺财就是一个具体实例

        如何创建和初始化对象

  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象,进行默认的初始化以及对类中构造器的调用。
  • 类中的构造器,其实就是构造方法,是在进行创建对象的时候必须要调用的。并且构造器有两个特点.(构造器相当重要
    • 1:必须和类名相同
    • 2:必须没有返回类型,也不能写void

4. 构造器(构造方法)详解

        

java文件经过编译会生产class文件(字节码),对比Person.java 和这个Person.class文件可知,在new对象的时候,默认帮我们加了一个方法。且这个方法没有返回值,其方法名和类名是相同的。

        由此可得出:

                一个类即使什么都不写,也会存在一个方法(构造器)

                显示的定义构造器  可以初始化一些值

构造器走完了之后,才生成对象。

构造器核心的作用就两个:

        1:使用new关键字,必须要有构造器。(默认是无参构造)也就是new一个对象,本质是在调用构造器,

         2:用来初始化值

报错信息如下:

 定义了有参构造之后,无参构造就显式空在那里即可。

 如上图所示:在new对象的时候传递参数之后,它自动就调用有参构造了,也就是会根据参数去判断,为什么?---------------------------------方法重载。(理解方法重载即可明白此处含义)

一个快捷键:alt+insert   一键生成构造器的快捷键

  默认是生产一个有参构造器,

如果是生成无参构造器,点击红色标注框即可。

构造器 总结:

        1:和类名相同

        2:没有返回值

作用:

        1:new  本质是在调用构造方法

        2:初始化对象的值

注意点:定义有参构造之后,如果想使用无参构造,必须显式的定义一个无参构造,否则就会报错找不到。

        

5. 创建对象内存分析

 

6. 总结