Java基础(二)

Java内存

Java的内存需要划分为五个部分:

1、栈(stack)

存放的都是方法中的局部变量。
局部变量:方法的参数,或者方法{}内部的变量
作用域:一旦超出作用域,立刻从栈当中消失

2、堆(heap)

凡是new出来的东西,都在堆当中。
堆内存里边的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值

3、方法区(method area)

存储.class相关信息,包含方法的信息。

4、本地方法栈(native method stack)

与操作系统有关

5、寄存器(pc register)

与cpu相关

异常

常见问题

数组索引越界异常(ArrayIndexOutOfBounds):索引编号并不存在

空指针异常

所有的引用类型变量,都可以赋值为一个null值,但是代表其中什么都没有。
数组必须进行new初始化才能使用其中元素。
如果赋值了一个null,没有进行new创建,那么将会产生空指针异常(NullPointerException)
原因,没new;解决方案,补上new

类和对象

基本的概念

面向过程

当实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。

面向对象

当实现一个功能的时候,不关心具体步骤,而是找一个已经具有该功能的人,来帮我做这件事。

面向对象的特征

封装、继承、多态、抽象。

一些术语

类:是一组相关属性和新歌日的集合,可以堪称是一类事物的模版,使用事物的属性特征和行为来描述该类事物。
现实中,描述一类事物:
属性:就是该事物的状态信息。
行为:就是该事物能做什么
对象:是一类事物的具体体现,对象是类的一个实例,必然具备该事物的属性和行为。

类与对象的关系

类是对一类事物的描述,是抽象的
对象是一类事物的实例,是具体的
类是对象的模版,对象是类的实体。

类的定义

以“学生”为例
属性:姓名,年龄
行为:吃饭,睡觉,学习
对应到Java的类中,成员变量——>属性;成员方法——>行为。
类的定义格式

public class Student{
	String name;
	int age;
	public void eat(){}
	public void sleep(){}
	public void study(){}
}

注意事项:

  1. 成员变量是直接定义在类当中的,在方法外边。
  2. 成员方法不要写static关键字。

创建对象的过程

通常情况下,一个类并不能直接使用,需根据类创建一个对象,才能使用

  1. 导包,也就是指出需要使用的类,在什么位置
    import 包名称.类名称;
    对于和当前类同一个包的情况,可以省略导包语句不写。
  2. 创建格式
    类名称 对象名 = new 类名称();
    Student stu = new Student();
  3. 使用分为两种情况
    使用成员变量:对象名.成员变量名
    使用成员方法:对象名.成员方法名(参数)
    (也就是,想用谁,就用对象名点谁)

注意事项:

如果成员变量没有赋值,那么将会有一个默认值,规则和数组一样

改变对象当中的成员变量数值,直接采用赋值的方法。
例如:stu.name = hhd;

方法运行时的内存分配

  1. 程序运行时,方法区要最先有数据

  2. 运行时,

  • main方法进入栈空间,
  • new一个对象存放在堆中
  1. 堆中的成员方法是一个地址值,指向方法区中存放的方法

调用方法进入栈中,使用完成后出栈,main方法第一个调用,最后一个出栈

两个对象调用同一个方法同理(new两个对象)
new一个对象的情况,与数组赋值类型,两个对象名指向同一个对象空间
例如:
Phone one = new Phone();
phone two = one;

  1. 使用对象类型作为参数
    对象类型(类)可以作为方法的参数传递,本质上还是传递地址。(与数组、对象、类作为参数类似)
    方法可以使用任何类型作为参数。

  2. 使用对象类型作为方法返回值,返回值其实就是对象的地址值

总结:

局部变量和成员变量

  1. 定义的位置不一样【重点】
    局部变量,在方法的内部
    成员变量,在方法的外部,直接写在类当中
  2. 作用范围不一样【重点】
    局部变量,只有方法当中才能使用,出了方法不能使用
    成员变量,整个类可以使用
  3. 默认值不一样【重点】
    局部变量,没有默认值,如果想要使用,必须手动进行赋值,否则无法使用
    成员变量,如果没有赋值,会有默认值,规则和数组一样
    参数也是局部变量,但是方法被调用,参数必然被赋值,所以可以使用。
  4. 内存位置不一样(了解)
    局部变量,位于栈内
    成员变量,位于堆内
  5. 生命周期不一样(了解)
    局部变量,随着方法进栈而诞生,随着方法出栈而消失
    成员变量,随着对此昂创建而诞生,随着对对象垃圾回收消失

