面向对象-面向过程
弊端不能知道是哪个主体干了些什么事情
static void buy() {
System.out.println("拿钱买菜");
}
static void doFood() {
System.out.println("做饭");
}
public static void main(String[] args) {
buy();
doFood();
}
面向对象思想
面向对象的目的:
1.将复杂的事情简单化
2.面向对象将以前的过程中的执行者变成了指挥官
3.面向对象这种思想是符合现在人们思考习惯的一种思想
面向对象的三大特性
封装/继承/多态
类
把具有相同"特性"和"行为"的多个对象的抽象就是类.
找多个对象共同的状态和行为
用来描述事物
具体 某个事物
如下面每一个狗都是一个对象,它们都是狗类
对象和类的区别,对象是具体到一个人,类是人的集群
类的实例化(描述一个人)
把类具体到某一个对象上面,该对象有具体的什么状态特征和什么行为
对象的一些状态特征
用 成员变量
来表示
对象的行为
用 方法表示
类的创建通常是开一个文件
类的实例化
对象的创建
在程序中,必须先有类,再有对象(先得有模板,再有根据模板制造出来的个体)
创建对象: 类 对象名 = new 类名()
Person zz = new Person();
赋值:描述状态具体的值(定义类时是什么类型,赋值是要赋值什么类型)
赋值:对象.变量名=值
zz.age = 18;
zz.name = "我猪";
zz.height = 1.65;
取值:变量=对象名.变量名
String name= zz.name;
System.out.println(name);
对象调用方法:对象名.方法名([实参])
zz.sing("每一明天也是你");
JVM的内存划分
JVM将内存主要划分为:方法区 栈 本地方法栈 堆 程序计数器
方法区存:
又叫静态区,存放所有的class和static变量;方法分区中包含的都是在程序中永远的唯一元素
虚拟机栈:
执行引擎每调用一个函数是,就为这个函数创建一个栈帧,并加入虚拟机栈.换个角度理解,每个函数从调用到执行结束,其实是对应一个栈帧的入栈和出栈
本地方法区:
本地方法栈与虚拟机栈所发挥的作用很相似,他们的区别在于虚拟机栈为Java代码方法服务,而本地方法栈是为Native方法服务
堆:
被所有线程共享的一块区域,在虚拟机启动是创建,所有的对象实例及数组都在堆上分配(使用new关键字,表示在堆中开辟一块新的存储空间)
程序计数器:
每个线程的有个计数器几率当前执行到哪个指令.可以把它看成是当前限仓呢过所执行的字节码的行号指示器.
栈
是一种数据结构
特点:先进后出(FILO)
例如:先穿袜子再穿鞋子,先脱鞋子再脱袜子
入栈:把元素放到栈里
栈顶:栈中的第一个元素
栈底:栈中的最后一个元素
出栈:把元素从栈中移除
static void sum(int a, int b) {
System.out.println(a + b);
}
public static void main(String[] args) {
int x = 10;//main方法率先入栈
sum(10,20);//sum方法进栈
}
sum方法先出栈,main方法后出栈
执行完一个方法,它的栈帧就会出栈
堆的数组初始化与GC
1.int[] ages 声明了一个int类型的数组ages
2.new int[] {10,20,30,40}; 在堆当中初始化数组
3.把初始化的地址赋值给了ages
int[] ages=new int[] {10,20,30};
System.out.println(ages);//[I@7852e922 打印出来的是一个内存地址
4.在堆中初始化了一个新的数组,把数组的地址重新赋值给了ages
ages=new int[] {40,50,60};
GC:垃圾回收机制
Java是自动回收机制:
程序员不需要再动手控制内存的释放
当JVM发现内存资源紧张的时候,会自动的清理无用的对象
对象堆的内存分析
NullPointerException 报错,空指针
基本数据类型在堆中的初始值
基本数据类型在栈里面不初始化是不能使用的
基本数据类型与引用数据类型
引用数据类型,在栈中存放的是一个堆中地址,地址像一条指针一样指向堆中的详细信息
堆中存放的是详细信息
基本数据类型:值传递
基本数据类型它是属于值传递(传递 的是一个具体值)
(函数/方法中的数据)直接存放在栈中
引用数据类型地址传递
// 功能:交换一个数组的第一个元素和第二个元素
static void swap(int[] nums) {
// 1.把数组的第0个位置取出来,放到一个临时的变量当中 10
int temp = nums[0];
// 2.把第1个位置的值取出来,赋值给第0个位置
nums[0] = nums[1];
// 3.把临时变量的值赋值给第1个位置
nums[1] = temp;
System.out.println("nums={"+nums[0]+","+nums[1]+"};");
}
public static void main(String[] args) {
// {10,20} {20,10}
int[] nums = new int[] { 10, 20 };
swap(nums);
}