1.类与对象
1.1 什么是对象
对象:是一个一个实实在在的,具体的个体(实体)。比如:一个个人、一辆辆车、一本本书等等。
1.2 什么是类
类:一组具有相同特征的对象的抽象描述
如:
张三,510220199612013669,18256958568,158936587.... 代表一个对象
李四,510220199612013667,18256958575,158936787.... 代表一个对象
姓名、身份证号码、手机号码、qq号码..... 对应一个类
此时就可以将这些对象抽取相同的特征(属性)封装为一个类
public class Person {
String name;//名称
String idCard;//身份证
String phone;//手机
String qq;//qq号
}
通俗而言:类就相当于施工图,我们可以根据施工图来知道一栋楼每套房子具有那些功能区(共同的特质),进而造出楼房。
在Java中根据施工图创建对象的关键字是 new。
从代码编写的角度而言,必须先创建类,才能创建出对象。
1.3 什么是面向对象
面向对象是一种思想或编程方式。
面向对象的过程是以“对象”为中心。
Scanner input = new Scanner(System.in);//input就是一个Scanner类的对象
System.out.print("请输入姓名:");
String name = input.next();
System.out.print("请输入年龄:");
int age = input.nextInt();
input.close();
与面向对象对应的另一种编程思想:面向过程。它是以函数为中心,实现代码就是通过函数调用把过程串起来。(c语言是面向过程编程)
public class ArrayTools{
public static int max(int[] arr){
int max = arr[0];
for(int i=1; i<arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
public static void print(int[] arr){
for(int i=0; i<arr.length; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args){
int[] arr = {2,4,5,3,1};
print(arr);
int result = max(arr);
System.out.println("最大值:" + result);
}
}
这一段代码,如果抛开ArrayTools类的定义,那么3个函数是独立的,它们互相调用即可,这种方式就是面向过程的编程思想。
另外一个场景描述,来理解面向对象与面向过程的区别:
把大象装进冰箱的问题?
面向过程 | 面向对象 |
---|---|
以步骤为中心,即以函数为中心 | 以类/对象为中心 |
(1)把冰箱门打开 (2)把大象装进去 (3)把冰箱门关上 | (1)定义人这个类,包含pull,push功能,包含name属性 (2)定义冰箱这个类,包含open,close,save功能,包含size、brand等属性 (3)定义大象这个类,包含walk功能,包含weight属性 (4)定义测试类,包含main方法,在main方法中创建人、冰箱、大象的对象,调用对象的方法来完成 |
1.4 如何定义类
语法格式:
【①修饰符】 ②class ③类名{
④类的成员
}
如:
public class Person{
String name; //类的成员
}
1.5 如何new对象
语法格式:
new 类名()
如果没有用变量引用对象,这个对象是一个“匿名对象”。匿名对象都是一次性,无法反复使用
public class Test {
public static void main(String[] args) {
new Person();//创建了一个Person类的对象
System.out.println(new Person());//创建一个Person类的对象,并且打印这个对象
//com.yang.dto.Person@3b07d329
System.out.println(new Person());//又创建一个Person类的对象,并且打印这个对象
//com.yang.dto.Person@41629346
//上述三个对象是匿名对象,都是独立的,无法重复使用的
}
}
如何用变量引用一个对象?
类名 对象名 = new 类名();
对象名本质上也是一个变量,是一个引用数据类型的变量。
public class Test {
public static void main(String[] args) {
Person p = new Person();
System.out.println(p);
System.out.println(p);
System.out.println(p);
//p这个对象可以被反复使用
/*
这里的p是对象名,同时也变量名
Java的数据类型:
(1)基本数据类型:byte,short,int,long,float,double,char,boolean
int a = 1;
(2)引用数据类型:数组、类等
int[] arr = new int[5];
Person p = new Person();
int[],Person是数据类型,从这个角度来说,arr, p也是变量。
因为这种变量引用的是一个对象,所以这个变量称为引用数据类型的变量,也称为对象名。
*/
}
}
2.类的成员之一:成员变量
2.1 如何定义成员变量
【修饰符】 class 类名{
【①修饰符】 数据类型 成员变量名;
}
【】表示可选
public class Person {
public static String star;//星球 成员变量,因为它有static修饰,它就是静态变量
public String name;//名称 成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
public String idCard;//身份证 成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
public String phone;//手机 成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
public String qq;//qq号 成员变量,因为它没有static修饰,它就是非静态成员变量,简称实例变量
}
成员变量的作用是描述事物的属性和数据特征。
2.2 如何使用成员变量
2.2.1 跨类使用成员变量
对象名.实例变量
类名.静态变量
虽然静态变量也可以通过 “对象.静态变量”的方式访问,但是我们更推荐“类名.静态变量”
2.2.1 本类使用成员变量
2.3 成员变量的特点
实例变量的值是每一个对象都是独立的
静态变量的值是整个类共享的,无论是哪个对象,或类修改了它,那么都是统一修改的,因为它只有1份。
成员变量有默认值
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | \u0000 编码值为0的空字符 |
boolean | false |
引用数据类型 | null |
2.4 变量的内存分析图
又上图可知:
每一个对象实例都是独立的,都有各自的内存空间,放在堆中。
一个类的静态变量是共享的,只有一份内存空间,放在方法区中。
当Person类 被类加载器加载后,就会立刻在方法区中开辟一个空间存放静态变量。如果没有给静态变量赋值,那么就会赋上默认值。
当new对象的时候,就会在堆中开辟一个空间存放对象的实例变量(一个对象一个空间)
当方法被调用入栈时,就会在栈中开辟空间,存放局部变量
Person的过程:
① 类加载器
② 给Person的静态变量在方法区中分配空间
③ 调用main方法,main方法入栈
(1)给Person.start变量赋值
(2)创建对象,p1在堆中开辟空间,存放p1的实例变量值(默认值)
(3)创建对象,p2在堆中开辟空间,存放p2的实例变量值(默认值)
(4)给p1.name p2.name赋值
注意:因为main方法比较特殊,main方法执行完毕代表程序运行完毕,此时整个JVM虚拟机也会退出。
2.4 静态变量和实例变量对比
实例变量 | 静态变量 | |
---|---|---|
跨类访问方式 | 对象名.实例变量 | 类名.静态变量 |
它的值是共享的还是独立 | 每一个对象独立的 | 整个类共享的 |
是否有默认值 | 有 | 有 |
内存位置 | 堆 | 方法区 |
2.4 引用数据类型的成员变量
总结:
所有引用数据类型的成员变量,默认值是null
如果没有给引用数据类型的成员变量赋值对应的对象,那么通过它. 成员变量等都会发生 NullPointerException(空指针异常)
3 类的成员之二:成员方法
3.1 方法的分类
根据方法的修饰符是否有static修饰,分为:
3.1.1 静态方法
总结:
本类调用:直接用
跨类调用:类名.静态方法
3.1.2 非静态方法(实例方法)
总结:
本类使用:直接使用
跨类调用:对象名.实例方法
3.2 成员方法使用本类的成员变量
总结:本类的静态方法,不能直接使用 本类的实例变量 或 实例方法。
访问方式 | 是否允许 |
---|---|
本类的静态方法 访问 本类的静态变量、静态方法 | 可以 |
本类的静态方法 访问 本类的实例变量、实例方法 | × |
本类的实例方法 访问 本类的实例变量、实例方法 | 可以 |
本类的实例方法 访问 本类的静态变量、静态方法 | 可以 |
。。。。。。。。。