学习内容
1.面向对象与面向过程
面向过程:
根据需求,分析解决该需求所需要的步骤,利用函数(方法)将这些步骤一一实现,使用时在进行依次调用。
面向对象:
把需求分解成一个个的功能,利用函数(方法)将这些功能一一实现,使用时调用功能。
在面向对象的思维中,不考虑每个功能具体需要哪些步骤、是怎么实现的,简单来说就是你办事我放心。
例:
如何把大象装入冰箱?
面向对象:1.打开冰箱门(方法)2.把大象装进冰箱(功能)3.关闭冰箱门(功能)
整个过程需要三个方法:打开,装载,关闭,一个对象:大象。
2.对象内存图解
class Car{ String color; int wheels;
public void run(){
System.out.print(color+":"+wheels);
}
}
class TestCar{ public static void main(String[] args){ Car w = new Car(); w.color = "red"; w.wheels = 4; w.run(); } }
3.类与对象
类指的是对某一类对象的抽象解释,例如动物、人类,而对象则是类具体化的体现,例如猫、中国人,创造对象的过程就是实例化类。
class Human{ String country; int age; public static void main(String[] args){ Human chinese = new Human(); chinese.country = "中国"; chinese.age = 20; } }
4.基本类型与引用类型传参
基本类型:
a的值被复制一份传入方法change,方法内改变a的值,只在方法内生效,方法执行完毕,弹栈,主方法内的a不改变。
class Test{ public static void change(int a){ a = 10; } public static void main(String[] args){ int a = 5; change(a); System.out.print(a); } }
引用类型:
引用类型传参是把其物理地址传入方法,此时会有两个引用指向该物理地址,即主方法里的参数a,change方法内的形参a,此时方法内改变a[0],
则直接会对堆内的数据进行改变,所以主方法内的a[0]也随之改变。
class Test{ public static void change(int[] a){ a[0] = 10; } public static void main(String[] args){ int[] a = {5,15,20}; change(a); System.out.print(a[0]); } }
5.成员变量与局部变量
区别一:定义的位置不同
定义在类体中、方法外的变量是成员变量
定义在方法中或者{}语句(代码块)里面的变量是局部变量
区别二:在内存中的位置不同
成员变量存储在对内存的对象中
局部变量存储在栈内存的方法中
区别三:生命周期不同
成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失
对象被实例化,成员变量(除静态变量外,静态变量不论有没有实例化对象都会被初始化)就会被初始化!
局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失
区别四:初始化不同
成员变量因为在堆内存中,有默认的初始化值,可直接使用其默认值。
局部变量在栈内存中,没有默认的初始化值,必须手动的给其赋值才可以使用。
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。)
堆:存放所有new出来的对象。
静态域:存放静态成员(static定义的)
常量池:存放字符串常量和基本类型常量(public static final)。