目录
面向对象与面向过程区别
面向过程:C语言,具体的功能.最小动作是函数
面向对象: java.具有功能的对象.最小动作是方法
1.类与对象的关系
类:是对一类事物的具体描述、是抽象的。概念上的定义
对象:是该类事物的每个个体。称为实例
两者的关系,对象是类new出来的
2.面向对象的规则
1.创建类、设计类的成员。
2.创建类的对象。
3.给对象的属性和结构进行赋值操作、使得对象有意义
4.对象的创建与对象内存解析
Person p1 = new Person();
Person s2;
s2 = p1;
Person p2 = new Person();
引用类型 变量名 = new 引用类型();
//左边对象的引用 // 右边就是对象
对象的引用:右边new操作表示从堆空间中new出来一个对象,左边在栈空间创建一个引用变量指向对象的地址。一个对象引用可以指向一个对象。多个对象引用也可以指向一个对象。它们的引用地址一样。
5.JVM内存图
编译完源程序以后,生成一个或多个字节码文件。我们使用JVM中的类的加载器和解释器对生成的字节码文件进行解释运行。意味着,需要将字节码文件对应的类加载到内存中,涉及到内存解析。
虚拟机栈:即为平时提到的栈结构。我们将局部变量存储在栈结构中
虚拟机堆:我们将new出来的结构(比如:数组、对象)加载在堆空间中。
补充:对象的属性(非static的)加载在堆空间中。
方法区:类的加载信息、常量池、静态域
6.匿名对象
匿名对象就是没有把对象的地址值赋给变量、显示的调用。
特点:匿名对象只能调用一次
public class Test{
public static void main(String[] args){
new Person().Say();
new Person().age = 10;
new Person().name = "刘星";
}
}
class Person{
int age;
String name;
publci void Say(){
System.out.println("hello world");
}
}
7.万事万物皆对象
在Java语言范畴中,我们都将功能、结构等封装到类中,通过类的实例化,来调用具体的功能结构
- Scanner,String等
- 文件:File
- 网络资源:URL
涉及到Java语言与前端HTML、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类、对象。
类的结构之一:变量
1.成员变量 VS 局部变量(非static)
1.1 相同点:定义变量的格式相同
数据类型 变量名 = 变量值;
先声明、后使用、变量都在对应的作用域中
1.2 不同点:
1.2.1 在类中声明的位置是不一样的
- 成员变量在类的内部{ };
- 局部变量在方法中、构造方法中、以及方法和构造方法的形参列表中、代码块内。
1.2.2 作用的范围不一样
- 成员变量在类里面是灵活的。可以在被方法直接调用。
- 局部变量只能在方法中、构造方法中、代码块中别调用。作用范围是比较小的
1.2.3 默认初始化值
成员变量有默认初始化值
- 整型 byte short int long : 0
- 浮点型 float double :0.0
- 字符型 char: 0 或者“u\0000”
- 布尔型 boolean: false
- 引用变量类型 数组、接口、类:null
- 局部变量:没有默认初始值
意味着,我们在调用局部变量之前,一定要显示赋值。特别地,形参在调用时,我们赋值即可
1.2.4 内存加载不一样
- 局部变量加载到栈内存
- 成员变量加载到堆内存
1.2.5 权限修饰符不一样
- 成员变量:可以使用权限修饰符(public 缺省 protected private) 修饰 (为了体现封装性)
- 局部变量:不可以使用权限修饰符
2.变量的分类
2.1.类中声明的位置分类
2.2 基本数据类型分类
类的结构之二:方法
1.方法的定义
- 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中 也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码
- Java里的方法不能独立存在,所有的方法必须定义在类里。
2.方法的书写规则
权限修饰符 返回值类型 方法名(形参列表){
方法体
}
3.方法的注意事项
3.1 权限修饰符
- 方法可以使用private 缺省 public protected 作为方法的修饰符
3.2 方法的返回值类型
如果方法的返回值类型是void,则不需要返回具体的数或对象,可以没有return关键字,如果有return关键字的话,也仅仅代表着方法的结束。
如果方法的返回值类型不是void,则需要返回具体的数或者对象,必须要有return关键字返回具体类型的常量或变量。return 数据。
3.3 方法的限制
方法被调用一次,就会执行一次。
定义方法时,方法的结果应该返回给调用者,交由调用者处理。
方法中只能调用方法或属性,不可以在方法内部定义方法。
4.方法的重载
重载的定义:在同一个类中允许存在一个以上的同名方法,必须方法名相同,形参列表不同。
两同一不同 :同一个类,同一个类名,形参列表不相同。与权限修饰符、返回值类型没有任何关系。判断重载时,牢记两同一不同。
public int sum(int x, int y){
return x + y;
}
public double sum(int x,double y){
return x + y;
}
public double sum(int x, long y){
return x + y;
}
5.方法中的形参个数
方法中的形参个数根据自己的方法需要,进行设计。可以为0个,也可以为多个。具体情况,具体分析。
方法中的可变形参:JDK5.0以前,多个同类型的参数一起传入是用数组的形式。JDK5.0以后,采用可变个数形参往里传入值。
注意事项
1. 声明格式:方法名(参数的类型名 ...参数名)
2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
3. 可变个数形参的方法与同名的方法之间,彼此构成重载
4. 可变参数方法的使用与方法参数部分使用数组是一致的
5. 方法的参数部分有可变形参,需要放在形参声明的最后
6. 在一个方法的形参位置,最多只能声明一个可变个数形参
public void show(int i){
}
public void show(String s){
System.out.println("show(String)");
}
public void show(String ... strs){
System.out.println("show(String ... strs)");
for(int i = 0;i < strs.length;i++){
System.out.println(strs[i]);
}
}
// 不能与上一个方法同时存在
// public void show(String[] strs){
//
// }
// 调用时:可变形参与数组类似
test.show("hello");
test.show("hello","world");
test.show();
test.show(new String[]{"AA","BB","CC"});
6.值传递机制
- 形参:方法声明时的参数
- 实参:方法调用时实际传给形参的参数值
Java的实参值如何传入方法呢? Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本 (复制品)传入方法内,而参数本身不受影响。
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形
- 基本数据类型传递的是数值
- 引用数据类型传递的是地址值
System.out.println("***********基本数据类型:****************");
int m = 10;
int n = m;
System.out.println("m = " + m + ", n = " + n);
n = 20;
System.out.println("m = " + m + ", n = " + n);
System.out.println("***********引用数据类型:****************");
Order o1 = new Order();
o1.orderId = 1001;
Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向了堆空间中同一个对象实体。
System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
o2.orderId = 1002;
System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
类的结构之三:构造方法
1.构造方法的作用:(只要造对象就得用构造方法)
- 创建对象
- 初始化对象的信息
2.构造方法使用说明
- 如果没有显示的定义一个带参的构造方法,系统会默认造一个无参的构造方法。
- 如果一旦定义了一个带参的构造方法。系统不会创建无参的构造方法。假设创建对象时,没有初始化对象的信息,就会报错。
- 创建格式 返回值类型 类名(形参列表){ 方法体 }
- 一个类中如果定义多个构造器,则构成构造器的重载。构造方法名相同,形参列表不同。
//构造器不等于方法
public Person(){
System.out.println("Person().....");
}
public Person(String n){
name = n;
}
public Person(String n,int a){
name = n;
age = a;
}