Java面向对象基础(一)小试牛刀

1、面向对象思想

1.1、概述

  面向对象(Object Oriented)是软件开发方法。
  面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
  面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体 来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

面向过程到面向对象思想层面的转变:
  面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。
  面向过程到面向对象,是程序员思想上从执行者到指挥者的转变。
此概念如果直接去理解的话可能会比较抽象,因为大家缺少对原始的面向过程的开发语言的了解,下面我们举一个例子。

1.2、举一个例子

我们通过一个很经典的问题,来理解这个概念。
 问:
  把大象装进冰箱 , 需要分几步?
 回答:
  面向过程回答: 3步:1把冰箱门打开, 2把大象装进去 , 3把冰箱门关闭
  面向对象回答: 2步:1招一个能操作冰箱的工人(对象),2指挥工人装大象
 思考:如果问题改成: 把100只大象依次关进冰箱,共分为几步?
  面向过程的回答: 此处重复机械劳动,低复用。。。
  面向对象的回答还是2步: 1招一个能操作冰箱的工人(对象) , 2指挥工人把大象依次装进去。

结论:从上述的例子中, 我们发现面向过程很死板 ,是很难适应变化的 。 而面向对象更灵活,可复用性更高。

1.3、再来一个

我们再描述一个生活的场景:
  场景:
   当我们独自生活时, 我们经常纠结一日三餐怎么吃。
面向过程:
   每天亲力亲为: 买菜 - 做饭 - 吃饭 - 洗碗的过程。
面向对象:
   招聘一个保姆,每天等吃即可。
场景升级:
   假设你是一个富豪, 拥有一座占地3000亩地的庄园 ,不再是只关注吃饭问题 , 还有花草树木修剪,泳池维 护清洗,卫生打扫,洗衣做饭。。。。。。
面向过程:
   什么都要按过程一步一步做,过程繁琐,还怎么享受人生?
面向对象:
   招聘一个管家, 然后让管家招聘 园丁、泳池维护工、保姆等等。
结论:从上述的例子中, 我们发现面向过程,我们需要关注很繁琐的过程 。 而面向对象不用关注具体的细节,更关注的是统筹架构的问题。 其实我们进行大型应用开发时, 就如上述的例子一样, 如果我们写程序只关注过程的话, 代码量达到一定层次以后, 就很难再编写下去了。 如果采用面向对象的思想来设计编写程序 ,会很有层次感。

1.4、三大思想

