Java基础学习第六节——面向对象,static关键字,包的使用

面向对象概念

1 课程介绍

  • 1.了解什么是面向对象(了解)

  • 2.理解什么是类与对象(掌握)

  • 3.类的设计(掌握)

  • 4.对象的创建与赋值(掌握) instance (实例)对象

    1. 构造方法(构造器-构造函数 )(掌握)
    1. static 修饰符
    1. 包(理解概念和作用)

2 初识面向对象

我们所说的面向对象是一种编程思想,什么是编程思想呢?让你如何去设计程序,同时也能看懂别人的代码

对象,常有两层意思,指行动或思考时作为目标的事物或特指恋爱的对方等含义。

我国学者唐震在《接受与选择》一书中把对象看成是围绕着人的、被人用来接受或选择的特定事物。他提出了对象序列说。

编程思想份为很多种

面向对象 oop(Oriented object Programming): 就是一种编程思想(了解) java

面向过程 pop(procedure oriented programming):也是一种编程思想(了解) c

重点: 熟悉(熟练)面向对象中的基本语法,了解面向对象的思想!

3 类与对象

3.1 类和对象理解

*****什么是类?

是指描述一类事物,或者看成是一个分类, 例如人类Humanity、车类Car
class、Animal,动物类,等

3.2 设计类

设计类:

>   语法:
>   class 类名{
>   成员变量 (字段)
>   方法 (具体的一个功能行为)
>   }

类规范书写:

①类名首字符大写;

②类名必须具有意义;

③必须写注释;

示例 : 设计一个学生类(模板))
在这里插入图片描述

>   参考
>   设计一个学生类代码:
>   class Student{
>   String name; // 姓名
>   int age; // 年龄
>   。。。。
>   void eat(){}
>   void sleep(){}
>   }

在这里插入图片描述
*****什么是对象?

对象是指具体的独有个体(也叫实例-instance),
例如马云、王健林、老王、马云的迈巴赫、王石的切诺基、老王的五菱神车、地球、火星等等。类和对象的关系请看下面的图例:

3.3什么是对象

类:人类

对象:撒贝林,马云,王健林,等等
在这里插入图片描述
类:车类

对象:出租车,王石的切诺基,五菱宏光
在这里插入图片描述
设计一个学生类?

参考:

Java类结构中,就三个东西 字段 方法 构造函数 99%

New 出来的,就是对象

4 对象的创建

4.1如何创建对象

暂时 : new 类名(); --------->相当于学籍卡模板复印件(没有具体的学生资料)

4.2给对象字段赋值

如何操作:
在这里插入图片描述
想到数组操作:

定义一个变量存储数组的对象的地址,然后使用变量等同于使用对象

①使用int 可以接收Student对象吗?
在这里插入图片描述
②使用String来接收Student对象可以嘛?
在这里插入图片描述
根据错误提示,需要Student来接收;
在这里插入图片描述
Student是类型吗?

以前学习的类型 :基本类型/引用类型,其中引用类型里面包含类,接口 数组,

所有说 类是一种类型,这里的Student也一种类型,它是引用类型;

如何给 学生对象 赋值 和取值?
在这里插入图片描述
堆栈内存图分析代码(重点):

下面使用堆栈内存图来解释一下上面代码的流程和存储。从下图中可以看到:


每创建一个对象都会在堆内存中开辟一块空间,并且这块空间中具有和类(模板)中一样的成员。


每一个对象都被栈中的一个变量所指向,所以操作栈中的变量(s)就如同操作堆中的对象。

s.name =
“小明”;其实是把字符串值赋值给s变量指向的堆中的name字段上的,而不是设置给类的,所以我们在分析代码的时候,看到new
Student()对象应该立马想到在堆中有一个对象。
在这里插入图片描述
在这里插入图片描述
5 构造方法(Constructor)

5.1 构造方法引入

在这里插入图片描述
new Student(); 创建一个学生类的对象 (暂时记忆成 new 类名() )

上面代码本质是调用Student中的无参数的构造方法,一个类有一个默认的隐式无参构造方法!

5.2 什么是构造方法

  1. 啥是构造方法?

构造方法就是一个东西(就是一个结构 和 字段(成员变量)
方法一样都是一个类中的成员之一)