面向对象三大特征之封装性

封装性在Java中的体现

  1. 方法就是一种封装
  2. 关键字private也是一种封装

什么是封装

封装就是将一些细节信息隐藏起来,对于外界不可见。

private关键字及其作用

  • 问题描述,定义Person的年龄是,无法阻止不合理的数值呗设置进来。
  • 解决方案,用private关键字将需要被保护的成员变量进行修饰。

一旦使用了private关键字进行修饰,那么在本类当中仍然可以随意访问。但是!超出了本类的范围之外就不能直接访问了。

间接访问

间接访问成员变量,就是定义一对getter/setter方法。
private int age;
//这个成员方法专门用于向age设置数据
public void setAge(int num){
age = num;
}
//这个成员方法专门用于获取age的数据
public int getAge(){
return age;
}

注意事项:

必须叫setXxx或者是getXxx的命名规则。
对于getter来说,不能有参数,返回值类型和成员变量对应;
对于setter来说,不能有返回值,参数类型和成员变量对应。

对于基本类型中的boolean值getter方法要写成isXxx

this关键字的作用

当方法的局部变量和方法的成员变量重名时,根据就近原则,优先使用局部变量。
如果需要访问本类当中的成员变量,需要使用格式:this.成员变量名
“通过谁调用的方法,谁就是this”,主要用于解决重名的问题

构造方法

构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象是,其实就是在调用构造方法。
格式:
public 类名称(参数类型 参数名称){
方法体;
}

注意事项:

  1. 构造方法的名称必须和所在的类的名称完全一样,就连大小写也要一样。
  2. 构造方法不要写返回值类型,连void也不写。
  3. 构造方法不能return一个具体的返回值。
  4. 如果没有编写任何构造方法,那么编译器会默认创建一个构造方法,没有参数和方法体,什么事情都不做。public Student(){}
  5. 一旦编写了至少一个构造方法,那么编译器将不再自动创建。
  6. 构造方法也是可以进行重载的

一个标准的类

一个类的四个组成部分:

  1. 成员变量
  2. 无参构造方法
  3. 全参构造方法
  4. Getter/Setter方法
注意:
  1. 所有的成员变量都要使用private关键字修饰
  2. 为每一个成员便利那个编写一对Getter/Setter方法

常用的API(Application Programming Interface)应用程序编程接口。

Scanner类

Scanner类的功能:可以实现键盘输入数据到程序中

引用类型的一般使用步骤
1、导包
import 包路径.类名称;
如果需要使用的目标类,和当前类位于同一个包下,则可以省略导包语句不写。
只有java.lang包下的内容不需要导包,其他的包搜需要import语句。
2、创建
类名称 对象名 = new 类名称();
3、使用
对象名.成员方法名()

import java.util.Scanner;
//括号内固定写法
Scanner sc = new Scanner(System.in);
//从键盘获取一个int数字
int num = sc.nextInt();
//获取字符串
String str = sc.next();

Random类

Random类用来生成随机数字
1、导包
import java.util.Random;
2、创建
类名称 对象名 = new 类名称();
Random r = new Random();//小括号留空即可
3、使用
对象名.成员方法名()
获取一个随机的int数字(小括号留空,范围是int所有范围,有正负两种):int num = r.nextInt();
获取一个随机的int数字(参数代表了范围,左闭右开区间):int num = r.nextInt(3);实际上代表的含义是[0,3),也就是0~2。

匿名对象

正常格式:类名称 对象名 = new 类名称();

匿名对象只有右边的对象,没有左边的的名字和复制运算符。
new 类名称();

注意事项:匿名对象只能使用唯一的一次,下次再使用不得不创建一个新的对象。
使用建议:如果确定一个对象只需要使用一次,就可以使用匿名对象。

对象数组

题目,定义一个数组,用来存储3个person对象

数组有个缺点,一旦创建,程序运行期间长度不可以发生改变
代码:

Person[] array = new Person[3];
Person one = new Person("dilireb","18");
array[0] = one;
System.out.println(array[1].getName); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值