Java中基础知识点


一、Java运算符优先级

运算符 结合性
[ ] . ( ) (方法调用) 从左向右
! ~ ++(自加) --(自减) +(正) -(负) 从右向左
* / % 从左向右
+(加) -(减) 从左向右
<< >> >>>(移位) 从左向右
< <= > >= (比较运算符) instanceof 从左向右
== != (赋值运算符) 从左向右
& 从左向右
^ 从左向右
| 从左向右
&& 从左向右
|| 从左向右
?:(三目运算符) 从右向左
= 从右向左

二、数据类型

bit):即一个二进制位,是计算机中最小的信息单位
字节Byte):即八个相邻的二进制位,简称为B。字节是衡量信息量大小、信息存储的基本单位,最小单位,常用的还有KB(千字节)、MB(兆字节)、GB(吉字节)等,其换算关系为:

1KB = 1024B 1MB = 1024KB = 1024*1024B

1GB = 1024MB = 1024*1024KB = 1024*1024*1024B

计算机中最小的存储单元 : 位 bit - > 比特位 b

1B = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB …

在这里插入图片描述
在这里插入图片描述


三、赋值运算符

在这里插入图片描述


四、逻辑运算符

在这里插入图片描述
短路与 &&

a&&b -> 如果a为false,则b不执行

短路或 ||

a||b -> 如果a为true,则b不执行


五、java是值传递

- 对于基本数据类型的参数,形式参数的改变,不影响实际参数的值
- 对于引用类型的参数,形式参数的改变,影响实际参数的值


通过方法传递引用类型的值
如果方法改变了传过来的引用类型的值,有影响.

import java.util.Arrays;

public class MethodTran {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        changeArrValue(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void changeArrValue(int[] arr) {
        arr[0] = 0;
        arr[1] = 0;
        arr[2] = 0;
    }
}

输出 :
在这里插入图片描述

如果方法改变了传过来的引用类型的地址值,没有影响. (具体看代码)

public class TestCSDN {
    public static void main(String[] args) {
        int[] arr = new int[0];
        int[] tranArr = tranValue(arr);
        int[] arrCy = arr;
        System.out.println(Arrays.toString(tranArr));
        System.out.println(Arrays.toString(arrCy));
    }

    private static int[] tranValue(int[] arr) {
        arr = new int[3];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i;
        }
        return arr;
    }
}

上面的输出是否都是 [0, 1, 2] 呢? 可是并不是.
输出:

在这里插入图片描述
不是说好的值传递吗? 为什么方法没有修改arr数组中的值呢?

请看下面这个渣渣分析图 ?
在这里插入图片描述
总结

在这里插入图片描述
图片来源 : 《Java核心技术卷一》


六、方法重载 -> 兄弟原则

6.1 方法重载

  • 多个方法在同一个类中 —— 父亲(类)相同
  • 多个方法具有相同的方法名 —— 兄弟之间姓氏(方法)相同
  • 多个方法参数不相同 —— 兄弟间的名字(参数)不同

    参数不同的区分方式 :

    1. 参数的数量不同,例如method(int)和method(int, int)
    2. 参数的类型不同,例如method(int)和method(String)
    3. 参数的顺序不同,例如method(int, String)和method(String, int)
      注意,参数的顺序不同的前提必须是顺序不同的几个参数类型不能一样
      例如如果是method(int, int)的话,那么不管怎么改变顺序都无法进行区分的

方法重载与返回值类型没有关系

6.2 方法重写

重写时满足的条件


七、成员变量和局部变量

new进堆,左进栈

进入堆内存 , 会开辟一个空间,拥有默认值
栈内存中不会. 局部变量使用之前需要初始化

  • 成员变量(在类中方法之外的变量) : 作用于整个类中. 在堆内存
    - 成员变量随着对象的创建而创建,随着对象的消失而消失
  • 局部变量(方法中或形式参数) : 作用于方法中. 在栈内存
    - 局部变量随着方法的调用而创建,随着方法的调用完毕而消失

Note :
成员变量局部变量同名的话,那么将会屏蔽成员变量的值.因此局部变量在命名时尽量不要与成员变量同名!


八、字符串拼接堆内存情况

对于字符串拼接,首先想要+进行连接,可是会消耗大量内存,速度很慢,因此推荐StringBuilder

分析一下为何+会占用大量内存呢?
在这里插入图片描述

由上图可知,字符串拼接原来的字符串并不会消失,而是如果常量池中不存在的话,将会重新开辟一块内存空间来存储新的字符串,以及拼接后的字符串.

StringBuilder在每次调用append()方法时,都是同一个对象,故和字符串+拼接相比,大大节省了时间!故推荐StringBuilder类进行字符串拼接的操作.


九、Java中访问修饰符

访问修饰符
对于上图可以这样理解(源自 : java作用域public ,private ,protected 及不写时的区别)

  • public : 不论是否是同一个包或者是否为继承关系,都可以访问.
  • private : 除了当前类以外其他都不可以使用

上面两个好记,另外两个可以这样想, 首先需要明确的是

  1. 同一个包即为朋友
  2. 不管是否在同一个包下,有继承关系即为家人
  • 默认(即不写修饰符) : 理解为friendly(友好的).所以除了自身可以访问外, 就是朋友也可以(即同一个包下)
  • protected : 保护的意思, 除了自身保护外, 朋友家人都可以保护你,所以自己可以访问,同一个包(朋友),拥有继承关系的子类也可以访问(家人).

总结
1)仅对本类可见—private
2)对所有类可见—public
3)对本包和所有子类可见—protected
4)对本包可见—默认(不需要修饰符)


十、final关键字

  • 定义为private,只能被本类的方法调用;
  • 定义为static,则强调只有一份,且只被执行一次;
  • 定义为final,则说明它是一个常量,无法被修改
  • final类不能被继承,没有子类,final类中的方法默认是final的,不包括成员变量.

  • final方法不能被子类的方法覆盖,但可以被继承。

    1. 父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
  • final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

    1. 若是基本数据类型的变量,数值初始化后便不能更改.
    2. 若是引用类型的变量,初始化后便不能再让其指向另一个对象.但可以更改所指向对象中成员的值
  • final不能用于修饰构造方法。


十一、显示参数和隐式参数

显示参数:方法中的形式参数

隐式参数:类的方法中调用了类的实例域。比如this,调用该方法的对象或者正在初始化的对象是隐式参数; 或者super。

public class People{
	private String name;
	private int age;
	public People() {}
	public People(String name, int age) {
		this.name = name; // this为正在初始化的对象
		this.age = age;
	}
	public void setName(String name) {
		this.name = name; // this为调用该方法的对象
	}
}

附 : Java基础中的经典问题





如果感觉本文对您有帮助,希望可以点赞支持一下作者.当然我也会继续写一些有用的东西,可以关注我持续看后面内容.感谢支持.

细微动作,如蔷薇般芬芳

发布了190 篇原创文章 · 获赞 153 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36852780/article/details/90314744