jvm内存划分
虚拟机内存划分
因为Java代码执行在虚拟机上面,虚拟机是由一定内存的,并且相对于代码的占比来说是一个很大的空间,所以很有必要将虚拟机的内存进行一个区域的划分,让不同的区域去存放不同的内容(每个区域都有自己特有的功能,在程序执行的过程中,需要什么样的功能就使用对应的区域去完成)
虚拟机内存的具体划分
① 栈内存:用来执行方法的区域
② 堆内存:用来存放数组、对象等较大类型的数据
③ 方法区:用来加载字节码文件,或者还可以储存静态的变量,字符串常量池
④ 程序计数器:通过线程控制指针决定下一步该执行什么内容(系统自动完成)
⑤ 本地方法区:调用C语言所写的程序来维持虚拟机正常运行
数组的内存理解
public class Demo{
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);// 输出的是arr所指地址
System.out.println(arr[0]);
arr[1] = 3;
System.out.println(arr[1]);
}
}
两个数组的内存理解
public class Demo {
public static void main(String[] args) {
int[] arr = new int[3];
int[] arr1 = new int[3];
arr[1] = 10;
System.out.println(arr1[1]);// 0
}
}
面向对象
面向过程编程思想
① 每一步都需要自己去设计去完成,不管步骤的难易程度;C语言就是面向过程的语言;像声明内存,释放内存等等都需要自己手动的完成
② 比如,将大象装进冰箱怎么做
a. 造大象(难)
b. 造冰箱(难)
c. 打开冰箱(简单)
d. 把大象塞进冰箱去(难)
e. 把冰箱关掉(简单)
面向对象编程思想
① 将复杂的步骤交个对象来处理,我们只需要找到能够帮助我们解决问题的对象即可
② 比如,将大象装进冰箱怎么做
a. 找大象(自己分解)
b. 找冰箱(自己开门、自己关门)
c. 告诉大象,自己进去
面向对象和面向过程的区别
① 面向过程相当于编程人员作为执行者,每一步都需亲力亲为,面向对象相当于指挥者,只需发号施令即可
② 面向对象是基于面向过程的,是密不可分
③ 面向对象更符合人类的一个行为习惯,遇到问题找对象、找工具来完成
类
① 概念:是一种对事物的属性和行为进行抽象的概念,将现实当初存在事物进行抽象的描述
② 在 java 中使用 class 关键字来进行类的声明
③ 在类中通常包含2部分,一个叫属性(成员变量)、一个叫行为(成员方法)
属性:
成员变量,就跟以前定义变量的方式一样,只不过现在可以不用赋值,会有默认值以前的变量定义在方法的内部(局部变量),现在需要定义在类中,方法外。
行为:
还是跟以前定义方法的格式一样,只不过需要将 static 给省略掉定义在类中、方法外
案例:定义个Person 类,有属性(年龄、性别),有行为(学习、玩游戏)
public class Person {
// 成员变量
int age;
String sex;
// 成员方法
public void study(){
}
public void play_game(){
}
}
对象
① 概念:真实存在的某个具体的事物,对象拥有这一类事物具有的共有特性和行为
② 对象的创建:
a. 匿名对象(只能使用一次,每一次使用的匿名对象都是一个全新的对象):new 类名();
b. 实例化对象:类名 对象名 = new 类名();
③ 内存分析实例化对象和匿名对象
public static void main(String[] args) {
Person p1 = new Person();
p1.age = 20;
System.out.println(p1.age); // 20
new Person().age = 18;
System.out.println(new Person().age); // 18
}
类与对象的关系
类是对象的模板,对象是类的实例
成员变量的使用
① 访问成员变量的格式:
对象.属性
② 修改成员变量的格式:
对象.属性 = 值
成员方法的使用
① 访问成员方法的格式:
对象.方法名(参数列表);
成员变量和局部变量的区别
① 定义的位置不同成员变量:
定义在类中方法外
局部变量:方法的内部
② 作用域不一样
成员变量:属于对象,有对象的地方就可以访问
局部变量:只能在方法中使用,除了该方法就无法访问
③ 内存地址不同
成员变量:属于对象,对象储存于堆内存,所以成员边储存于堆内存
局部变量:通常是存于栈内存
④ 默认值不一样
成员变量:声明时,可以不用赋值,会有当前类型的默认值
局部变量:声明时必须赋值,否则无法使用
练习:定义一个类 SuperMan,具有属性(姓名、性别、年龄),具有行为(飞行、打架、看电视)
创建测试类 Test,在测试类 main 中创建SuperMan的对象,通过对象进行属性的赋值(超人、女、200),再使用对象去访问各个行为
public class SuperMan { String name;
String sex;
int age;
public void fly(){
System.out.println("使劲飞");
}
public void fight(){
System.out.println("使劲打");
}
public void watchTV(){
System.out.println("奥特曼打小怪兽");
}
}
public class Test01 {
public static void main(String[] args) {
SuperMan sm = new SuperMan();
System.out.println(sm.age);
System.out.println(sm.name);
System.out.println(sm.sex);
sm.age = 200; sm.name = "超人";
sm.sex = "女";
System.out.println(sm.age);
System.out.println(sm.name);
System.out.println(sm.sex);
sm.fly(); sm.fight();
sm.watchTV();
}
}
面向对象的三大特征
封装
隐藏核心代码,不让外界直接访问,但是需要给外界制定一个访问的规则使用 private 关键词进行属性的封装,使用 public 修饰词来公开方法
继承
先进行事物共有的特性和行为的抽取,定义成一个父类(超累、基类);往后需要在程序设计中需要这些抽取出来的属性或者行为,就可以使用 extends 关键字来继承父类从来获取父类中定义的非私有化的内容
多态
① 同一个事物它可能具有多个不同的形态,当形态不同的时候它的功能也可能不一样
② 多态的分类
a. 对象的多态:同一个对象,在不同的情景下所具备的功能不一样(应用不一样)
b. 行为的多态:可以是同一个对象也可以是同类型不同的对象,具有相同的功能,但是功能的效果不同
封装的概念
隐藏核心代码的实现过程,公开访问规则
封装的原则
① 使用 private 关键字进行属性的修饰(隐藏属性)
② 将访问(获取和修改)属性的方式封装到方法的里面,并且将方法进行公开(公开访问方法)
封装的好处
① 将核心的代码保护起来,提高代码的安全性
② 可以更好的帮助编程人员进行程序的设计
封装的步骤
① 私有化所有的属性(将属性全部用 private 来修饰)
② 设计访问私有化属性的方法,并且将该方法的权限设置为 public;(供外界访问)
getXX:通过调用该方法可以访问XX属性的值
setXX:通过调用该方法,传入指定类型的参数,对属性值进行修改
③ 创建该类的构造方法,正常情况会创建2个构造方法,一个是空参构造,一个含有属性的有参构造(方法重载)
构造方法的定义格式:
访问修饰词 类名(参数列表){
如果有参数列表,在构造方法内部通常就是将参数列表中的参数用来对属性进行赋值(属性的初始化)
如果没有参数列表,构造方法的内部通常没有代码
}
注意:
a. 构造方法没有返回值类型,连 void 都不能写
b. 构造方法的方法名,必须跟类名一模一样
c. 构造方法内部在第一行会默认的调用父类的构造方法
d. 构造方法中允许有 retrun 语句,建议不要写
如果使用空参构造创建对象,那么创建出来的对象的属性保持这个类的初始属性值
如果使用有参构造创建对象,那么创建出来的对象的属性就是有参构造传入的参数值
④ 创建 toString 方法,是将对象的属性拼接成字符串的形式。当需要查看对象中的属性值的时候就可以知道调用toString 方法进行属性值的显示
案例:将 Girl 类(属性:性别,年龄,电话号码)进行封装
public class Girl {
private String name = "小红";
private int age = 18;
private String phone = "13814389438";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Girl(){
}
public Girl(String name,String phone,int age){
this.name = name;
this.phone = phone;
this.age = age;
}
@Override
public String toString() {
return "Girl{" + "name='" + name + '\'' + ", age=" +
age + ", phone='" + phone + '\'' + '}';
}
}
public class Test01 {
public static void main(String[] args) {
Boy boy = new Boy();
Girl girl = new Girl();
System.out.println(girl);
System.out.println("-----------------------------------");
Girl girl1 = new Girl("小宝贝", "13636363336", 20);
System.out.println(girl1);
}
}