Skip to main content

Java基础概念

基本输入

使用Scanner对象的nextXXX方法进行输入

Scanner sc = new Scanner();
String a = sc.next();
int b = sc.nextInt();
float c = sc.nextFloat();
//....

类型

类型

java常用的类型主要有如下几个,分为两大类,一种是简单数据类型,跟c语言一样,使用关键字声明;还有另一种是经过java官方重新封装过的数据类型,是用类进行表示,两者的区别主要是封装过的数据类型名字第一个字母是大写,而简单数据类型名字的第一个字母是小写。且对于封装数据类型来说比简单数据类型有更多的方法,具备更加方便的操作。

  • 简单数据类型
boolean, int, long, float, double, char, byte
  • 封装数据类型
Boolean, Integer, Long, Byte, Double, Float, Short, Character, String

类型转化

精度由低到高排列得: byte < short < char < int < long < float < double

tip

要注意,如果只在编译器里写类似123这种数字,默认类型是long,1.23默认类型是double

类型精度的转换规则:

  • 低精度转高精度: 自动转换,如int b = 1; double a = b;(a是高,b是低,b转到a)
  • 高精度转低精度:强制类型转换,如double x = 34.5; float c = (float)x;

类型判断

判断类型可以使用instanceof表达式 用法如下

int a = 1;
int b = 3;
double c = 4.1;
String d = "111";

if (a instanceof int) {
// ...
} else if (c instanceof double) {
// ...
} else if (d instanceof String)

外部访问控制权限

控制变量、方法和类的访问域通过三个关键字实现——public, protected, private.变量、方法和类可以使用这三个关键字进行修饰,只有private, protected不可以修饰类。

  • public

public可以修饰类、方法和变量。修饰对应的成员变量的作用效果是任何类都可以直接访问,可以直接通过'.'操作符直接访问。

  • private

private可以修饰方法和变量。修饰后对应的方法和变量都不能被外部直接访问,只能在内部进行访问。

  • protected

protected可以修饰方法和变量。修饰后对应的方法和变量在同一个包中可以直接访问,也可以被子类继承。

  • 友好类型(无任何关键字)

只有同一个包下的类可以直接访问,但是不能被子类继承。

数组

创建一个数组,通过new关键字进行创价吗,实际上就是创建了多个相同类型的对象。

float[] a = new float[100]; //1d
int[][] b = new int[3][4]; //2d

数组对象一般还有length属性,表示了当前数组的长度

数组遍历

  • 使用循环语句
int[] a = new int[100];
//1
for (int i = 0; i < a.length; i++) { ... }
//2
for (int num : a) { ... }
  • 使用Arrays类静态方法toString遍历
int[] a = new int[100];

String res = Arrays.toString(res);
System.out.println(res);

可变参数

对于一个方法的形参来说。如果想自定义参数数量,可以使用如下方法:

public static int getSum(int ... x) {}

此时的形参就变成了一个数组,这个数组里面存的就是所有传进来的变量对应的值。样例如下:


public static int getSum(int ... x) {
for (int i =0 ; i < x.length; i++) {
System.out.println("参数" + x[i].toString() + " " + x[i]);
}
}
// 上述代码会输出所有传入参数。

传值

tip

只有自己写的类才会传递值的引用,其他一律全部传值

值传递

对于任何的传值,如类传值或方法传值,如果只将该变量的值传过来,那么只会在该方法的作用域内有效,因为传的是一个值。底层原理上是开辟一个新的内存空间,也就是定义一个新的变量,然后该变量的值是把传入的变量的值copy一份之后再赋值给新定义的变量。除非能够在类的内部承接该变量,使其赋值给一个类内的变量就可以整个类使用了。

int id = 0;

void say(int a) {
a = 1;
System.out.println(a);
}
say(id);
System.out.println(id);

上述代码运行之后id的值未发生改变。

引用传递

对于自己写的类,如果把自己写的类作为形参,当传入该类的实例时则只会传入引用,也就是传入的是地址,也就是无论在哪的操作,因为已经给定地址了,所以会直接作用在这个地址的内存空间,所以做的任何修改都可以被带出方法。

String id = "102"
Student s = new Student(id);
class Cources {
Courses(Student s) {
s.setId("1922101");
}
}
s.showId();

上述代码的输出为1922101

杂项

tip

在构造器中使用 super() 调用父类中的其他构造方法时,该语句必须处于构造器的首行,否则编译器会报错。另外,this 调用本类中的其他构造方法时,也要放在首行。

final关键字

final关键字是表示修饰的变量是不可变的。修饰变量的时候表示该变量是常量,修饰方法的时候该方法不能被子类重写,修饰类的时候表示该类没有子类。

==与equals的区别

对于基本数据类型来说,==比较的是;对于引用数据类型来说,==比较的是地址. 因为Java只有值传递,所以对于==来说,不管是比较简单数据类型还是引用类型的变量,本质都是比较他们的值,只是引用类型本身就是一个地址 equals()只能用来判断两个对象是否相等。equals()方法是Object类下的,Object类是所有类的直接或间接父类。

String 中的 equals 方法是被重写过的,因为 Objectequals 方法是比较的对象的内存地址,而 Stringequals 方法比较的是对象的值。 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。