语言特点,类的声明、成员、对象、引用和内存图,成员变量的内存,方法的声明和使用(八)

277 阅读9分钟

面向对象编程思想

1.面向对象编程语言的特点:

(1)写代码时,发现代码结构都是以类为单位,后期学习的接口,枚举等也是和类一个级别的。

class 类名{
	方法{
		语句;
	}
}

(2)写代码时,发现所有的功能都是通过对象或类来调用

例如:

System.out.println(xx);
Scanner input = new Scanner(System.in);
int num = input.nextInt();
String str = input.next();
double d = Math.random();

(3)后期会发现,类与类之间还有关系

例如:继承等关系,继承、组合、聚合、依赖等。

2.从思考问题的方式

面向对象编程思想:把现实世界中的事务抽象成类

例如:Math类、Scanner类

3.和其他编程思想对比

面向过程:它的代表有C语言,一函数为中心,思考问题的方式:以解决问题的步骤为主,类似于执行者的角度思考问题;

​ 更适合于底层的系统软件的编写,例如操作系统。

面向对象:它的代表有Java语言,以对象为主,思考问题的方式:以找合适的类或者对象来完成指定的功能为主,类似于指挥者的角度思考问题。

​ 更适合于开发上层应用软件,或者大型的网站的编写。

​ 精髓:一切皆对象。

4.面向的语法开始学习,慢慢体会面向对象的编程思想。

(1)基础语法:类和对象

(2)面向对象的基本特征:封装、继承、多态

(3)API 应用程序编程接口,俗称帮助文档和核心类库

集合框架,IO流,网络编程,多线程,反射,JDBC,StreamAPI,日期和时间API,字符串(String,StringBuilder,StringBuffer)

1.什么是类?

类:一类具体相同特性的事物的抽象描述。

相同特性:

​ 比如:学生(学费。都有学习奇数的特性,封装方法study())

​ 教师(薪资。都有讲授技术的特性,封装方法为teach())

​ 人(都有吃饭、睡觉等特性)

​ 学生属于人,学生类可以继承人

​ 教师属于人,教师类可以继承人

事物:名词

2.如何声明类?

事物的数据特征-->属性,成员变量

事务的行为特征/功能特征-->成员方法

【修饰符】 class 类名{
	成员变量
	成员方法
}

类成员之成员变量

1.什么是成员变量?

他是用来描述事务的数据特征的。

数据特征:

(1)每一个对象都是不同的,例如:姓名年龄

(2)每一个对象都是相同的,例如:国籍都是一样的

2.如何声明成员变量?

(1)位置:在类中,方法的外面。

之前在方法里面声明的变量,就叫做局部变量。

(2)语法结构

【修饰符】 class 类名{
	【修饰符】 数据类型 变量名;
}

3.如何使用成员变量

对象名.变量名

4.成员变量分为两大类:

(1)静态成员变量

他是一个静态的,并不专属于某一个对象,所以它的使用不建议通过"对象名.静态变量名"来修改,建议使用"类名.静态变量名"发起使用

(2)非静态成员变量:每一个对象是独立的

5.如何使用成员变量?

静态的成员变量:static修饰

​ 类名.静态成员变量名 (推荐)

​ 或

​ 对象.静态成员变量名

非静态的成员变量:

​ 对象.非静态成员变量名

对象

1.什么是对象?

类:一类具体相同特性的事务的抽象描述。

对象:某类事物的一个具体的个体,实体。

2.如何创建对象?new

创建对象必须通过类。

new 类名();//匿名对象,后边没法调用
类名 对象名 = new 类名();//已经命名的对象

3.类与对象的关系

类:对象的抽象,设计图,模板

对象:是类的实体,具体个体

一个.java文件中只能有一个public类型的类,而且必须同名

1.为什么要声明包?包的作用有哪些?

(1)避免类的重名

(2)组织管理不同的类,使得相同作用的类,或者是同一个业务模块的类放在一起方便管理。

例如:java.net包下都是网络有关,java.sql包下都是和数据库使用有关

(3)限定某些类或者成员的可见性范围,配合修饰符

2.如何声明包?

在.java文件的首行,有一句代码:

package 包名;

注意:包名的层次必须与.java文件实际在的目录结构一致,否则就编译报错。

3.包名的命名规范

(1)单词全部都是小写的

(2)每一集目录结构之间使用.分割

(3)习惯使用 公司域名倒置+分类模块名

一级域名:

​ com:商业公司

​ org:组织,一般都是非营利性

​ edu:教育类

​ gov:政府类

包名中不要包含java单词

包名java.test运行会报错:

prohibited package name : java.test

4.如何使用其他包的类

需要导包

导包的语句

import 包.类名;
//或
import 包.*;
//但是我们只能省略最后的类名,不能全省略
//还有静态导入(静态成员变量)
import static java.lang.Math.*;
//此时 static的Math.PI可以省略为PI,Math.random()可以省略为random();

