Java自学 | 在实践中完善知识结构

runoob
Java在线中文手册
\r,\n,\r\n的区别

iDea

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基本数据类型

八种基本类型:六种数字类型(四个整数型,两个符点型),一种字符型,一种布尔型
byte8位
short16位
int32位
long64位,表示整数,如果数字大于int类型的存储极限,需要写尾缀L或l
float单精度 32位
double双精度 64位
char16位 字符
boolean1位 布尔

类型转换

混合运算中,不同类型的数据先转化为同一类型进行运算

  • 自动类型转换:低位数转换为高位数
  • 强制类型转换:(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”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值