构造方法的结构和普通方法类似,但是和普通方法完全不同两个物种;

① 构造方法的名字和类名一致(包括大小写完全一致)
② 没有返回值类型
③ 构造方法内部不需要返回任何的数据
④ 其他的和普通方法类型 ,可以有修饰(public),可以有形参列表,可以有方法体

注意:new Student()
这个整体既是一个Student对象,又是调用的Student的无参数构造方法
在这里插入图片描述
5.3 构造方法特点

  1. 类中构造方法特点:

① 每一个类中都至少有一个构造方法;

② 如果没有看到(显示的),那么存在一个隐式的无参数的构造方法;

③ 如果一个类中有显示的构造方法,那么隐式的就不存在了;

  1. 验证new Student()就是在调用构造方法?

① 把隐式的构造方法显示写出来

② 在这个构造方法里面随便写点打印代码

③ 执行new Student(),。。。。

有显示的构造方法,隐含的无参的构造方法就不存在;
在这里插入图片描述
5.4 构造方法的作用

① 通过调用构造方法可以创建对象

② 在创建对象的同时给对象的字段赋值
在这里插入图片描述
在创建对象的同时给对象的字段赋值–》通过构造方法来完成
在这里插入图片描述
5.4 构造方法注意事项


明确:
构造方法(Constructor)和普通方法(Method)是不一样的东西,只是结构有些类似而已;

注意: 1 普通方法可以名字和类名一致,但是不推荐这样,容易混淆;
在这里插入图片描述
注意: 2 构造方法的调用方式和普通方法不一样

到目前为止,构造方法的调用方式 : new 构造方法();
在这里插入图片描述
编译是否会报错? 不会

现在有返回值类型 void
此方法就是普通方法,只是方法名和类名一样,容易误导人,千万不要这样写!!!

注意:把构造方法 Student 写成小写了 student; 如下图:
在这里插入图片描述
原因 : 1 如果是构造方法那么首字母应该大写; 2 如果是普通方法应该有返回值类型

注意:

普通方法和构造方法是不同的两种结构

调用方法不一样

普通方法的调用 : 3种 (类名.方法名())

(对象.方法名)

(直接方法名)–同一个类里面 都要static修饰 或 都没有static

—》 不适用于构造方法

构造方法的调用 : 1(目前) new Xxx(…);

5.5 构造方法小结

方法(Method) 构造方法(Constructor)

① 方法和构造方法是两个不同的东西;

② 方法的调用方式:

>   类名.方法名(...);
>   对象名.方法名(...); // 被调用的方法所在的类的对象.方法名(。。。);
>   方法名(...);

③ 构造方法的调用方式:

目前为止 : new Xxx(…);

不能够使用方法的调用方式来调用构造方法

④ 目前为止,一个类中可以有的成员:

成员变量(字段)

普通方法

构造方法

⑤ 构造方法作用:

创建一个对象

给对象里面字段赋值

目前内容:

①创建类

class 类名{

字段

方法

构造方法

}

②创建对象(new Student())

③ 给对象内容赋值(①构造方法②直接给对象 赋值 s.name = “小王”)
在这里插入图片描述

6 匿名对象以及对象的生命周期

6.1 匿名对象引入

在这里插入图片描述

上面的代码 为什么打印null呢?

因为上面new了两次;在堆空间了创建了两个对象,值赋值给第一个对象;

这里的对象(new Student()) 其实就是匿名对象;

6.2 什么是匿名对象

  1. 匿名对象,就是没有名字的对象(创建了一个对象而没有使用变量接收)

6.3 匿名对象使用场景

匿名对象的使用场景: 只是使用一次(调用一次普通的方法)

与静态方法使用类似
在这里插入图片描述
6.4 对象的生命周期(了解)

什么是对象的什么周期:

和人类似,就是从开始到结束,对象的什么周期,就是从对象的开始到结束;

人生命周期开启:从妈的肚子里出来;

人生命周期结束:有几种说法,①心脏停止跳动②脑死亡(意外)③或者世界上最后一个记住你的忘记您了,④失联(空难等)

(什么时候开始,什么时候结束)

开始 : new Student() ,new的时候就开始了;

