JAVA语言面向对象

面向对象(理解)

  • 面向对象是对面向过程而言
  • 面向过程思想概述:
    面向过程开发,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求。
    面向过程的代表语言:
    C语言
  • 面向对象思想概述:
    当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高。可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了。这时就开始思索:能不能把这些步骤和功能在进行封装,封装时根据不同的功能,进行不同的封装,功能类似的封装在一起。这样结构就清晰了很多。用的时候,找到对应的类就可以了。这就是面向对象的思想。
    面向对象的代表语言:
    Java Python
  • 总的来说,要完成一件事情,面向过程是关心要怎么做,而面向对象是关心谁来做。
  • 面向对象思想特点: a:是一种更符合我们思想习惯的思想 b:可以将复杂的事情简单化 c:将我们从执行者变成了指挥者,角色发生了转换

面向对象思想举例

洗衣服:

  • 换下脏衣服—找盆接水—泡一泡—手搓-----漂清----晾干(面向过程)

  • 全自动洗衣机(面向对象,调用方法)

面向对象特征:

  1. 封装(encapsulation)

  2. 继承(inheritance)

  3. 多态(polymorphism)

面向对象(类与对象概述)(理解)

现实世界由事物构成,那我们如何描述一个事物,我们可以通过事物的属性和功能来描述这个事物,比如我们要描述手机,手机的属性就是外观是矩形,而且后面都有摄像头,它的功能是可以打电话、上网和发短信。我们通过对手机的属性和功能的描述就实现了对手机的描述。
而在Java语言中,类是最基本的单位,它和现实世界中的事物相对应,我们要来描述一个类就需要来描述这个类的属性的功能

  • 现实中的事物和Java中的对应关系:
事物
属性 成员变量
功能 成员方法
  • 定义类其实就是定义类的成员(成员变量成员方法)
  1. 成员变量:和以前定义变量是一样的,只不过位置发生了改变,在类中、方法外。

  2. 成员方法:和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。

类和对象的概念:

  1. 类:是一组相关的属性和行为的集合

  2. 对象:是该类事物的具体体现

  3. 举例:

学生
对象 班长

面向对象(定义类)

在新建的工程下的src文件下新建一个,在里新建两个一个类中自定义类,另外一个作为测试类,测试类也是一个类,它里面有整个程序的入口,而在自定义类中,我们定义一个Student类来举例

package org.westos.demo3;

/**
 * @Author: Administrator
 * @CreateTime: 2019-04-05 15:21
 */
public class Student {                    //自定义类的基本格式
    //成员变量 :不赋值有默认值
    String name;                          //String为引用数据类型,默认复制为null
    int age;                              //byte、int、long、short数据类型默认赋值为0
    //成员方法
    public int calc(int a,int b){         //与定义普通方法一样,但是不用写static

        return a+b;
    }

    public void playGame(){
        System.out.println("玩会游戏");
    }
}

以上代码就包括了定义类的基本格式

  1. 学生事物

    属性: 姓名 , 年龄 , 地址 …
    行为: 吃饭 , 睡觉 , 上课 …

  2. 学生事物与学生类的对应关系

    属性 ----- 成员变量
    行为 ----- 成员方法

通过上述操作我们自己定义了一个类,在测试类中我们便可以使用我们自定义的类,但是在使用之前我们还需要根据类来创建一个对象

面向对象(创建对象)

package org.westos.demo3;

/**
 * @Author: Administrator
 * @CreateTime: 2019-04-05 15:23
 */
public class MyTest {                              //测试类(包含程序入口)
    public static void main(String[] args) {
        Student student = new Student();           //对象的创建
        String name = student.name;                //调用成员变量
        int age = student.age;
        System.out.println(name);
        System.out.println(age);
        int calc = student.calc(10, 10);
        student.playGame();                        //调用成员方法
        System.out.println(calc);
    }

}
  • 由于类是一个很抽象的东西,必须要通过将对象实例化才能使用,而创建对象就是对类进行实例化,将对象创建好以后便可以使用类的成员变量和成员方法。
  • 由上面的代码块可知,通过Student student = new Student();代码便创建了一个叫student的对象,这是创建对象的基本格式(包括无参构造有参构造,上面为无参构造,所以Student()括号里面为空,有参构造后面会提到)。基本格式为类名 对象名 = new 类名();
  • 通过student.成员变量名便可调用类的成员变量,通过student.成员方法名(参数列表)便可实现对类中的成员方法的调用。

面向对象(对象在内存中的状态)

一个对象的内存图
在这里插入图片描述在这里我地简单说一下Java中内存的分配

Java中内存的分配:

  • 栈内存 :存储局部变量(在方法定义中或者方法声明上的变量)
  • 堆内存:存放new出来的东西

堆内存特点:

1.系统会为每一个new出来的东西分配一个内存的地址值

2.每一个元素都有默认的初始化值
byte, short, int, long ---->0
float, double ---->0.0
char ---->’\u0000’
boolean ---->false
引用数据类型 ---->null

3.使用完毕以后就变成了垃圾,等待垃圾回收器对其回收

  • 方法区(面向对象部分)
  • 本地方法区(和系统相关)
  • 寄存器(CPU)

介绍完Java语言中内存发分配后就可以讲解在创建对象时的内存图:(Teacher类在这里不做解释)

  1. 在程序编译完成后要运行时,程序的字节码被加载到方法区,之后 JVM(Java虚拟机) 会自动识别字节码中的main方法并且将它加载到栈内存中。

  2. 加载完成后按顺序执行,在执行到Teacher teacher = new Teacher();时,系统识别到使用了Teacher类后会将Teacher类的字节码加载进方法区。

  3. 加载进来后会在栈内存中创建teacher局部变量作为引用,之后会在堆内存中分配空间来存放new出来的东西teacher对象的成员变量,分配的空间中存放nameage变量并分别初始化为null0

  4. 之后由于在自定义Teacher类时给成员变量name赋为“张三”,所以堆内存中的name变量的null又立刻会被“张三”覆盖。

  5. 之后系统会将这块内存的地址值赋给teacher引用,之后便可根据这个地址值来进行成员变量的调用和赋值,即通过teacher.成员变量来调用。也可通过teacher.成员方法来调用在方法区的成员方法。

  6. 后半部分程序不做过多解释。

面向对象(成员变量和局部变量的区别)

  1. 在类中的位置不同

    成员变量:在类中方法外
    局部变量:在方法定义中或者方法声明上(形参)

  2. 在内存中的位置不同

    成员变量:在堆内存
    局部变量:在栈内存

  3. 生命周期不同

    成员变量:随着对象的创建而存在,随着对象的消失而消失
    局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

  4. 初始化值不同

    成员变量:有默认初始化值
    局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

    注意事项:: 局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。

面向对象(方法的形式参数是类名的时候如何调用)

  1. Java中参数传递问题

    形式参数
    基本类型:形式参数的改变不影响实际参数
    引用类型:形式参数的改变直接影响实际参数

  2. 方法的参数是类名

    如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。

面向对象(匿名对象的概述和应用)

匿名对象:
就是没有名字的对象

匿名对象应用场景:

  1. 调用方法,仅仅只调用一次的时候。
  2. 匿名对象可以作为实际参数传递

猜你喜欢

转载自blog.csdn.net/qq_43298772/article/details/89065929