JavaSE复习day2
胡家伟
7.数组
定义
数组是一种在内存中存储数据的载体,相比普通变量,同时拥有多个空间。
基本数据类型的值直接存储在变量所声明的对应的栈空间中,引用数据类型的变量声明的栈空间中存储的是堆空间中的对应值的地址。
只要是声明变量就是在栈中,只不过值不同。
int[] 不属于基本数据类型,所以属于引用数据类型,栈中存的值是栈空间的地址。
数组的数据类型
基本数据类型之外的引用类型初始值都是空(null)
- byte -> 0
- short -> 0
- int -> 0
- long -> 0
- float -> 0.0
- double -> 0.0
- char -> 0
- boolean -> false
- 引用类型:null
数组初始化的两种方式
第一种:(动态初始化,指定数组长度)给定指定的空间数,那么此时数组中元素所存储的值采取对应数组所声明的数据类型的默认值。
数据类型[] 数组名称 = new 数据类型[长度]; (推荐)
数据类型 数组名称[] = new 数据类型[长度];
int[] arr = new int[5];
int arr1[] = new int[5];
第二种:静态初始化,指定元素
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,…,元素n};
int[] arr2 = new int[]{1,2,3,4,5};
还有一种简易的静态初始化
数据类型[] 数组名称 = {元素1,元素2,…,元素n};
int[] arr3 = {1,2,3,4,5};
动态初始化和标准格式的静态初始化都可以分步完成;简化格式静态初始化,不能分成两步完成
int[] arr4;
arr4 = new int[3];//正确
arr4 = new int[]{1,2,3};//正确
arr4 = {1,2,3};//错误
数组边界
下标的合法区间:[0, length-1],如果越界就会报错
int[] arr3 = {1,2,3,4,5};
System.out.println(arr3[5]);
报错
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException(数组下标越界异常)
数组的遍历
普通For循环
int[] arr3 = {1,2,3,4,5};
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i]);
}
输出
1
2
3
4
5
For-Each循环
可以输入iter
来直接生成
int[] arr3 = {1,2,3,4,5};
for (int array:arr3) {
System.out.println(array);
}
输出
1
2
3
4
5
数组的空指针异常
有三种常见情况
情况一
int[] arr = null;
System.out.println(arr[0]);
报错
Exception in thread "main" java.lang.NullPointerException
情况二
int[][] arr = new int[4][];
System.out.println(arr[0][0]);
报错
Exception in thread "main" java.lang.NullPointerException
情况三
String[] arr = new String[]{null,"胡"};
System.out.println(arr[0].toString());
报错
Exception in thread "main" java.lang.NullPointerException
总之,数组的空指针异常主要由数组元素为空而错误地使用该元素及方法所造成。
8.类和对象
面向对象基础
面向对象和面向过程的区别
两者的主要区别在于解决问题的方式不同:
- 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行来解决问题。
- 面向对象会先抽象出对象,然后用对象执行方法的方式来解决问题。
创建一个对象用什么运算符?对象实体与对象引用有何不同?
new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
一个对象引用可以指向0个或1个对象,但一个对象可以有n个引用指向它。
对象的相等和引用相等的区别
- 对象的相等一般比较的是内存中存放的内容是否相等。
- 引用相等一般比较的是他们指向的内存地址是否相等
类和对象的概念
类:把具有相同属性和行为的一类对象抽象为类。类是抽象概念,如人类、犬类等,无法具体到每个实体。
对象:某个类的一个实体,当有了对象后,这些属性便有了属性值,行为也就有了相应的意义。
类是描述某一对象的统称,对象是这个类的一个实例而已。有类之后就能根据这个类来产生具体的对象。一类对象所具备的共同属性和行为(方法)都在类中定义。
类与对象的定义与使用
创建类的语法
class 类名称 {
成员变量/ 实例变量;
成员方法;
}
public class Person {
int age;
float height;
float weight;
String name;
String sex;
public Person() {
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", height=" + height +
", weight=" + weight +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
创建具体的对象
类名称 引用名称 = new 类名称()
Person person=new Person();
person.name = "胡家伟";
System.out.println(person);
输出
Person{age=0, height=0.0, weight=0.0, name='胡家伟', sex='null'}
类与对象的内存分配
创建Person类的对象的内存分配图解
Person person=new Person();
对象引用中存储对象实例在堆内存中的地址。
创建Person类的数组对象的内存分配图解
Person[] people = new Person[5];
类与对象的空指针异常
对象引用为null时,操作实例的任何属性或者方法都会报错。
Person person=null;
person.name = "胡家伟";//属性
输出
Exception in thread "main" java.lang.NullPointerException
Person person = null;
System.out.println(person.toString());//方法
输出
Exception in thread "main" java.lang.NullPointerException
创建数组对象时,没有对其中的对象进行初始化,而操作对象的任何属性或者方法都会报错。
Person[] people = new Person[3];
System.out.println(people[2].name);
输出
Exception in thread "main" java.lang.NullPointerException
9.方法
概述
如果你已经理解了类存在的作用,那么例如人这个类来说,人有一些特征,这些特征我们放在程序中可以定义为各种成员变量(字段)。可是人还有很多对于外界交互的方式,例如打球,吃饭,喝水,说话等等。这些内容我们称之为行为;如果将这些行为定义到程序中,我们称之为“方法”。
方法的定义组成
方法只能作为类的一部分来定义,定义一个方法需要如下的5个组成部分。
访问修饰符
限定当前方法可以在哪个范围内使用,访问修饰符对于类、字段、方法的约束范围是完全相同的。
返回值类型
当一个方法需要在执行之后返回一个结果给调用者,那么就需要定义返回值类型,返回值类型可以使Java中的任何数据类型(基本数据类型、引用数据类型),一个方法只能有一个返回值,如果不需要返回值可以使用void
。
当前类中 | 当前包中 | 非当前包中的子类 | 非当前包中的非子类 | |
---|---|---|---|---|
private | ☆ | |||
protected | ☆ | ☆ | ☆ | |
public | ☆ | ☆ | ☆ | ☆ |
方法名称
方法名称属于标识符的一种,使用驼峰命名法。
参数列表
方法需要使用的字段,参数列表可以添加多个,也使用驼峰命名法。
方法体
方法体实质上是一个代码块。
方法体中return 的作用
1.其后代码不再执行,返回调用位置。
2.携带返回值。
public void test(String name){
name = "胡家伟";
System.out.println(name);
}
输出
胡家伟
方法的特点
- 定义方法可以将功能代码进行封装。
- 便于该功能进行复用。
- 方法只有被调用了才会执行。
- 方法的出现提高了代码的复用性。
- 方法若没有返回值,则用关键字“void”表示,那么该方法中return语句如果在最后一行,是可以省略不写的。
- 方法中可以继续调用方法,不可以在方法内部定义方法。
- 定义方法时,方法的结果应返回给调用者,交由调用者。
this关键字的用法
this.data(访问属性)
this.func()(访问方法)
this()(调用本类中其他构造方法)
public Person(String name) {
this.name = name;
System.out.println("这是有参构造");
}
public Person() {
this("胡家伟");
System.out.println("这是无参构造");
}
public static void main(String[] args) {
System.out.println(new Person());
}
输出
这是有参构造
这是无参构造
Person{age=0, height=0.0, weight=0.0, name='胡家伟', sex='null'}
注意:
1.this只能在构造方法中调用其他构造方法
2.this要放在第一行
3.一个构造方法中只能调用一个构造方法
return this(返回类的引用)
public Person test(){
this.name = "胡家伟";
System.out.println(this.name);
return this;
}
public static void main(String[] args) {
System.out.println(new Person().test());
}
输出
胡家伟
Person{age=0, height=0.0, weight=0.0, name='胡家伟', sex='null'}
上面return this
就代表了return person
方法帧
方法帧是一个方法在执行的过程中在栈内存中单独生成的临时的空间,用于存储方法中声明的局部变量的值。方法帧随着方法开始执行时产生,在方法执行结束时立即回收。
方法重载
在同一个类中方法名相同但参数列表不同的方法之间的关系。
-
多个方法在同一个类中
-
多个方法具有相同的方法名
-
多个方法的参数列表不同(参数类型不同、个数不同、顺序不同)
可以实现方法重载是因为方法签名不同(方法名称+参数列表中每个参数的数据类型)
public int calculate(int a, int b, int c){
return a + b + c;
}
public double calculate(int a, double b){
return a + b;
}
public double calculate(double a, int b){
return a + b;
}
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.calculate(1, 2, 3));
System.out.println(person.calculate(2.1, 1));
System.out.println(person.calculate(1, 2.1));
}
输出
6
3.1
3.1
构造方法
构造方法也属于方法的一种。其唯一的作用和用途就是初始化一个对象。
定义方法
class 类名称
{
访问权限 类名称(类型1 参数1,类型2 参数2,…)//构造方法
{
程序语句;
…//构造方法没有返回值
}
}
public Person(int age, float height, float weight, String name, String sex) {
this.age = age;
this.height = height;
this.weight = weight;
this.name = name;
this.sex = sex;
}
如果自己没有对一个类定义构造方法时,编译器会默认生成一个无参构造方法,当我们定义了构造方法时不会自动生成无参构造方法,所以在定义有参构造方法时记得定义一个无参构造方法。
使用注意
- 构造方法的名称和其所属的类名必须要完全保持一致。
- 构造方法不需要且根本不能定义返回值类型,即便是
void
。 - 构造方法可以像普通方法一样,形成方法重载。
- 构造方法不可以被
static
、final
关键字修饰。 - 构造方法是不能被继承的,如果在子类中想要调用父类的构造方法需要使用
super
关键字。 - 构造方法,只能在实例化的时候调用。
构造方法的调用
构造方法有两种调用方式:
一个是在对象实例化时调用
Person person = new Person();
另一个是通过构造方法调用构造方法
public Person(String name) {
this.name = name;
}
public Person() {
this("胡家伟");
}
构造方法的私有化
构造方法可以设置为private
,使得该类无法被实例化。
封装
封装的实现方法
字段私有化
private int age;
private float height;
private float weight;
private String name;
private String sex;
给字段提供对外的公开访问方式
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public float getWeight() {
return weight;
}
public void setWeight(float weight) {
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
Java中参数的传递是值传递还是引用传递
1.在Java中只有值传递,根本不存在引用传递。
2.对于基本数据类型的参数,传递的是实际值。
3.对于引用类型的参数,传递的也是值,但是值本身是地址。
标签:复习,构造方法,int,day2,Person,JavaSE,方法,public,name From: https://www.cnblogs.com/chiawei/p/16961925.html