Java基础
注释
1. 单行
2. 多行
3. 文件注释
变量
分为:
- 基本数据类型(CPU可以直接进行运算的类型)
- 引用数据类型
基本数据类型:
- 整数类型:byte,short,int,long
- 浮点数类型:float,double
- 字符类型:char
- 布尔类型:boolean
各个数据类型能表示的值的范围。
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
各个数据类型所占的字节数
┌───┐ byte │ │ └───┘ ┌───┬───┐ short │ │ │ └───┴───┘ ┌───┬───┬───┬───┐ int │ │ │ │ │ └───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┬───┬───┬───┐ long │ │ │ │ │ │ │ │ │ └───┴───┴───┴───┴───┴───┴───┴───┘ ┌───┬───┬───┬───┐ float │ │ │ │ │ └───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┬───┬───┬───┐ double │ │ │ │ │ │ │ │ │ └───┴───┴───┴───┴───┴───┴───┴───┘ ┌───┬───┐ char │ │ │ └───┴───┘
float
后缀需要加上f
char
使用的是‘’单引号
位运算
与(&)或(|)非(~)异或(^)
与 两边同时为1 结果就是1
或 任意一个为1 结果就是1
非 0与1互换
异或 两个数不同结果是1
运算符的优先级
()
!
~
++
--
*
/
%
+
-
<<
>>
>>>
&
|
+=
-=
*=
/=
关系运算符的优先级
!
>
,>=
,<
,<=
==
,!=
&&
||
类型自动提升与强制类型
在运算的过程中如果两个数 的类型不一致,那么计算结果为较大的类型。
强制类型转换时
浮点数运算
-
不能做为运算和移位运算
整数除以0会报错 浮点数除以0不会报错
强制类型转换 浮点数转换为整数时要想满足四舍五入那么需要+0.5再进行四舍五入
字符串
多行字符串""" “”"
字符串的不可变性
public class Main { public static void main(String[] args) { String s = "hello"; String t = s; s = "world"; System.out.println(t); // t是"hello" } }
数组
特点:
- 所有元素初始的值是默认的 整型都是
0
,浮点型是0.0
,布尔型是false
。 - 数组一旦创建,大小不变。
数组遍历
public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 }; for (int n : ns) { System.out.println(n); } } }
上面是通过for each
缺点:无法拿到数组的索引 n拿到的是数组的数
Arrays.toString()
可以快速打印数组的内容
import java.util.Arrays;
public class Main { public static void main(String[] args) { int[] ns = { 1, 1, 2, 3, 5, 8 }; System.out.println(Arrays.toString(ns)); } }
Arrays.sort()
可以将数组进行快速排序
Arrays.deepToString()
可以便利二维数组
面向对象编程
面向对象的基本概念,包括:
- 类
- 实例
- 方法
面向对象的实现方式,包括:
- 继承
- 多态
Java语言本身提供的机制,包括:
- package
- classpath
- jar
以及Java标准库提供的核心类,包括:
- 字符串
- 包装类型
- JavaBean
- 枚举
- 常用工具类
class 本身就是一种数据类型 instance是根据class创建的实例,可创建多个instance但各自的属性可能不同
定义方法
修饰符 方法返回类型 方法名(方法参数列表) {
若干方法语句;
return 方法返回值;
}
可变参数
可变参数可以用
类型...
表示而可变参数可以保证无法传入
null
,因为传入0个参数时,接收到的实际值是一个空数组而不是null
。
参数绑定
基本类型参数的传递,是调用方值的复制。双方各自修改后,互不影响。
引用类型参数的传递,调用方的变量和接收方参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方,因为指向同一个对象。
构造方法
-
没有返回值
-
名称就是类名
-
如果认为没有写构造方法那么计算机就产生一个默认的构造方法
-
在Java中创建对象实例的时候,初始化值时遵从下面的顺序
1
先初始化字段,例如,
int age = 10;表示字段初始化为
10,
double salary;表示字段默认初始化为
0,
String name;表示引用类型字段默认初始化为
null;
2
执行构造方法的代码进行初始化
-
构造方法可以重载,即构造方法可以写多个,构造方法间也可以相互调用。用this()
方法重载
- 方法重载的返回值的类型通常是相同的
继承
使用extends关键字来实现继承
子类自动获得父类的字段,严禁定义与父类重名的字段
父类又称为超类(super class),基类(base class)
子类又称为扩展类(extended class)
特点:
- 子类无法访问父类的private的字段或者方法
- 使用protected的关键字就可以了
java访问权限总结
Java中外部类的修饰符
修饰符 作 用 public 权限修饰符,该类能被项目中的所有类可见 default(缺省) 权限修饰符,同一个包中可见 abstract 性质修饰符,抽象类 final 最终类 Java****中类的成员修饰符
成员 修饰符 成员变量 成员方法 private 权限修饰符,私有 权限修饰符,私有 Default(缺省) 权限修饰符,缺省 权限修饰符,缺省 protected 权限修饰符,保护 权限修饰符,保护 public 权限修饰符,公有 权限修饰符,公有 static 性质修饰符,类变量 性质修饰符,类方法 final 性质修饰符,常成员变量 性质修饰符,最终方法 abstract 性质修饰符,抽象方法 synchronized 性质修饰符,线程同步 Java中成员的访问权限总结
由于类中封装了数据和代码,包中封装了类和其它的包,所以Java提供了在四种范围中访问权限的控制,即:1.同一个类中;2.同一个包中;3.不同包中的子类;4. 不同包中的非子类。访问权限的控制如下表所示:
范围 权限 同一个类中 **(**直接使用成员名) 同一个包的 (子类中:直接使用成员名) (不同类中:对象名. 成员名) 不同包的子类中 (直接使用成员名) 不同包的非子类中 (对象名 成员名) private ✔ default(缺省) ✔ ✔ protected ✔ ✔ ✔ public ✔ ✔ ✔ ✔ 说明:
\1. 在同一个类中,所有成员可以直接使用成员名访问或调用(构造方法除外,成员名与局部变量同名除外);
\2. 同一个包的子类中,父类的default、protected、public成员可见,可以直接使用成员名访问或调用;
\3. 同一个包的不同类中,可以用:对象名**.** 成员变量名 或 对象名**.** 成员方法名**(参数)** 的方式访问另一个类中default、protected、public数据成员或调用方法成员;
\4. 不同包的子类中,父类的protected、public成员可见,可以直接使用成员名访问或调用;
\5. 不同包的不同类中,可以用:对象名**.** 成员变量名 或 对象名**.** 成员方法名**(参数)** 的方式访问另一个public数据成员或调用方法成员;
super
超类
- 在构造方法中第一行语句必须是父类的构造方法,,如果没有调用父类的构造方法,编译器会自动生成super();在任何一个class中都必须在最前面调super
- 子类不会继承父类的构造方法
- java15开始允许sealed修饰class,并通过permits写出可以可以从该class继承的父类的名称
- 正常情况下只要class没有final修饰符那么任何类都可以由该类继承
向上转型
引用类型变量可以指向其子类的实例对象
不可以向下转型
instanceof
instanceof
实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。
多态
覆写:Java中子类如果定义了一个方法签名和父类相同的方法,被称为覆写
Override和Overload不同的是,如果方法签名如果不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override
。
Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。
特性
运行期才能动态决定调用的子类方法。
如果父类不想的一个方法不想被子类覆写那么在该方法用final修饰
可以在构造方法中初始化final字段
final
修饰符作用:
final
修饰的方法可以阻止被覆写;final
修饰的class可以阻止被继承;final
修饰的field必须在创建对象时初始化,随后不可修改。
抽象类
如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法
abstract
如果一个class定义了方法,无具体执行代码那么这个方法就是抽象方法用 abstract修饰,因为无法执行抽象方法,这个类必须声明为抽象类用 abstract无法实例化一个抽象类。
抽象类只能被继承
接口
- interface可以用来声明一个接口
- 所谓
**interface**
,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract
的,所以这两个修饰符不需要写出来(写不写效果都一样)。 - 在接口中可以定义default方法
default
方法和抽象类的普通方法是有所不同的。因为interface
没有字段,default
方法无法访问字段,而抽象类的普通方法可以访问实例字段。- 可以多继承
静态字段和静态方法
-
每个实例字段都有独立的空间,用static修饰的字段称为静态字段,有一个共享的空间。
-
对于静态字段无论修改哪个静态字段效果都一样,
-
推荐用类名来访问静态字段,通过类名来调用静态方法
-
静态字段和静态方法属于class而不属于实例,因此静态方法内部无法使用this也无法访问实例字段。
-
main()也是静态方法
-
interface不能定义实例字段但它可以定义静态字段,
public interface Person{
public static final int s = “ss”}`
包
package
包没有父子关系
import
import static 可以导入一个类的静态字段和静态方法
如果有两个class的名称相同,只能import其中的一个,另一个必须全部名称引入