面向对象编程思想
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)方法区:用来存储加载类的信息,静态变量,常量的值。
结论:
(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)在本类中,可以直接使用变量名访问。
静态方法 可以访问 静态变量
非静态方法 可以访问 静态变量、非静态变量