首页 > 编程语言 >JavaSE复习day2

JavaSE复习day2

时间:2022-12-07 01:11:09浏览次数:49  
标签:复习 构造方法 int day2 Person JavaSE 方法 public name

JavaSE复习day2

胡家伟

7.数组

定义

数组是一种在内存中存储数据的载体,相比普通变量,同时拥有多个空间。

image-20221206143457854

基本数据类型的值直接存储在变量所声明的对应的栈空间中,引用数据类型的变量声明的栈空间中存储的是堆空间中的对应值的地址。

image-20221206144221124

只要是声明变量就是在栈中,只不过值不同。

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];

image-20221206185457992

类与对象的空指针异常

对象引用为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

image-20221206190311825

创建数组对象时,没有对其中的对象进行初始化,而操作对象的任何属性或者方法都会报错。

Person[] people = new Person[3];
System.out.println(people[2].name);
输出
Exception in thread "main" java.lang.NullPointerException

image-20221206191011430

9.方法

概述

如果你已经理解了类存在的作用,那么例如人这个类来说,人有一些特征,这些特征我们放在程序中可以定义为各种成员变量(字段)。可是人还有很多对于外界交互的方式,例如打球,吃饭,喝水,说话等等。这些内容我们称之为行为;如果将这些行为定义到程序中,我们称之为“方法”。

方法的定义组成

方法只能作为类的一部分来定义,定义一个方法需要如下的5个组成部分。

访问修饰符

限定当前方法可以在哪个范围内使用,访问修饰符对于类、字段、方法的约束范围是完全相同的。

返回值类型

当一个方法需要在执行之后返回一个结果给调用者,那么就需要定义返回值类型,返回值类型可以使Java中的任何数据类型(基本数据类型、引用数据类型),一个方法只能有一个返回值,如果不需要返回值可以使用void

当前类中 当前包中 非当前包中的子类 非当前包中的非子类
private
protected
public

方法名称

方法名称属于标识符的一种,使用驼峰命名法。

参数列表

方法需要使用的字段,参数列表可以添加多个,也使用驼峰命名法。

方法体

方法体实质上是一个代码块。

方法体中return 的作用

1.其后代码不再执行,返回调用位置。

2.携带返回值。

public void test(String name){
    name = "胡家伟";
    System.out.println(name);
}
输出
胡家伟

方法的特点

  1. 定义方法可以将功能代码进行封装。
  2. 便于该功能进行复用。
  3. 方法只有被调用了才会执行。
  4. 方法的出现提高了代码的复用性。
  5. 方法若没有返回值,则用关键字“void”表示,那么该方法中return语句如果在最后一行,是可以省略不写的。
  6. 方法中可以继续调用方法,不可以在方法内部定义方法。
  7. 定义方法时,方法的结果应返回给调用者,交由调用者。

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

方法帧

方法帧是一个方法在执行的过程中在栈内存中单独生成的临时的空间,用于存储方法中声明的局部变量的值。方法帧随着方法开始执行时产生,在方法执行结束时立即回收。

方法重载

在同一个类中方法名相同但参数列表不同的方法之间的关系。

  1. 多个方法在同一个类中

  2. 多个方法具有相同的方法名

  3. 多个方法的参数列表不同(参数类型不同、个数不同、顺序不同)

可以实现方法重载是因为方法签名不同(方法名称+参数列表中每个参数的数据类型)

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

如果自己没有对一个类定义构造方法时,编译器会默认生成一个无参构造方法,当我们定义了构造方法时不会自动生成无参构造方法,所以在定义有参构造方法时记得定义一个无参构造方法。

使用注意

  1. 构造方法的名称和其所属的类名必须要完全保持一致。
  2. 构造方法不需要且根本不能定义返回值类型,即便是void
  3. 构造方法可以像普通方法一样,形成方法重载。
  4. 构造方法不可以被staticfinal关键字修饰。
  5. 构造方法是不能被继承的,如果在子类中想要调用父类的构造方法需要使用super关键字。
  6. 构造方法,只能在实例化的时候调用。

构造方法的调用

构造方法有两种调用方式:

一个是在对象实例化时调用

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

相关文章

  • day24 --> (Maven不完整版笔记)
    1、概念: 可以简单地理解为一个项目管理工具2、目录结构简介:  bin-->可执行文件(核心文件mvn)boot-->maven的启动器conf-->配置文件(核心文件settings......
  • 复习精简版快速学vue3
    vue2中。如果给一个之前没有定义的属性赋值,会得不到时实更新:this.obj.b=2//由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说vue对数据处......
  • 有关JavaSe基础的反射知识总结
    反射这门技术在说之前首先来介绍一下动态语言和静态语言动态语言:在服务器运行的期间可以改变其结构的语言,在运行时代码可以根据某些条件来改变自身的结构,我们目前学习到的......
  • JavaSE复习day1
    JavaSE复习day1胡家伟1.代码格式注释单行注释:通常用于解释方法内某单行代码的作用。多行注释:通常用于解释一段代码的作用。文档注释:通常用于生成Java开发文档。......
  • Angular 复习与进阶系列 – Dependency Injection 依赖注入
    前言本来是想先介绍AngularComponent的,但里头有涉及到一些DependencyInjection(简称DI)的概念.所以还是先介绍DI吧. 介绍我在 ASP.NETCore–Depende......
  • 算法复习第一章
    1、习题 D、要所有实例  2、ppt                                 ......
  • Angular 复习与进阶系列 – Get Started
    前言这一篇主要是教一些基础中的基础,方便我后续讲解其它主题的时候,可以列出一些samplecode. BeforeStart开始前,我们需要知道几个小知识1.AngularCompilat......
  • day23 --> (redis)
    Redis: 1.概念:redis是一款高性能的NOSQL系列的非关系型数据库2.下载安装:1、官网:https://redis.io2、中文网:http://www.redis.net.cn/3.解压可以直接使用:redis.wi......
  • 十四、JDBC复习
    十四、JDBC复习配置pom.xml文件中配置依赖<dependencies>  <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java<......
  • Angular 复习与进阶系列 – 概念篇
    前言我已经2年没有写Angular,最近又要开始撸了.既然都要复习了,那就干脆也写一个系类当作半教程半深入理解Angular吧.适合阅读的人1.向我一样很长一段时间没有......