java基础
java基础
注释
-
单行注释:// 注释
-
多行注释:/* 注释 */
-
文档注释(文档具有功能):/**回车
/**
*@author 作者名
*@version 版本号
*@since 指明最早使用的jdk版本
*@param 参数名
*@return 返回值情况
*@throws 异常抛出情况
*/- cmd:javadoc -encoding UTF-8 -charset UTF-8(参数) java文件 (生成文档)
标识符
关键字
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
标识符
public class Hello{ public static void main(String[] args){ System.out.println("Hello World!"); String student = "米线"; } }
类名:Hello
方法名:main
变量名:student
-
只能以字母、$、_开始
-
不能用关键字
数据类型
所以变量定义后才能使用
基本类型
数值类型
-
整数
-
byte(1字节)
-
short(2字节)
-
int(4字节)
-
long(8字节)
long num = 10L;//long类型加L
二进制:0b
八进制:0
十六进制:0x -
-
浮点
-
float(4字节)
float num = 1.1F;//float类型加F -
double(8字节)
避免使用浮点数进行比较
eg:银行业务可以用BigDecimal类(数学工具类)
-
-
字符(2字节)
unicode编码:每个数字对应一个字符
System.out.println('\u0061');//a
boolean类型(布尔值)(true/false,1位)
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个tab位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一个反斜线字符'\' | 092 |
\' | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\uhhhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 |
引用类型
- 类
- 接口
- 数组
类型转换
低--------------------------------------------------------->高
byte,short,char -> int -> long -> float -> double
强制转换:(类型)变量名 高 -> 低
自动转换: 低 -> 高
eg:
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干的类型
- 转换的时候可能存在内存溢出,精度问题
//数字之间可以用下划线分割,一般用于大数 int num = 10_000;
变量作用域
public class Hello{ String name; int age; //实例变量:从属于类,可以不用初始化(布尔值默认false) static double salary = 3000; //类变量 public static void main(String[] args) { int i = 1; //局部变量:需要初始化 System.out.println(i); Hello hello = new Hello(); System.out.println(hello.age); //实例变量需要new才能使用 System.out.println(hello.name); System.out.println(salary); //类变量可以直接使用 } }
常量
final double PI = 3.14; static final double PI =3.14; final static double PI =3.14; //final和static都为修饰符,不区分顺序
变量命名
- 一般变量:小驼峰
- 方法名:小驼峰
- 类名:大驼峰
- 常量 :大写字母、下划线(MAX_VALUE)
字符串连接符:+
int a = 10; int b = 20; System.out.println(""+a+b); //1020 System.out.println(a+b+""); //30
包机制
一般利用公司域名倒置作为包名(eg:com.baidu.www)
流程控制
Scanner对象
用来获取用户的输入
Scanner s = new Scanner(System.in);
String str = s.nextLine(System.in);
获取字符串:nex()、nextLine()
判断是否还有输入的数据:hasNext()、hasNestLine() 一般在读取数据前判断
用完之后要关掉:s.close();
增强For循环
循环数组和集合
for (声明语句:表达式){
}
int[] numbers = {10,20,30,42}; for(int x:numvers){ System.out.println(x); }
方法
public static void Hello(){ System.out.prinln("Hello World!"); }
public 公共的
static 静态方法:独立该类的任何对象,不依赖类特定的实例,被类的所有实例共享
- 能直接调用,不是static方法则需要实例化才能调用
- static方法不能调用非static方法 (static方法与类同时加载,非static方法在类实例化之后才加载)
- void 返回值
- 值传递:复制实参的值给形参
- 引用传递:对于对象,可以改变对象的属性,本质还是值传递
方法的重载
方法名相同,但形参不同
- 方法名相同
- 参数列表不同
- 返回类型可以相同可以不同
- 仅仅返回类型不同不足以成为方法的重载
方法名相同时,编译器根据调用方法的参数个数、类型等去匹配对应的方法
命令行传参
cmd:java文件路径下编译文件 -> 退回到src文件下运行(eg:java com.method.Demo01)并传参
可变参数
在方法声明中,在指定参数后加省略号
一个方法只能指定一个可变参数且必须时方法的最后一个参数
public static int add(int... num){ }
数组
创建:dateType[] arrayRefVar = new dateType[arraySize];
Arrays类
面向对象
实质:以类的方式组织代码,以对象的组织(封装)数据
一个类中只能有一个public
创建对象
使用new关键字创建对象
public class Student{ String name; int age; public void study(){ System.out.println(this.name+"在学习"); } }
public class Application{ public static void main(String[] args){ Student lihua = new Student; System.out.println(lihua.name); lihua.study(); } }
类的构造器(构造方法)
- 实例化时会自动隐式定义,也可显示定义
- 必须与类的名称相同
- 没有返回类型(不是void)
- 能实例化初始值
- 定义了有参构造,无参构造就必须显示定义(尽量把无参构造显化)
封装
高内聚,低耦合
数据的隐藏
- 属性私有:private关键字
private int name;
- get/set方法:可以操作私有属性
public String getName{ return this.name; } public void setName(String name){ this.name = name; }
继承
对一批类的抽象
拓展:extends
public class Person{ }
public class Student extends Person(){ }
类只有单继承,没有多继承
java中所有的类都默认继承Object类
- this关键字:引用当前对象
- super关键字:引用父类对象
构造器
子类构造器默认调用父类构造器
调用构造器必须是构造函数主体的第一条语句(this()、super())
public class Person{ } public class Student extends Person(){ public Student(){ //super();默认调用父类构造器 } }
方法的重写
重写(Override)都是方法的重写,与属性无关
public class B(){ public static void text{ System.out.println("B->text()"); } }
public class A extends B{ public static void text(){ System.out.println("A->text()"); } }
public class A extends B{ public static void main(String[] args){ A a = new A(); a.text();/*静态方法:A->text() 非静态方法:A->text() */ B b = new A();//父类的引用指向了子类 b.text();/*静态方法:B->text() 非静态方法:A->text() */ } }
- 静态方法:方法调用只和定义的数据类型有关
- 非静态方法:重写了父类的方法,调用时使用的是重写了之后的方法(需要用public)
- 修饰符:public > protected > default(默认) > private(范围可以扩大但不能缩小)
多态
同一方法可以根据发送对象的不同而采用不同的行为方式
一个对象的实际类型是确定的,指向的引用类型不确定
Student s1 = new Student(); Person s2 = new Student(); Object s3 = new Student();
-
对象能执行的方法主要看定义的类型
-
多态存在的必要条件
- 继承
- 重写
- 父类引用指向子类对象
-
关键字instanceof:a instanceof b判断两个对象之间是否存在父子关系(a(a的实际类型)是否是b的子类)
static
类加载时static方法就加载
public class Demo{ static{}//静态代码块,最先加载,只执行一次 {}//匿名代码块,其次加载,可以用来赋初值 public Demo(){}//构造器,最后加载 }
- 静态导入包:可以直接使用方法
import static java.lang.Math.random;
抽象类
- 关键字:abstract
不能new抽象类
抽象类里可以写普通方法
抽象方法必须在抽象类中
//抽象类 public abstract class Action{ //约束,抽象方法 public abstract void doSomething(); }
继承了抽象类的子类必须实现抽象类的方法,除非子类也是抽象类
抽象类也存在构造器
接口
只有规范,不能写方法,实现约束和实现分离:面向接口编程
- 关键字:interface
public interface UserService{ //接口中的所有定义都是抽象的:public abstract(方法)、public static final(属性) void add(); }
public interface TimeService{ void time(); }
- 接口都需要有实现类
接口可以多继承
//命名规则:接口名加Impl,用关键字implements实现 public UserServiceImpl implements UserService,TimeService{ public void add(){ } public void time(){ } }
内部类
成员内部类,静态内部类
public class Outer{ private int id; public void out(){ System.out.println("外部"); } public class Inner{ public void in(){ System.out.println("内部"); } //能获得外部类的私有属性,加static之后(静态内部类)则不能获得 public void getID(){ System.out.println(id); } } } //实例化 Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();
public class Demo01{ } //一个类文件中只能有一个public类 class Demo02{ }
局部内部类
public class Demo01{ public void method(){ class Inner{ public void in(){ } } } }
匿名内部类
public class Demo01{ public void run(){ } }
new.Demo01().run();//没有名字
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了