Java之面向对象

故事扮演 提交于 2020-03-03 00:18:59

6.1 面向过程与面向对象

什么叫面向对象?

面向对象(Object-Oriented,简称OO)就是一种常见的程序结构设计方法。
面向对象思想的基础是将相关的数据和方法放在一起,组合成一种新的复合数据类型,然后使用新创建的复合数据类型作为项目的基础。

面向对象是一个很抽象的概念,它相对面向过程而言。

过程与对象都是一种解决问题的思想。

面向过程:强调的是功能行为,面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可,也就是一种过程,先干啥,再干啥;

面向对象:将功能封装到对象里,强调的是具备某功能的对象;面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为

按照面向对象的思想,可以把任何的东西看做对象!

面向过程和面向对象一定是互斥的吗?肯定不是
我们在处理问题时可以完全的面向过程 但是不能完全面向对象。举个例子来说:

你让女朋友做饭 你这个角度而言 面向对象
从女朋友这个角度而言呢?如果GF做 面向过程;如果GF不做 叫外卖 面向对象
从餐馆这个角度而言呢?应该是要做饭 面向过程;如果餐馆不做 可以叫别家餐馆做
.....别的餐馆都不做 这个饭始终没人做 相互踢皮球
从中可以看出什么 这个事最终要被处理-面向过程

所以 面向过程其实是最基本的思路 而面向对象是基于面向过程的思路

老板让王经理去招人
从老板的角度而言 面向对象 指挥老王
从老王的角度而言 这一整天
    刷牙洗脸 穿衣下楼 吃早餐 上班坐交通工具//11路
    去公司开始上班 面试应聘者 中午吃午饭 。。。。下班回家
    如果从一整天这个跨度而言 面向过程

从这个例子中就可以表明一个问题
    以前或者是今后我们所写的代码 宏观上而言 都是在面向过程
    只不过在某一个时刻 某一行 我们会用到一些面向对象的东西
   

System.out.println("来了老弟~");
//系统过来.输出.在控制台输出(输出打印的内容)

    Scanner scanner=new Scanner(System.in);
    //把那个扫描控制台的那个人给我叫过来 这个人的名字就是scanner
    int a=scanner.nextInt();
    //你让这个人从控制台读入一个整数并且给了变量a

    Random random=new Random();
    //把那个负责生成随机数的人给我叫过来 这个人的名字是random
    int a=random.nextInt();
    //让这个人给我生成一个随机的整数 给变量a

6.2 对象与类
1、面向对象有什么样的好处呢?
可以仿真的模拟现实生活中的事物,可以实现更加复杂的业务逻辑
淘宝在买东西的时候 查看商品->付款->生成订单->物流信息
如何描述一个坐标呢?
    在面向过程的思想里面
       

int x,y;
        int[] point={1,2}; 

额外的 如果是一组坐标

 int x1,y1,x2,y2,x3,y3....
        int[][] points={{1,2},{3,4},{5,6}};

其次对于他们之间的操作
        getDistance(p1,p2) 求两点间的距离
        会发现 数据 和 操作 是分开的
        弊端就是不方便统一管理
    在面向对象的思想里面

 p1=创建一个Point对象并且制定x=1,y=2
        p2=创建一个Point对象并且指定x=3,y=4
        p1.x p1.y
        p1.getDistance(p2) 让p1自己去和p2之间计算距离
        好处在于将数据和操作统一起来了
        意味着将点拟人化 该事物的数据和操作就可以统一起来了

什么是对象?

但凡是真实存在的且具体的事物 都称之为对象
           就是由某一个类所描述出来的具体的事物
    一个打火机 一根烟 一个手机 一台电脑....

什么是类?

类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础,本部分将深入介绍类的相关知识。
类的概念
类是一组事物共有特征和功能的描述。类是对于一组事物的总体描述,是按照面向对象技术进行设计时最小的单位,也是组成项目的最基本的模块。类的概念是抽象的,类似于建筑设计中的图纸,是对于现实需要代表的具体内容的抽象。类只包含框架结构,而不包含具体的数据。所以类代表的是总体,而不代表某个特定的个体。

我的总结:类是抽象的,对象是具体的,实实在在的!

类的定义:

[修饰符] class  类名{

      1~n个构造方法;

        0~n个字段;

        0~n个方法

}

定义类,其实就是定义类里面的对象

