runoob
Java在线中文手册
\r,\n,\r\n的区别
iDea
iDea图标含义
iDea快捷键
iDea shortcut :iDea > Help > Keyboard Shortcuts PDF
程序当前快捷键定义:File > Settings > Keymap
.var
new object.var // Enter后更新为下一行代码所示
Object object = new Object();
Windows
鼠标悬停在异常虚线上显示可能错误的原因,ctrl+1
suggestions available
Ctrl + D
:复制当前行到下一行
Press Ctrl+Shift+V
to select the text fragment that you have previously copied to the clipboard
Alt + insert: Generate code 和切换页面冲突,自修改为Alt + Win
Ctrl + Button1:打开父类方法
Ctrl + W : expand code selection
Ctrl + / : for single line comments // ...
Ctrl + Shift + / : for block comments /*...*/
Alt + Enter : fix a highlighted error or warning, improve, or optimiaze a code construct.
Ctrl + Q : open a preview or an action description for intention actions
Alt + 1 : open the Project tool window and switch focus to it
Ctrl+Alt+T:Surround with function
Ctrl+Alt+L:Format
Search Everywhere
Press Shift twice search for files, actions, symbols, UI elements, Git branches and comments across your project. Pressing double Shift again, will extend the search to non-project items.
Use tabs or direct shortcuts Ctrl + N for classes, Ctrl + Shift +N for files, Ctrl + Alt + Shift + N for symbols, and Ctrl + Shift + A for actions to narrow your search results.
Alt + 7 : Quickly locate all occurences of code referencing the symbol at the caret.
Ctrl + W : Expand code selection.
Ctrl + F12 : Show file structure.
MacOS
command+N
Generat Constructor Getter Setter
Java基础
Java教程
文件名需与类名一致
public class classname{
public static void main(String[] args) {null;}
}
●public:表示的这个程序的访问权限,表示的是任何的场合可以被引用,这样 Java 虚拟机就可以找到 main() 方法,从而来运行 javac 程序。
● static: 表明方法是静态的,不依赖类的对象的,是属于类的,在类加载的时候 main() 方法也随着加载到内存中去。
● void:main():方法是不需要返回值的。
● main:约定俗成,规定的。
● String[] args:从控制台接收参数。
Java对象和类
类:是一个模板,它包含类的属性和方法
对象:类的实例
类中的变量
- 类变量(Class Variables)/静态变量:相比成员变量而言,必须声明为static类型。静态变量的值在程序运行期间只有一个副本。
- 成员变量(Instance Variables)/字段(Field)/属性:定义在类中、方法之外的变量。在创建对象的时候实例化,可以被类中的方法访问。
- 局部变量:在方法中定义的变量。变量的声明和初始化都在方法中,方法结束变量即销毁。
- 参数/形参:方法和构造方法声明中的变量
辨析:局部变量和参数始终被归类为“变量”(而不是“字段”)。
如果成员变量和局部变量同名,根据就近原则优先使用局部变量,调用成员变量需要使用this.
this可能是new的对象名
构造方法
每个类都有构造方法(如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法),一个类可以有多个构造方法,构造方法的名称必须与类同名。
在创建一个对象的时候,至少要调用一个构造方法。
public class Puppy {
String breed; // 属性
int size;
String colour;
int age;
public Puppy() { // 构造方法
}
public Puppy() {String name) { // 这个构造器仅有一个参数name
System.out.println("小狗的名字是 :" + name);
}
public void setAge(int age) {
puppyAge = age;
}
public int getAge() {
System.out.println("小狗的年龄为:" + puppyAge); // 可以调用其他方法中的变量?
return puppyAge;
}
void eat() {
}
void run() {
}
public static void main(String[] aregs) {
Puppy myPuppy = new Puppy("tony");//创建对象
myPuppy.setAge(2); //调用实例方法
myPuppy.getAge();
System.out.println("变量值:" + myPuppy.puppyAge); // 访问实例变量
}
创建对象
在Java中,使用关键字‘new
来创建对象:
step 1 声明:声明一个对象,包括对象类型和对象名称
step 2 实例化:使用关键字new
来创建一个对象。
step 3 初始化:调用构造方法初始化对象。
访问实例变量和方法
// 先实例化对象
myPuppy.age;
myPuppy.eat();
源文件声明规则
一个源文件只能有一个public类,可以有多个非public类。
源文件的名称应该和public类的类名保持一致,如ClassName.java。
如果类定义在包中,那么包package语句应该在源文件的首行。
如果源文件包含import语句,应放在package语句和类定义之间,若无包,则放在头部。
内部类
访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
(1)非静态内部类:
(1.1) 内部类,具有访问外部类成员的权限
(1.2)私有内部类
可以使用private和protected修饰,如果不希望内部类被外部类访问可以使用private修饰。
若private修饰,InnerClass设置为私有内部类,执行会报错
(2)静态内部类
使用static关键字定义,静态内部类不需要创建外部类来访问,可以直接访问
class OuterClass {
int x = 10;
class InnerClass { // (1.1) 可添加private修饰
// private class InnerClass { // (1.2)可添加private修饰
public it myInnerMethod() {
return x; // 内部类访问外部类的属性和方法
}
// static class InnerClass { // 可添加static关键字修饰。静态内部类不能放外外部类的成员
int y = 5;
}
}
public class MyMainClass {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass(); // (1.1)首先实例化外部类
OuterClass.InnerClass myInner = myOuter.new InnerClass(); //然后创建内部类的对象。
// (1.2)若私有内部类,则这行代码会报错error: OuterClass.InnerClass has private access in OuterClass
// (2)若静态类,则可省略(1.1)首先实例化外部类的步骤,不通过外部类访问,instead直接访问
System.out.println(myInner.y + myOuter.x);
System.out.println(myInner.my
}
}
// 15
问题:一个源文件中可以有多个类?----可以,如公类中嵌套私类
main方法
程序都是从main方法开始执行。如果要运行源文件,源文件类中须包含main方法并创建一个实例对象
javac Puppy.java //编译源文件
java Puppy // 运行程序
Java基本数据类型
八种基本类型:六种数字类型(四个整数型,两个符点型),一种字符型,一种布尔型
byte
8位
short
16位
int
32位
long
64位,表示整数,如果数字大于int类型的存储极限,需要写尾缀L或l
float
单精度 32位
double
双精度 64位
char
16位 字符
boolean
1位 布尔
类型转换
混合运算中,不同类型的数据先转化为同一类型进行运算
- 自动类型转换:低位数转换为高位数
- 强制类型转换:
(type)value
转换的数据类型必须是兼容的 - 隐含强制类型转换:整数默认int,小数默认double,定义float类型时须在数字后面跟上F或f
Java 修饰符
访问控制符控制类、变量、方法、构造方法的访问
default
默认,什么都不写,不使用任何修饰符。类、接口、变量、方法均可使用
private
同一类内可见。可修饰变量、方法,不可修饰类(外部类)
public
对所有类可见。类、接口、变量、方法均可使用
protected
对同一包内的类和所有子类可见。可修饰变量、方法,不可修饰类(外部类)
运算符
算数运算符
a/b
除法-左操作数整除以右操作数
(float)a/b
//其中一个是浮点数,结果保留小数
Java 异常处理
(1)检查性异常:用户错误或问题引起的异常,程序员无法预见。如打开一个不存在的文件。编译时不能被简单地忽略。
(2)运行时异常:可以被程序员避免。可以在编译时被忽略。
(3)错误:错误不是异常。程序员不能控制。在代码中常被忽略。如栈溢出,在编译时检查不到。
Java Number & Math类
round()
四舍五入,Math.floor(x+0.5),加0.5后向下取整,返回一个最接近的int、long型值方法返回
long round(double d)
int round(float f)
Java内置异常类
Java语言定义了一些异常在java.lang标准包中。该包默认加载到所有的Java程序。大部分运行时异常都可以直接使用,如以下非检查性异常。
IndexOutOfBoundsException
指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
又如以下定义在java.lang包中的检查性异常
ClassNotFoundException
应用程序试图加载类时,找不到相应的类,抛出该异常
IllegalArgumentException
向方法传递了一个不合法或不正确的参数。
IllegalStateException
在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
捕获异常
throw 关键字用于在当前方法中抛出一个异常
throws 关键字用于在方法声明中指定该方法可能抛出的异常。
throws/throw关键字
throw 关键字用于在当前方法中抛出一个异常。
通常情况下,当代码执行到某个条件下无法继续正常执行时,可以使用 throw 关键字抛出异常,以告知调用者当前代码的执行状态。
public void checkNumber(int num) {
if (num < 0) {
throw new IllegalArgumentException("Number must be positive");
}
}
throws 关键字用于在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
例如,下面的代码中,当 readFile 方法内部发生 IOException 异常时,会将该异常传递给调用该方法的代码。在调用该方法的代码中,必须捕获或声明处理 IOException 异常。
public void readFile(String filePath) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
reader.close();
}
Class System
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) // 将指定源数组从指定位置开始的length长度子序列,复制到目标数组的制定位置
Java面向对象
Java继承
继承:子类继承父类的特征/实例域和行为/方法。
class 父类 {}
class 子类 extends 父类 {}
Java支持多重继承(C继承B,B继承A);不支持多继承
extends
只能继承一个类
implements
可以继承多个接口,用","隔开
super
实现对父类成员的访问
this
指向自己的引用
finel
终态,类不能被继承,方法不能被改写
重写Override与重载Overload
重写:子类对父类允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变
编译时检查参数的引用类型,父类中需有对应的方法,运行时运行实例对象的方法。
通过super调用父类被重写之前的方法。
标记@Override可以避免一些基本的错误。
重载:在一个类中,方法名相同,参数不同,返回类型可同可不同。最常用的地方是构造器的重载。
Java常见报错
1 Project JDK is not defined
Setup SDK > +Add SDK > JDK: Java Path (高级设置 > 环境变量)
2 List item
error: duplicate class: Main
程序只需要一个入口,即只有一个类包含main方法,其他类都是用于被main方法直接或间接调用的。
3 error: non-static method ‘xxx’ cannot be referenced from a static context
描述:在静态上下文中无法引用非静态方法
解决:Make the method static.
4 error: cannot find symbol
描述:无法找到符号
5 找不到或无法加载主类
java.lang.ClassNotFoundException
原因:查看该类是否有被编译成class文件
6 cannot be resolved 无法解析
cannot be resolved a type
无法解析为类型
原因:jar包缺失
解决:import导入对应包
7 MAVEN
Project build error: Non-parseable POM D:\xxx\xxx\pom.xml: expected START_TAG or END_TAG not TEXT (position: xxx)
原因:代码格式(空格)问题
解决:自动格式化 Ctrl+Shift+F
8 未设置系统全局属性 system property
Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set b the webdriver.chrome.driver system property:
解决方案:系统设置Chrome驱动文件的路径
将驱动放置对应目录下,并添加代码
System.setProperty("webdriver.chrome.driver", "xxx");
Exception in thread "main" java.lang.IllegalStateException: The driver executable does not exist
9 无法在静态方法中引入非静态成员
cannot make a static reference to non-static field
原因:在静态方法中,不能直接访问非静态成员(方法/变量)。因为,非静态变量依赖于对象存在,对象必须实例化后,变量才会在内存中存在。
解决方案:1)将变量改为静态的;2)先实例化对象,然后使用对象名.变量名
调用
10 不兼容的类型 incompatible types
public Map<Character, Integer> getFrequencyMap(List lst) {
for (String elem : lst) {
......
}
}
java: incompatible types: java.lang.Object cannot be converted to java.lang.String
原因:List默认返回Object
类
解决方案:
(1)将Object转换为String
String str = String.valueOf(obj);
String str = (String)(obj);
(2)使用String类
import ...
public class NaiveLetterFreqGuesser implements Guesser { // Java代码须在class类中
private final List<String> words; // 声明属性words,是一个String组成的List
public NaiveLetterFreqGuesser(String dictionaryFile) { words = FileUtils.readWords(dictionaryFile); } // 变量words读取文件
public Map<Character, Integer> getFrequencyMap() { // 构造方法
for (String elem : words) { // 使用全局属性words
......
}
}
public static void main(String[] args) { // run main 以执行代码
NaiveLetterFreqGuesser nlfg = NaiveLetterFreqGuesser(dictionary: "data/example.txt") // 定义类
System.out.println("list of words: " + nlfg.words); // 调用类的属性words
System.out.println("frequency map: " + nlfg.getFrequencyMap()); // 调用方法
}
}
11 类1不能强制转换为类2
class java.lang.Character cannot be cast to class java.lang.Integer
12 并发修改异常
for (int i = 0; i < guesses.size(); i ++) {
if (!(pattern.indexOf(guesses.get(i)) != -1)) {
for (String elem: lst) {
if (elem.indexOf(guesses.get(i)) != -1) {
lst.remove(elem);
}
}
}
}
报错:ConcurrentModificationException
分析:迭代的时候不允许迭代体的长度发生变化
13 java: 错误: 不支持发行版本 20
问题:设置的项目SDK与本地下载的java版本不符
解决:“File -> Project Structure”