结束(说法1,常见的说法)
:当对象失去所有的引用(没有变量再指向它了(没有变量在存储它的地址)-
相当于失联了,我们无法再使用它了)-- 就是死亡了;(垃圾回收器
并不是立刻进行回收)

结束(说法2) :
对象真正的被销毁(对象会在堆里面占用内存,当把对象的内存空间回收了),Java有自动垃圾回收机制;

7 static关键字 (静态)

7.1 static引入

这是从第一次写hellojava的时候,主方法就见过;static
是Java的一个关键字,也是一个修饰符;

(1)可以修饰什么和不可以修饰什么?(下面有很多术语,记住就好)

可以修饰 方法,字段(不包括局部变量)

不可以修饰 类(外部类),局部变量;

-----》 写代码验证上面的说法
在这里插入图片描述
修饰的效果是什么?

7.2 修饰字段

① 有static修饰的字段应该是字段所在 类名.字段名 进行访问
在这里插入图片描述
② 没有static 修饰的字段: 字段所在的类的对象来访问
在这里插入图片描述
错误的访问方式
在这里插入图片描述
7.3 修饰方法

① 有static修饰的方法: 方法所在的 类名.方法名(…);
在这里插入图片描述
② 没有static修饰的方法 : 方法所在的类的对象名.方法名(…);
在这里插入图片描述
错误的访问方式
在这里插入图片描述
7.4 字段:什么时候使用static修饰呢?

我们在写一个字段的时候,是否应该加static —》 根据实际情况

实际情况:

设计一个学生类,其中有name-姓名 字段,是否应该加static 呢? —》
加与不加的效果
在这里插入图片描述
结果: Student中的name这样的字段不应该使用static 修饰

因为: static修饰的字段会被所有的对象共享,只有一份

思考 : Student(学生类)中哪些字段是应该使用static修饰呢?

班级? 学校?班主任?名族?国籍?性别?教室。。。 ----> X

哪些字段应该是static的(实际开发为准)π(Math.PI)

例如 : int的位数 32 —》 可以写一个类,里面写一个static修饰的字段 表示位数
Integer.SIZE

>   class Test{

>   public static final int SIZE = 32;

>   }

数学上的π —》 Math.PI

一般static所修饰的字段,都不能更改

一般都是全局常量( public static final 修饰的变量 )使用居多

全局常量: 简单理解 就是public static final修饰的字段

7.5 方法:何时使用static修饰方法?

目的: 使用static修饰的方法调用方便

常见的地方: 一般就是工具方法(关注方法本身的功能),例如:
Arrays中全部都是工具方法(static)

最近我们一般写的方法都写成非静态,除非非得使用static

7.6 static 小结

① 现在我们写的类(有一定业务意义的类,例如Student)中的成员 都不加static

② 理解上面提到的Java中加static修饰的地方就可以(全局常量)

掌握内容:

①static 可以修饰字段 方法;

②static 修饰字段 或者 方法怎么调用;

③static 修饰字段 表示 共享的内容,明确哪些地方应该使用static进行修饰字段;

设计类的时候,独立去思考一下,该不该加static

7.7 变量分类的详解(下面的术语请背住! 听写)

变量分类的解释方式:(不是难点,知道这些属于什么意思)

变量分类有哪些?

成员变量(也叫字段) : 静态的(类变量)和非静态的(实例变量)

局部变量:不能使用static修饰

分类详解:

--------

位置 是否有static 生命周期(开始) 生命周期(结束)

类变量 类中 √ 类被加载的时候 类被卸载的时候

实例变量 类中 创建对象的时候 对象被销毁

局部变量 方法内部(形参,代码块) 方法被调用的时候 方法调用完毕

理解:

类被加载的时候 : 把类的字节码文件 加载到 JVM中;

局部变量的作用 : 一般都是方法中,为了辅助方法完成功能而临时定义的变量;

类变量 : 有static修饰的成员变量(字段);

实例变量: 没有static修饰的成员变量(字段);

// 以下的说法尽量少用

类 成员 : 静态的 字段和方法

实例 成员:非静态的字段和方法

-------------------------------------

了解:

static修饰的成员(字段和方法)应该使用 类名.成员名访问

也可以使用对象名.成员名,但是不推荐!!!(编译完毕之后也是类名来访问)

8 包(可以学习之前看成是一个文件夹)

8.1 包引入