对象包含:

状态;(属性)

功能、行为;(方法)

通过类来描述对象;

状态--------成员变量;

功能、行为——方法;

class Person{
//属性
   private String name;
   private int age;
   private int sal;
   //方法
   public void show(){
      System.out.println("个人情况:"+name+age+sal);
   }
}


注意:建议一个类一个.java文件 方便类管理
也就意味着当我们在创建一个类的时候 其实就是在自定义一个数据类型

对象就是由一个类所描述的内容从而产生的一个具体的事物
    目前而言 但凡创建对象 用new关键字
    格式:

类名/数据类型 变量名=new 类名();

如何访问对象中的成员呢 变量名.成员

6.3 对象的内存图解I
    1.在堆内存中开辟一个空间并分配地址
    2.按照类的描述,在该空间中定义成员变量 并且有默认初始化值
    3.加载成员函数进入方法区(只加载一次)
    4.对象创建完毕 将空间地址赋值给相应的变量
    5.变量(p1/p2)调用成员变量
        先通过该变量所存储的地址去堆空间中找
        然后在该空间中找相应的成员变量
    6.变量(p1/p2)调用成员函数
        直接去方法区中找该成员函数
        将该函数加载进栈内存开始运行
        为了方便区分哪个对象调用的该成员函数
        由this这个关键字段 来区分 this主要存的是当前对象的地址
        注意:当成员函数在操作变量的时候 
            先在当前函数的空间里找 局部变量
            如果没有找到,再去this所指向的堆内存中对象所属空间里去找

构造方法

构造方法:用来构造类的实例(每一个类都默认有一个无参的构造方法,得使用new调用)

字段:类或对象所包含的数据,对类状态的一种描述;

方法:类或对象的特征或行为

作用:

给类中的字段进行初始化,可以用来创建对象。

特点:

方法名与类名相同

不用定义返回值类型

不需要写return语句

我的总结:

注意:

默认构造方法的特点。

多个构造方法是以重载的形式存在的。

构造方法的重载:(需要哪个就去适配哪个,调用哪个)

                this([实参]);调用当前类的构造方法

                注意: this([实参]);必须放在构造器的第一行;

对象的产生格式:

类名称  对象名 = new  类名称();

因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法。

如:CellPhone cp = new CellPhone();

static关键字

特点:

随着类的加载而加载

优先于对象存在

被所有对象所共享

可以直接被类名调用

使用注意:

静态方法只能访问静态成员

但是非静态成员可以访问静态成员;

静态方法中不可以使用this,super关键字

主方法(main)是静态的(可以利用类名去调用静态的main方法,很正常!但是会陷入死循环,导致内存溢出,jvm自动停止!)

public static void main(String[] agrs){}

可修饰字段,方法。

用static 修饰的成员表示它属于这个类共有,而不是属于该类的单个实例。

                static 修饰的字段 == 类字段

                static 修饰的方法 == 类方法

没使用static修饰的字段和方法,成员属于类的单个实例,

        不属于类。

                没有static 修饰的字段 == 实例字段

                没有static 修饰的方法 == 实例方法

类和实例访问字段和方法的语法:

访问类成员:        类.字段     类.方法

访问实例成员:    实例.字段          实例.方法

我的总结:

static 修饰的字段和方法,既可以通过类调用,也可以使用实例调用;

没static 修饰的字段和方法,只能使用实例来调用(建议使用:类名来调用;        其实在底层,对象调用类成员,也会转换类名调用)

static关键字不能与this,super同时连用!

匿名对象

 

一个没有名字的对象,  创建了一个对象出来,没有赋给一个变量;

特点:

对方法或字段只进行一次调用时;

可作为实际参数进行传递;

只在堆里面开辟存储区域,

只能使用一次,  使用完就被销毁了;

何时使用?只拿来用一次!!

new Person();表示匿名对象,没有名字的对象

new Person().age = 17;//使用一次之后就被销毁了

this关键字

特点:this表示当前对象。

当前对象  ←→  当前正在调用实例成员的对象

换言之:谁调用了方法,谁就是当前对象。

什么时候使用this关键字呢?

方法间的相互调用;

this.字段;

构造器中相互调用,但是此时this([参数])必须写在构造方法第一行。

this不能用在static修饰的方法里和static修饰的代码块里;

g:构造方法中的this.name = name;

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!