注意:

1.如果使用不同包中同名的类:

​ 可以一个使用import,其他使用”包.类名“的全名

2.java.lang包不需要导入,使用频率很高,可以直接使用。

例如:System,String,Math类都在java.lang包

成员变量内存图

JVM的内存:

(1)方法栈:存储方法的局部变量

(2)堆:凡是new出来的对象都在堆

`(3)方法区:用来存储加载类的信息,静态变量,常量的值。

对象的内存分析(2).png

结论:

(1)new完对象返回的是对象的首地址,可以把首地址放到对象名中,对象名其实就是一个引用数据类型的变量

数据类型 变量名 = 值
Ractangle r1 = new Ractangle();
/*
类型是Rectangle;
变量名是r1;
值是 new Rectangle()的首地址;
*/

(2)对象的成员变量如果没有赋值,那么会有一个默认值 byte,short,int,long,默认为0; float,double默认为0.0;char默认为编码值为0的空字符;boolean默认为false;引用数据类型:null

(3)非静态的成员变量,每一个对象都单独存储

(4)每一个对象,除了存储当前对象的非静态成员变量的值之外,还需要存储当前对象所属的类的地址。 本质上:一个对象的内存有三个部分: A:对象头:包括对象所属类信息等 B:对象的非静态成员变量值 C:对齐空白:对象所有成员变量+对象头占的内存不是32或64整数倍时,会需要补充一下空白来对齐。 (5)静态变量存储在方法区中,某个类的所有对象是共享同一个静态变量的。

Java的数据类型可以分为两大类:

  • 基本数据类型:8种

  • 引用数据类型:

    一维数组[],二维数组[][]

    类:凡是class声明的类,都可以作为类型用来声明变量

    接口、枚举、注解等

类的成员之方法

1.什么是方法

方法(method):又称为函数(function),一段可以独立运行的、可以复用的代码,这段代码是完成一个独立的功能。

例如:Math.random(),这个random()是方法,它的功能是返回一个随机的[0,1)的小数;Math.sqrt(x),这个Math.sqrt(x)是方法,它的功能是求x的平方根并返回。

2.如何声明方法

(1)位置:类中方法外

(2)格式:

【修饰符】 class 类名{	【修饰符】 返回值类型 方法名(【形参列表】)【throws 异常列表】{		方法体语句块;	}}

(3)返回值类型:

什么是返回值?方法运行完需要返回的结果。

什么是返回值类型?方法返回的结果的类型。

注意:有些方法是没有返回值的,如果方法没有返回值,那么返回值类型就只能写成void

方法名:就是一个标识符,是方法的表示,代表方法的功能。方法名的命名规范:见名知意,从第二个单词开始首字母大写。

(【形参列表】):是方法功能完成需要的参数。如果不需要参数的话,就不用写参数列表。

例如:Math.sqrt(x)这个x就是参数。

​ 在Math.sqrt这个方法声明时,表明这个方法在使用时,需要使用者给他一个参数,就要声明参数列表

​ 在Math.random().这个random()方法没有参数列表,使用者不需要给它传递参数,直接就可以使用。

注意:

  • 有些方法是没有返回值的,如果没有返回值需要用void修饰函数

3.如何调用方法?

(1)在其它类中调用方法

  • 非静态方法,调用方式:
对象.方法

说明:如果方法声明时有形参列表,那么调用时必须传入实参列表。

​ 个数:实参列表的个数必须和形参列表一致;

​ 类型:实参列表的参数类型必须与形参列表的类型一样或者兼容(double兼容int等,兼容就是可以实现自动类型提升的);

​ 顺序:实参列表的参数顺序要与形参列表的参数顺序一一对应。

如果方法声明时有返回值,那么调用时,需要接受,如果不接受,返回值就丢了。

(2)在本类中的方法中使用本类的成员变量:可以直接使用

4.方法的分类

1.方法的功能实现和对象有关。(非静态方法)

例如:求面积的方法,不同的对象, 面积时不同的。

2.方法的功能实现和对象无关,就应该声明为静态的。(静态方法)

方法和变量的调用方式

1.方法的调用

(1)在其他类中:

非静态方法:

​ 对象名.方法

静态方法:

​ 类名.方法

​ 对象名.方法

(2)在本类中

静态方法不能使用本类的非静态方法。

静态 可以访问 静态

非静态 可以访问 静态、非静态

静态方法不能使用本类的非静态方法。这是因为:

静态时随着类的加载而加载的,而非静态只有被创建时才会被加载。

2.成员变量的调用

(1)在其它类中

静态变量:

	类名.静态变量(推荐);或	对象.静态变量;

非静态变量:

	对象.非静态变量;

(2)在本类中,可以直接使用变量名访问。

静态方法 可以访问 静态变量

非静态方法 可以访问 静态变量、非静态变量