JAVA初学者第六天笔记

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);
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值