Java-概念与安装
概念
JDK:java程序开发工具包,包含JRE和开发人员使用的工具(相当于.NET SDK)
JRE:是Java程序运行时环境,包含JVM和运行需要的核心类库(相当于.NET Runtime)
JVM:JVM虚拟机(Java Virtual Machine)是Java程序的运行环境,通过模拟计算机硬件(如处理器、堆栈、寄存器等)和操作系统功能,实现跨平台执行Java字节码(.class文件)。核心作用是跨平台
Java开发安装
安装JDK,进入官网https://www.oracle.com/developer/
找到java下载,选择windows,版本17,下载:jdk-17.0.15_windows-x64_bin.exe
添加JAVA_HOME环境变量,添加path环境变量
Java开发步骤
Java程序开发三步骤:编写、编译、运行。
·将Java代码编写到扩展名为的源文件中 ·通过
javac.exe命令对该java文件进行编译,生成一个或多个字节码文件(.class文件) ·通过
java.exe`命令对生成的class文件进行运行
命令
javac命令:编译程序
java命令:运行程序
IDE安装
IDEA,全程IntelliJ IDEA。下载网址: https://www.jetbrains.com/idea/download/#section=windows
Eclipse(老工具,不推荐)
项目结构
层级关系:
project(工程) - module(模块) - package(包) - class(类)
project类似.net中的解决方案
module类似.net中的项目
package类似.net中的命名空间,但是package更强调物理隔离,C#命名空间侧重逻辑分组
package、import
package 包名:为类指定包名
import 包名.类名:引入包
JDK中主要的包介绍
java.lang ----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
java.net ----包含执行与网络相关的操作的类和接口。
java.io ----包含能提供多种输入/输出功能的类。
java.util ----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
java.text ----包含了一些java格式化相关的类
java.sql ----包含了java进行JDBC数据库编程的相关类/接口
可变个数参数方法
类似c#中的params参数
public static void Show(String...books)
{
for (int i=0;i<books.length;i++){
System.out.println(books[i]);
}
}
Show("水浒传","三国演义");
面向对象
构造函数调用另一个构造函数
public Student(String name) {
this();//调用本类无参构造器,this()只能在构造器首行
this.name = name;
}
//.net中如下调用
public Person(string name) : this(name, 0) { }
类继承:
[修饰符] class 类B extends 类A {
...
}
方法重写:
@Override
public void showNum(){
System.out.println("显示来电姓名,头像");
}
super:
相当于.net中的base,调用父类成员
public class SmartPhone extends Phone{
SmartPhone(){
super();//调用父类构造函数
}
//重写父类的来电显示功能的方法
public void showNum(){
System.out.println("显示来电姓名");
//保留父类来电显示号码的功能
super.showNum();//此处必须加super.,否则就是无限递归,那么就会栈内存溢出
}
}
接口(interface)
public interface USB3{
//静态常量
long MAX_SPEED = 500*1024*1024;//500MB/s
//抽象方法
void in();
void out();
//默认方法
default void start(){
System.out.println("开始");
}
default void stop(){
System.out.println("结束");
}
//静态方法
static void show(){
System.out.println("USB 3.0可以同步全速地进行读写操作");
}
}
实现接口:
class 类名 implements 接口1,接口2,接口3。。。{
// 重写接口中所有抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写
// 重写接口中默认方法【可选】
}
final修饰符
final修饰类,表示这个类不能被继承,和c#中sealed作用一样
final修饰方法,表示这个方法不能被子类重写
final修饰变量,一旦赋值,它的值只能在构造函数中被修改。和c#中readonly作用一样
final修饰方法局部变量,只读
instanceof:
相当于.net中的is,校验类型
if(pet instanceof Cat){
Cat cat = (Cat) pet;
cat.catchMouse();
}
java.lang.Object:
类 java.lang.Object
是类层次结构的根类,即所有其它类的父类。
getClass方法
类似.net中的GetType()方法
Sub s = new Sub();
var c = s.getClass();
static:
java中静态成员可以通过类名也可以通过对象名调用,与.net不同
代码块
代码块分静态代码块,和非静态代码块。
静态代码块和c#中的静态构造函数相同,在类加载时执行,只执行一次;非静态代码块在类实例化时执行。
class Sub extends Base {
public static int TOTAL=0;
public int count = 0;
static{
System.out.println("静态代码块执行");
TOTAL=3;
}
{
System.out.println("非静态代码块执行");
this.count=50;//注意非静态代码块要写在属性之后
}
public void display() {
System.out.println(this.count);
}
}
枚举
//简单枚举
public enum Week {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}
//带方法的枚举
public enum SeasonEnum {
SPRING("春天","春风又绿江南岸"),
SUMMER("夏天","映日荷花别样红"),
AUTUMN("秋天","秋水共长天一色"),
WINTER("冬天","窗含西岭千秋雪");
private final String seasonName;
private final String seasonDesc;
private SeasonEnum(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
System.out.println( Week.MONDAY);
System.out.println( SeasonEnum.SPRING);
System.out.println( SeasonEnum.SPRING.getSeasonDesc());
switch (week){
case MONDAY:
System.out.println("怀念周末,困意很浓");break;
case TUESDAY:
System.out.println("进入学习状态");break;
}
enum中常用方法
String toString(): 默认返回的是常量名(对象名),可以继续手动重写该方法!
static 枚举类型[] values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值,是一个静态方法
static 枚举类型 valueOf(String name):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
String name():得到当前枚举常量的名称。建议优先使用toString()。
int ordinal():返回当前枚举常量的次序号,默认从0开始
Week[] values = Week.values();
for (int i = 0; i < values.length; i++) {
//ordinal()、name()
System.out.println((values[i].ordinal()+1) + "->" + values[i].name());
}
注解(Annotation)
注解就是c#中的Attribute
常用的注解:
@Override
: 限定重写父类方法,该注解只能用于方法
@Deprecated
: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings
: 抑制编译器警告
生成文档相关的注解:
@author 标明开发该类模块的作者,多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明,如果没有参数就不能写
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写
元注解
package java.lang;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
Idea快捷键
提高编写速度
说明 | 快捷键 |
---|---|
智能提示-edit | alt + enter |
使用xx块环绕-surround with ... | ctrl+alt+t |
调出生成getter/setter/构造器等结构-generate ... | alt+insert |
方法的形参列表提醒-parameter info | ctrl+p |
批量修改指定的变量名、方法名、类名等-rename | shift+f6 |
抽取代码重构方法-extract method ... | ctrl+alt+m |
重写父类的方法-override methods ... | ctrl+o |
实现接口的方法-implements methods ... | ctrl+i |
选中的结构的大小写的切换-toggle case | ctrl+shift+u |
批量导包-optimize imports | ctrl+alt+o |
类结构、查找和查看源码
说明 | 快捷键 |
---|---|
如何查看源码-go to class... | ctrl + 选中指定的结构 或 ctrl+n |
显示当前类结构,支持搜索指定的方法、属性等-file structure | ctrl+f12 |
退回到前一个编辑的页面-back | ctrl+alt+← |
进入到下一个编辑的页面-forward | ctrl+alt+→ |
打开的类文件之间切换-select previous/next tab | alt+←/→ |
光标选中指定的类,查看继承树结构-Type Hierarchy | ctrl+h |
查看方法文档-quick documentation | ctrl+q |
类的UML关系图-show uml popup | ctrl+alt+u |
定位某行-go to line/column | ctrl+g |
回溯变量或方法的来源-go to implementation(s) | ctrl+alt+b |
折叠方法实现-collapse all | ctrl+shift+ - |
展开方法实现-expand all | ctrl+shift+ + |
查找、替换与关闭
说明 | 快捷键 |
---|---|
查找指定的结构 | ctlr+f |
快速查找:选中的Word快速定位到下一个-find next | ctrl+l |
查找与替换-replace | ctrl+r |
查询当前元素在当前文件中的引用,然后按 F3 可以选择 | ctrl+f7 |
全项目搜索文本-find in path ... | ctrl+shift+f |
关闭当前窗口-close | ctrl+f4 |
调整格式
说明 | 快捷键 |
---|---|
格式化代码-reformat code | ctrl+alt+l |
使用单行注释-comment with line comment | ctrl + / |
使用/取消多行注释-comment with block comment | ctrl + shift + / |
选中数行,整体往后移动-tab | tab |
选中数行,整体往前移动-prev tab | shift + tab |
Debug快捷键
说明 | 快捷键 |
---|---|
单步调试(不进入函数内部)- step over | F8 |
单步调试(进入函数内部)- step into | F7 |
强制单步调试(进入函数内部) - force step into | alt+shift+f7 |
选择要进入的函数 - smart step into | shift + F7 |
跳出函数 - step out | shift + F8 |
运行到断点 - run to cursor | alt + F9 |
继续执行,进入下一个断点或执行完程序 - resume program | F9 |
停止 - stop | Ctrl+F2 |
查看断点 - view breakpoints | Ctrl+Shift+F8 |
关闭 - close | Ctrl+F4 |
获取随机数
double d1 = Math.random();//0-1范围内的double类型的数
System.out.println("随机数:"+d1);
接受键盘输入
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);//System.in默认代表键盘输入
String name = scanner.next();
System.out.println("姓名:"+name);
int age = scanner.nextInt();
System.out.println("年龄:"+age);