Java基础(二)

1、笔记

1/*
    使用方法的时候,注意事项:

    1. 方法应该定义在类当中,但是不能在方法当中再定义方法。不能嵌套。 ----> Python 中的闭包、装饰器可以
    2. 方法定义的前后顺序无所谓。
    3. 方法定义之后不会执行,如果希望执行,一定要调用:单独调用、打印调用、赋值调用。
    4. 如果方法有返回值,那么必须写上“return 返回值;”,不能没有。
    5. return后面的返回值数据,必须和方法的返回值类型,对应起来。
    6. 对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己。
    7. 对于void方法当中最后一行的return可以省略不写。
    8. 一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到,两个return不能连写。
     */

2、方法的重载
    多个方法名称一样,但是参数列表不一样;
    Python中会被覆盖,而Java中都可以同时存在
    注意事项:
        方法重载与下列因素相关:
        1、参数个数不同;
        2、参数类型不同;
        3、多类型的顺序不用; ---> (int a, double b) 与 (double a, int b)不一样
        方法重载与下列因素无关:
        1、与参数名称无关;
        2、与方法的返回值类型无关;

3、在调用输出语句的时候,println方法其实就是进行了多种数据类型的重载形式。(因为 println 可以打印任何内容,那么相当于有多个 println 方法,只是参数不同,用来接收各种各样的数据类型)

4、数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。

两种常见的初始化方式:
    1. 动态初始化(指定长度)
    2. 静态初始化(指定内容)

    动态初始化数组的格式:
    数据类型[] 数组名称 = new 数据类型[数组长度];

    静态初始化基本格式:
    数据类型[] 数组名称 = new 数据类型[] { 元素1, 元素2, ... };

    省略格式:
    数据类型[] 数组名称 = { 元素1, 元素2, ... };

注意事项:
    1. 静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
    2. 静态初始化标准格式可以拆分成为两个步骤。
    3. 动态初始化也可以拆分成为两个步骤。
    4. 静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。

    使用建议:
    如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。

5、直接打印数组名称,得到的是数组对应的:内存地址哈希值。

6、
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:
如果是整数类型,那么默认为0;
如果是浮点类型,那么默认为0.0;
如果是字符类型,那么默认为'u0000';
如果是布尔类型,那么默认为false;
如果是引用类型,那么默认为null。

注意事项:
静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。

7、Java内存需要划分为5个部分
    1、栈:存放的都是方法中的局部变量。方法的运行一定要在栈中运行。
    局部变量:方法的参数,或者是方法{}内部的变量
    作用域:一旦超出作用域,立刻从栈内存当中消失
    2、堆:凡是new出来的东西,都在堆当中。
    堆内存里面的东西都有一个地址值,16进制
    堆内存里面的数据,都有一个默认值,例如:
        如果是整数类型,那么默认为0;
        如果是浮点类型,那么默认为0.0;
        如果是字符类型,那么默认为'u0000';
        如果是布尔类型,那么默认为false;
        如果是引用类型,那么默认为null。
    3、方法区:储存.class相关信息,包含方法的信息。
    4、本地方法栈:与操作系统相关。
    5、寄存器:与CPU相关。

8、所有的引用类型变量,都可以赋值为一个null值。但是代表其中什么都没有。

9、
    一个方法可以有0、1、多个参数;但是只能有0或者1个返回值,不能有多个返回值。
    如果希望一个方法当中产生了多个结果数据进行返回,怎么办?
    解决方案:使用一个数组作为返回值类型即可。

    任何数据类型都能作为方法的参数类型,或者返回值类型。

    数组作为方法的参数,传递进去的其实是数组的地址值。
    数组作为方法的返回值,返回的其实也是数组的地址值。

10、
    面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
    面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。

11、类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
    对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。

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

131. 导包:也就是指出需要使用的类,在什么位置。
    import 包名称.类名称;
    对于和当前类属于同一个包的情况,可以省略导包语句不写。

    2. 创建,格式:
    类名称 对象名 = new 类名称();
    Student stu = new Student();

    3. 使用,分为两种情况:
    使用成员变量:对象名.成员变量名
    使用成员方法:对象名.成员方法名(参数)
    (也就是,想用谁,就用对象名点儿谁。)

    注意事项:
    如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。

14、局部变量和成员变量
    1. 定义的位置不一样【重点】
    局部变量:在方法的内部
    成员变量:在方法的外部,直接写在类当中

    2. 作用范围不一样【重点】
    局部变量:只有方法当中才可以使用,出了方法就不能再用
    成员变量:整个类全都可以通用。

    3. 默认值不一样【重点】
    局部变量:没有默认值,如果要想使用,必须手动进行赋值
    成员变量:如果没有赋值,会有默认值,规则和数组一样

    4. 内存的位置不一样(了解)
    局部变量:位于栈内存
    成员变量:位于堆内存

    5. 生命周期不一样(了解)
    局部变量:随着方法进栈而诞生,随着方法出栈而消失
    成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

2、数组的长度属性(注意是属性不是方法)

每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为 数组名.length-1 。

3、数组的内存图

4、一个对象的内存图

 

注意:

对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息
只保存一份,节约内存空间。

原文地址:https://www.cnblogs.com/linyuhong/p/10512065.html