面向对象思想从概念上讲分为以下三种:OOA、OOD、OOP
  OOA:面向对象分析(Object Oriented Analysis)
  OOD:面向对象设计(Object Oriented Design)
  OOP:面向对象程序(Object Oriented Programming

1.5、三大特征

封装性:所有的内容对外部不可见
继承性:将其他的功能继承下来继续发展
多态性:方法的重载其本身就是多态性的一个体现

2、类与对象

2.1两者关系

  类表示一个共性的产物,是一个综合的特征,即对具体的抽象,而对象是一个个体的产物,是一个个体的特征,是类抽象的实例化。(类似生活中的图纸与实物的概念。)
   类必须通过对象才可以使用,对象的所有操作都在类中定义。
类由属性和方法组成:
  属性:就相当于人的一个个的特征 例如:年龄、性别、名字等。·
  方法:就相当于人的一个个的行为,例如:说话、吃饭、唱歌、睡觉

1.2.2、类的定义格式

class 类名称{
  成员属性
  成员方法
}
对应下例Person类
属性定义格式:
    数据类型 属性名;
属性定义并赋值的格式:
    数据类型 属性名 = 初始化值;
方法定义格式:
    //方法体,形式参数列表即表示可以有0到多个参数,当返回值为void(空)时无返回值,没有return 返回值;这行代码。
    //一定要多动手敲(//表示整行注释,有无都不影响,注释是对代码的解释,强烈建议写注释,很重要
     权限修饰符 返回值类型 方法名(形式参数列表){ //方法体
    return 返回值;
}
注意:一个.java文件中可以有多个类,除去内部类,剩下的每个普通类编译后都会生成一个.class文件(如下例生成两个.class文件)

/**
*类名要符合命名规范,类名大驼峰式,例如:PersonDemo
*变量名小驼峰式,例如:personAge,命名不要怕长,男人长点好,尽量见名知意
*/
package com.java.demo;

public class Person{//一个.java文件中只能有一个public类
	String name;//字符串类型姓名
	int age = 18;//整型变量年龄
    public String say(String name1) {
        name = name1;
        return name;
    }
}
class PersonTest{
    public static void main(String[] args) {
        Person person = new Person();
        person.say("小明");
        System.out.println(person.age);
        System.out.println(person.name);
    }
}

在这里插入图片描述

3、内存分析

3.1栈

Java栈的区域很小 , 大概2m左右 , 特点是存取的速度特别快
栈存储的特点是, 先进后出

存储速度快的原因:
  栈内存, 通过 ‘栈指针’ 来创建空间与释放空间 ! 指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存 ! 这种方式速度特别快 , 仅次于PC寄存器 ! 但是这种移动的方式, 必须要明确移动的大小与范围 , 明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序 的灵活性 , 所以我们把更大部分的数据 存储到了堆内存中
  存储的是: 基本数据类型的数据 以及 引用数据类型的引用!
  例如: int a =10; Person p1 = new Person();
  10存储在栈内存中 , 第二句代码创建的对象的引用(p1)存在栈内存中

3.2、堆

堆中存放的是类的对象 .
Java是一个纯面向对象语言, 限制了对象的创建方式:
  所有类的对象都是通过new关键字创建
  new关键字, 是指告诉JVM , 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间:
  堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用时长 !
堆内存中内存的释放是由GC(垃圾回收器)完成的
垃圾回收器
回收堆内存的规则:
  当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 !
例如:
   Person p0 = new Person();
   Person p1 = p0;
   Person p2 = new Person();//当程序运行到此行时p1,p0被回收(此程序中没有后续p1,p0的引用)。

3.3、PC寄存器

名称:程序计数寄存器(Program Counter Register)
JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。
PC寄存器保存的是当前正在执行的 JVM指令的地址 !
在Java程序中, 每个线程启动时, 都会创建一个PC寄存器 !

3.4、本地方法栈

保存本地(native)方法的地址 !

4、构造方法(构造器)

4.1、回顾对象的创建

Car car = new Car();
在创建一个对象时使用new操作进行的Car(),其实就是在调用构造方法!(详细参见4.3)

4.2、构造方法概述

构造方法定义:
  在Java中,任何变量在被使用前都必须先设置初值,如无显式赋值,则编译器会为其进行隐性赋值。Java提供了为类的成员变量赋初值的专门方法。
作用:
  用于对象初始化。
执行时机:
  在创建对象时,自动调用
特点:
  所有的Java类中都会至少存在一个构造方法
  如果一个类中没有明确的编写构造方法, 则编译器会自动生成一个无参的构造方法, 构造方法中没有任何的代码!
  如果自行编写了任意一个构造器, 则编译器不会再自动生成无参的构造方法

4.3、定义格式

定义的格式:
  与普通方法基本相同, 区别在于: 方法名称必须与类名相同, 没有返回值类型的声明 !
案例:

package com.java.demo;

public class ConstructorDemo {
    public static void main(String[] args) {
        Car car = new Car();//调用无参构造方法
        Car car1 = new Car("五菱神车","上汽通用五菱",44800.0);//调用全参构造方法,实例化对象并对对象初始化
    }
}
class Car{
    String name;//车名
    String company;//制造公司
    double price;//价格

    public Car() {//无参
        System.out.println("无参构造方法已调用!");
    }
    public Car(String name, String company, double price) {//全参
        this.name = name;
        this.company = company;
        this.price = price;
        System.out.println("全参构造方法已调用!");
    }
}

在这里插入图片描述

4.4、构造方法设计

建议自定义构造方法时,不要对编译器形成依赖,避免发生错误。
当类中有非常量成员变量时,建议提供两个形式的构造方法,一个是无参的构造方法,一个是全属性做参数的全参构造方法。
当类中所有成员变量都是常量或者没有成员变量时,建议不提供任何形式的构造方法。

4.5、构造方法的特殊点

构造方法就是类构造对象时调用的方法,主要用来实例化对象。
构造方法是一种特殊的成员方法,它的特殊性反映在如下几个方面:
1.构造方法作用:(1)构造出来一个类的实例,即实例化对象(2)对构造出来的一个类的实例(对象)进行初始化。
2.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
3.主要完成对象的初始化工作,构造方法的调用是在创建一个对象时使用new操作进行的。
4.类中必定有构造方法,若不写,系统自动添加无参构造方法。接口不允许被实例化,所以接口中没有构造方法。
5.不能被static、final、synchronized、abstract和native修饰。
6.构造方法在初始化对象时自动执行,一般不能显式地直接调用.当同一个类存在多个构造方法时,java编译系统会自动按照初始化时最后面括号的参数个数以及参数类型来自动一一对应。完成构造函数的调用。
7.构造方法分为两种:无参构造方法 有参构造方法
构造方法可以被重载。没有参数的构造方法称为默认构造方法,与一般的方法一样,构造方法可以进行任何活动, 但是经常将他设计为进行各种初始化活动,比如初始化对象的属性。

5、方法的重载(不给代码了,参考构造方法)

方法名称相同, 参数类型或参数长度不同, 可以完成方法的重载 !
方法的重载与返回值无关!
方法的重载 ,可以让我们在不同的需求下, 通过传递不同的参数调用方法来完成具体的功能。

6、构造方法的重载(构造方法是一种特殊的方法)

一个类可以存在多个构造方法 :
参数列表的长度或类型不同即可完成构造方法的重载,构造方法的重载 可以让我们在不同的创建对象的需求下, 调用不同的方法来完成对象的初始化!
例如:

正确的示范:以下两个类型不同的参数交换位置即为不同构造方法,不会报错

 	public Car(String company, double price) {
        this.company = company;
        this.price = price;
    }
    public Car(double price, String company) {
        this.company = company;
        this.price = price;
    }

错误的示范:虽然参数交换位置但两个参数类型相同,idea报错。

public Car(String name, String company) {
        this.name = name;
        this.company = company;
    }
    public Car(String company, String name) {
        this.name = name;
        this.company = company;
    }

在这里插入图片描述
下面这个大坑(对我来说)


public Car(String company) {
        this.company = company;
    }

在这里插入图片描述
当我创建了上图name构造方法时再想创建company的构造方法时(代码在上面),系统提示构造方法已存在!(自我批评一下,没写这些例子之前我也不知道这是不可以的,之前想当然了,之前以为这些代码简单从没动手试过。)

7、匿名对象

没有对象名称的对象 就是匿名对象。
匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。
只使用一次的对象可以通过匿名对象的方式完成。
正常实例化对象:
  Car car = new Car();
匿名对象:
  new Car();
对此我的理解是:正常实例化对象是把new Car()的引用(即地址)赋值给Car类型的名叫car的变量,而匿名对象要匿名所以没有类型没有名字,更不知道其地址,没有任何对象的引用,就是一个神秘的new Car(),工具人而已招之即来,挥一挥衣袖,没用了就被GC带走。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值