在这里插入图片描述
示例:生活中例子,有很多资源 片

国产
欧美
日韩
动作
爱情
恐怖
。。。

怎么管理这些片?

示例2:我怎么管理他们的类型?
在这里插入图片描述

8.2什么是包

  1. 什么是包? 暂时看成是文件夹,用于方便管理文件的一种方式

8.3包作用

① 可以结构化的管理代码

500W项目(1000个文件) 不好查找

② 可以避免类名冲突的问题

一个项目中有可能多个类名一样

8.4如何使用包

①创建包②引用包

如何定义包

  1. 包命名规范:

hqyj.cn cn.hqyj

一般是公司域名反过来写+项目名+模块名字+子模块名

例如 : hqyj.cn 域名

package cn.hqyj.erp.oa.domain;

注意:不要写错nc.

上班之后 不要写错cn.自己的公司名字 按照公司规范写

规范:①自己一定需要有规范命名的意识,具体怎么写以公司标准为准;

②包名中应该全部都是英文,并且是小写的

--------------------》下面是动手写代码的流程
在这里插入图片描述

② 在java源文件中写,写在所有声明类的前面(一个java文件中可以有多个类)
在这里插入图片描述
注意:这几天
一旦editplus里面写了包的申明,不要使用editplus里面的编译和运行,使用原生cmd的命令行;

③ 编译(请在命令提示符窗口中进行)
在这里插入图片描述
语法 : javac -d . 源文件名.java // 编译的时候不需要包的!

实例 : javac -d . PackageDemo1.java

④ 运行(请在命令提示符窗口中进行)

语法 : java 包名.子包名.类名

实例 : java cn.itsource.test.PackageDemo1

类的完全限定名 : 包名.子包名.类名
在这里插入图片描述

  1. 包的导入(其实本质是导入包中的类)

① 在一个类中需要使用到其它的包中的类,可以先导入在便捷的使用

② 导入的语法 : import 包名.子包名.类名;

③ 注意: 导入包的代码应该在声明包的后面,声明类的前面
在这里插入图片描述
④ import java.util.*; 表示导入本类中会使用到的,util包中的类;
在这里插入图片描述
只会导入util下面直接的类型,不包括util包的子包中的类型

为什么String类 是Java提供的,它为什么不导入包呢?

⑤ java.lang这是核心包,下面的直接的类型是会自动导入的;

lang包的子包中的类型不会自动导入,需要手动导入

⑥ 特例:在一个类中会用到util中的Date 和sql包中的Date

不能够直接导入两个(不能区分)

怎么办?

导入一个,另外使用完全限定名

建议都使用类完全限定名(java.util.Date或者java.sql.Date)更直接一些
在这里插入图片描述
类的完全限定名:包名.类名

Util,sql它都有getTime方法返回毫秒数,自然就可以直接构建
在这里插入图片描述
8.5了解Java已有包的分类

java/ javax(java增强包)

java.lang (java的核心包–基本包)

java.util(java的工具包 --集合框架ArrayList LinkedList)

java.io(java IO包 读写文件)

java.net(网络编程)

java.awt/javax.swing(java的图形化界面)

9.课后练习

① 什么是类,什么是对象,举例说明,并使用代码 定义一个类 和对象出来;

万物皆对象,类是事物的抽象,对象是类的实例

public class Cat {

String name;

int age;

public Cat() {

}

\@Override

public String toString() {

    return "Cat [name=" + name + ", age=" + age + "]";

}

public static void main(String[] args) {

    Cat cat = new Cat();

    System.out.println(cat);

    }

}


定义一个长方形的类Rectangle,里面定义
求面积的方法int getArea(int width,int height)

在定义两个字段,一个长(height)和一个宽(width);并写测试类进行测试;

public class Rectangle {

    int height;

    int width;

    public int getArea(int width,int height) {

        return width *height;

    }

    public static void main(String[] args) {

        Rectangle r = new Rectangle();

        System.out.println(r.getArea(5, 8));

    }

}

④ static 可以修饰什么?有static修饰的字段和方法,应该怎样访问?

没有static修饰字段和方法,又应该怎样访问?

可以修饰方法,字段;类名.字段或方法名;创建一个对象,对象.字段或方法名

⑤ public static void 可以写成 static public void 这样?

可以

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值