x.append(y) y接在x后面
英文
balance:余额
extends:继承
override:重写,覆盖
annual:年薪
快捷键
快捷键 ctrl+h 看到类的继承关系
ctrl + d 复制当前行到下一行
定位 ctrl + b
一键整理代码格式的快捷键是 Ctrl + Alt + L
数组
创建数组
int[] numbers = new int[5]; // 创建一个包含 5 个整数的数组
可以在创建数组的同时赋初值,也可以单独初始化数组元素:
int[] numbers = {1, 2, 3, 4, 5}; // 初始化数组并赋初值
numbers[0] = 10; // 单独初始化数组元素
数组初始化为 [](空括号)和 null 有着不同的含义:
数组初始化为 []:
当我们声明一个数组并初始化时,如果使用 [] 表示空的初始值,即数组已经创建但没有元素被赋值。这种情况下,数组的长度为0。
示例代码:
int[] numbers = {}; // 声明一个空数组,长度为0
数组初始化为 null:
当一个数组被赋值为 null,表示该数组引用不指向任何有效的数组对象,即数组对象不存在。这时数组变量虽然声明了,但它并没有引用任何实际的数组对象,也没有分配内存空间。
int[] numbers = null; // 将数组引用变量赋为null,表示该引用不指向任何数组对象
字符串
比较两个字符串内容是否相当:str1.equals(str2)
解题思路
先完成代码的正常业务,再考虑健壮性。
包装类
这里直接用double的话无法解决数组为空的情况的返回。 可以用包装类Double解决。
public class Homework01{
public static void main(String[] args){
A01 p1 = new A01();
double num[] = {1,3,4,5};
Double res = p1.max(num);
if (res != null){
System.out.println(p1.max(num));
}
}
}
class A01 {
// 要考虑代码的健壮性
public Double max(double[] array){
// this.array=array;
if(array != null && array.length > 0){
double max = array[0];
for(int i = 1; i < array.length ; i ++){
if (array[i] > max){
max = array[i];
}
}
return max;
}
else return null;
}
}
运算符
运算符的优先级是固定的,按照优先级从高到低的顺序排列如下:
一元运算符:++, --, ~, !
乘性运算符:*, /, %
加性运算符:+, -
移位运算符:<<, >>, >>>
关系运算符:<, >, <=, >=, instanceof
相等运算符:==, !=
位运算符 AND:&
位运算符 XOR:^
位运算符 OR:|
逻辑运算符 AND:&&
逻辑运算符 OR:||
条件运算符:? :
赋值运算符:=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=
j=i++; 先赋值再自增;
j=++i; 先自增再赋值。
在构造器中用另一个构造器
class Employee {
String name;
char gender;
int age;
String career;
double sale;
public Employee(String job,double sale){
this.job = job;
this.sale = sale;
}
public Employee(String name,char gender, int age){
this.name = name;
this.gender = gender;
this.age = age;
}
public Employee(String job,double sale, String name,char gender,int age){
this(name, gender, age);//访问之前的构造器
this.job = job;
this.sale = sale;
}
}
随机数
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
int randomNumber = random.nextInt(3); // 生成一个范围在 0 到 2 的随机数
System.out.println(randomNumber);
}
}
switch
switch (expression) {
case value1:
// 当 expression 的值等于 value1 时执行的代码块
break;
case value2:
// 当 expression 的值等于 value2 时执行的代码块
break;
// 可以有更多的 case 分支
default:
// 当 expression 的值与所有 case 不匹配时执行的代码块
}
接收用户的输入
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
// 接收用户输入的数字
int number = scanner.nextInt();
System.out.println("您输入的数字是:" + number);
scanner.close();
}
}
可变参数
public static void printNumbers(int... numbers) {
}
继承和多态
看的韩顺平老师的课 通过廖雪峰的网站补充 记录如下:
如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法。
向上转型实际上是把一个子类型安全地变为更加抽象的父类型:
Student s = new Student();
Person p = s; // upcasting, ok
Object o1 = p; // upcasting, ok
Object o2 = s; // upcasting, ok
和向上转型相反,如果把一个父类类型强制转型为子类类型,就是向下转型(downcasting)。例如:
Person p1 = new Student(); // upcasting, ok
Person p2 = new Person();
Student s1 = (Student) p1; // ok
Student s2 = (Student) p2; // runtime error! ClassCastException!
Person类型p1实际指向Student实例,Person类型变量p2实际指向Person实例。在向下转型的时候,把p1转型为Student会成功,因为p1确实指向Student实例,把p2转型为Student会失败,因为p2的实际类型是Person,不能把父类变为子类,因为子类功能比父类多,多的功能无法凭空变出来。
Java的实例方法调用是基于运行时的实际类型(等号右边)的动态调用,而非变量的声明类型(等号左边)。这个非常重要的特性在面向对象编程中称之为多态。多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。
Java 中的属性访问是根据编译时类型确定的,而方法访问是根据运行时对象的类型确定的。
属性访问:根据编译时类型确定。即使引用指向的对象是子类的实例,也只有在引用的类中定义的属性才能被访问,而不是实际对象的类型。
方法访问:根据运行时对象的类型确定。在调用对象的方法时,实际执行的是该对象所属类中定义的方法,而不是引用类型指定的方法。这种行为被称为动态绑定或运行时多态。
Object类
狂神说java
入门
快捷键
Shift+Delete永久删除 ctrl+w自动保存
ctrl+shift+esc任务管理器
基本的Dos命令
打开CMD的方式
开始+系统+命令提示符
win键+R+输入cmd (推荐使用)
在任意的文件夹下,按住Shift键+鼠标右击,打开命令行窗口
在资源管理器地址栏路径前面加 “cmd ”
管理员运行方式:命令提示符右键以管理员身份运行(最高权限运行)
常用dos命令
# 查看当前目录下所有文件 dir
# 切换目录 cd /d E:\idea
# 返回上一级目录 cd ..
# 进入同级目录下的下一级目录 cd tmp(该目录下的文件名)
# 清屏 cls (clear screen)
# 退出终端 exit
# 查看电脑当前IP地址 ipconfig
# 打开计算器 calc
# 打开画图 mspaint
# 新建记事本 notepad
# 在当前目录新建文件夹 md test(文件夹名)
# 新建文件 cd> a.txt(文件名)
# 删除文件 del a.txt(文件名)
# 删除目录 rd test(目录名)
# ping命令(复制链接进入Dos直接单击鼠标右键粘贴)
基础
- JavaSE: 标准版 (桌面程序,控制台开发…)
- JavaME: 嵌入式开发 (手机,小家电…),已经凉了
- JavaEE: E企业级开发 (Web端,服务端开发…),JavaSE为基础
JDK JRE JVM
- JDK:Java Development Kit (Java开发者工具,包括 JRE,JVM)
- JRE:Java Runtime Environment (Java运行时环境)
- JVM:Java Virtual Machine (Java虚拟机,跨平台核心:在不同的操作系统使用java虚拟机屏蔽了底层系统的差别,可以做到一次编译到处运行)
安装开发环境
jdk8是主流
卸载JDk
- 删除Java安装目录
- 删除环境变量JAVA_HOME
- 删除path下关于JAVA的目录
- Java -version
安装JDK
- 百度搜索JDK8,找到下载地址 同意协议,下载电脑对应的版本,如64位操作系统下载 jdk-8u281-windows-x64.exe
- 双击安装JDK 记住安装路径
- 配置环境变量
1.我的电脑-》属性-》系统高级设置-》
2.环境变量 系统变量 新建–> JAVA_HOME输入对应的jdk安装路径
3.path变量–>% JAVA_HOME%\bin - 测试是否成功 cmd–>java -version
编译
- javac java文件.java 生成了class文件
- 运行class文件 java class文件
注意:文件名和类名必须保持一致
java运行机制
-
编译型
整本书翻译 编译器负责编译 执行速度更快 因为把所有东西都编译准备好了 -
解释型
找翻译官,实时翻译 eg.网页对速度要求高 使用解释型的语言 -
java语言是先编译,到操作系统再进行解释。
Java 源文件(.java)需要被编译成字节码文件(.class)才能在 Java 虚拟机(JVM)上运行。编译过程由 Java 编译器(javac)完成。编译生成的字节码文件需要在 Java 虚拟机(JVM)上运行。Java 虚拟机是 Java 程序的运行环境,它负责加载字节码文件、解释或编译字节码并执行程序。
java基础
idea中main方法的快捷键 psvm
注释
- 单行
- 多行 /* */
- 文档注释 /** */ 可以加参数 功能可以被识别
标识符
- 关键字
- 所有标识符都应该以 字母、$(美元符)、_(下划线) 开头
- 首字母之后可以是 字母、$、_ 或数字任何字符组合
- 关键字不能作为变量名或方法名
- 标识符大小写敏感
- 可以用中文命名,但不建议使用,即使用拼音命名也Low
数据类型
强类型语言
所有变量必须先定义后才能使用
强类型语言安全性高,速度慢
弱类型语言
JavaScript
基本类型
//整数
int num1 = 10; //最常用,只要别超过21亿(2^31-1)
byte num2 = 20; //-128~127
short num3 = 30;
long num4 = 30L; //long类型数字后面要加个L(尽量用大写,小写l容易与1搞混)
//小数:浮点数
float num5 = 50.1F; //float类型数字后面要加个F
double num6 = 3.141592653589793238;
//字符
char name = '国';
//字符串, String不是关键字,是类
//String namea = "薛之谦";
//布尔值:是非
boolean flag = true
什么是字节
- 位(bit):是计算机内部数据存储的最小单位,11001100是一个八位二进制数
- 字节(byte, B):是计算机中 数据处理 的基本单位,习惯上用大写B表示
1B(byte) = 8bit,1字节等于8位 - 字符:指计算机中使用的字母,数字,字和符号
1bit表示1位
1Byte表示一个字节 1B=8b
1024B = 1KB, 1024KB = 1M, 1024M = 1G
引用类型
类 接口 数组
扩展及面试题
//整数扩展: 二进制0b 八进制0 十进制 十六进制0x
int i = 10;
int i2 = 010; //八进制 8
int i3 = 0x10; //十六进制 16
//浮点数扩展:
//面试题:银行业务字母怎么表示钱? BigDecimal(数学工具类)
//float double是有问题的,最好避免使用浮点数进行比较
float f = 0.1f; // 0.1
double d = 1.0/10; //0.1
System.out.println(f==d); //false
//浮点数 位有限,舍入误差,大约 接近但不等于
//最好避免使用浮点数进行比较
float f1 = 23131313131f;
float f2 = f1+1;
System.out.println(f1==f2); //true
//字符扩展:所有字符本质还是数字
char c1 = 'a';
char c2 = '中';
System.out.println(c1); //a
System.out.println((int)c1);//强制类型转换,97
System.out.println(c2); //中
System.out.println((int)c2);//强制类型转换,20013
//编码 Unicode表(97=a,65=A)2字节(2^16) 0-65536
//U000~UFFFF 十六进制(u0061=a,相当于十进制的97)
System.out.println('\u0061'); //a '\'是转义字符
//转义字符
//\t 制表符
// \n 换行
//布尔值扩展
boolean flag = true;
if(flag==true){} //新手
if(flag){} //老手这样写 Less is More(代码要精简易读)
类型转换
由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
小数的优先级大于整数,
运算中,不同类型的数据先转化为同一类型,再进行运算。
- 强制转换,(类型)变量名,容量由高到低
- 自动转换,容量由低到高
//强制转换 (类型)变量名 高--低
//自动转换 低--高
int i = 128;
byte b = (byte)i; //强制转换 内存溢出 -128~127
double d =i; //自动转换
System.out.println(i); //128
System.out.println(b); //-128
System.out.println(d); //128.0
/*
注意点:
1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候,强制转换
4.转换的时候可能存在内存溢出,或者精度问题
* */
System.out.println((int)23.7); //23 丢失精度
char c = 'a';
int n = c+1;
System.out.println(n); //98
System.out.println((char)n); //b
//当操作数比较大时,注意溢出问题
//JDK7新特性,数字之间可以用下划线分割
int money = 10_0000_0000; //10亿,下划线不会被打印出来
System.out.println(money); //1000000000
int years = 20;
int total = money*years; //数据大,溢出
System.out.println(total); //-1474836480
long total2 = money*years; //默认是int,转换前就有溢出问题
System.out.println(total2); //-1474836480
long total3 = money*(long)years; //先把一个数转Long
System.out.println(total3); //20000000000
变量 常量 作用域
- 变量是什么:就是可以变化的量
- Java是一种强类型语言,每个变量都必须声明其类型
- Java变量是程序中最基本的存储单元,要素包括变量名,变量类型和作用域
//数据类型 变量名 = 值; type varName [=value][{,varName[=value]}]; //可以使用逗号隔开同多个类型的变量,但不建议在一行定义多个变量
注意事项
- 每个变量都有类型,类型可以是基本类型 也可以是引用类型
- 变量名必须是合法的标识符
- 变量声明是一条完整的语句 ,因此每个声明都必须以分号结束。
变量作用域
- 类变量 static(写在类里)
- 实例变量 (写在类中间)布尔值默认是false 除了基本类型 其余默认初始化都是null
- 局部变量 (写在方法里)
public class Variable{
static int allClicks = 0; //类变量 从属于类 随着类消失而消失
String str = "hello world"; //实例变量 (在方法外,类里)从属于对象 如果不自行初始化,默认值
public void method(){
int i=0; //局部变量(局部变量是在方法里)使用之前必须声明和初始化值
}
}
常量
相当于位置确定 位置里面存什么东西不确定
//常量一般用大写字符
final 常量名=值;
final double PI=3.14;
//修饰符 不存在先后顺序,static可以写final后面
static final doube PI=3.14; //类变量,该类下的全局范围
变量的命名规范
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写+驼峰原则:lastName
- 局部变量:首字母小写+驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写+驼峰原则:Man,GoodMan
- 方法名:首字母小写+驼峰原则:run(),fastRun()
运算符
int a=10;
int b=20;
System.out.println(a/b); //0
System.out.println((double)a/b); //0.5
long c=12300000000;
System.out.println(a+b); //int
System.out.println(a+c); //long 自动转换式子中容量大的数据类型
自增自减
// ++自增 --自减 单目运算符 一元运算符
int a = 3;
int b = a++; //b=a,a=a+1 先赋值 即b=3 a=4
int c = ++a; //a=a+1,c=a 先自增 即a=5 c=5
System.out.println(a); //5
System.out.println(b); //3
System.out.println(c); //5
//幂运算 2^3 2*2*2=8
double pow = Math.pow(2,3); // (底数,指数)double型
System.out.println(pow); //8.0
逻辑运算
&& 逻辑与运算:两个变量都为真,结果为true 短路与
// 与(snd) 或(or) 非(取反)
boolean a = true;
boolean b = false;
System.out.println(a&&b); // false
System.out.println(a||b); // true
System.out.println(!(a&&b)); // true
int c=5;
boolean d = (c<5)&&(c++<5); //第一个值为false,后面就不进行判定了
System.out.println(d); //false
System.out.println(c); //5 c++未执行
位运算
/*
A = 0011 1100
B = 0000 1101
A&B 0000 1101 按位与
A|B 0011 1101 按位或
A^B 0011 0001 异或
~B 1111 0010 非
面试题:2*8 怎么算最快? 2<<3
<<左移 *2 效率极高!! 箭头指向哪边往哪边移动
>>右移 /2
*/
System.out.println(2<<3); // 16
三元运算符
int a = 10;
int b = 20;
a+=b; // a = a+b
a-=b; // a = a-b
System.out.println(a); //10
//字符串连接符 + ,转化为String类型,然后拼接 注意!!
System.out.println(""+a+b); //1020
System.out.println(a+b+""); //30 先进行运算,再转为String拼接
System.out.println(a+b+"str"); //30str
包机制
- 为了更好地组织类,Java提供了包机制,由于区分 类名的命名空间
- 包的语法格式:
package pkg1[.pkg2[.pkg3...]];
- 一般利用公司域名倒置作为包名;com.kuangstudy.www
- 为了能够使用一个包的成员,需要在Java程序中导入该包
import package1[.package2…].(className|); //通配符 导入包下所有的类
JavaDoc生成文档
-
javadoc命令是用来生成自己API文档的 可以给类加 可以给方法加
- 参数信息
- @author 作者名
- @version 版本号
- @since 指明最早用的jdk版本
- @param 参数名
- @return 返回值情况
- @throws 异常抛出情况
1.打开某个类所在文件夹下的cmd命令行
2.输入:javadoc -encoding UTF-8 -charset UTF-8 Doc(类名).java
3.会自动生成该类有关的API文档,查看文件夹发现多了一些文件
4.打开 index.html(首页)查看文档注释
java流程控制
用户交互Scanner
- 之前我们学的基本语法并没有实现程序和人的交互,Java给我们提供了一个工具类,可以获取用户的输入java.util.Scanner是Java5的新特征,我们通过Scanner类来获取用户的输入。
Scanner s = new Scanner(System.in);
- 通过Scanner类的 next()与 nextLine()方法获取用户的字符串,读取前一般用hasNext()与hasNextLine()判断是否还有输入的数据。
//创建一个扫描器对象
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收");
//判断用户有没有输入字符串
if(scanner.hasNext()){ //使用hasNextLine()会接收一行 "hello word"
//使用next方式接收
String str = scanner.next();
System.out.println("输入的内容为:"+str);
//input: hello word
//输入的内容为:hello
}
//凡是属于IO流的类如果不关闭会一直占用资源
scanner.close();
hasNext()和hasNextLine() 区别
next()
- 一定要读取到有效字符才可以结束输入
- 对输入有效字符之前遇到的空白,next()方法会将其去掉
- 只有输入有效字符后才将其后面输入的空白作为结束符
- next()不能得到带有空格的字符串
nextLine()
- 以Enter作为结束符,即返回输入回车之前所有的字符
- nextLine()可以获取空白
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
int i=scanner.nextInt();
System.out.println("输入的整数为:"+i);
}else {
System.out.println("输入的不是整数数据");
}
选择结构
idea反编译
IDEA反编译之后.class文件与源代码对比 直接把.class文件丢到idea中就能看到反编译之后的
循环结构
java方法
方法包含一个方法头和一个方法体。
- 修饰符:可选,定义了方法的访问类型,告诉编译器如何调用该方法。
- 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法没有返回值,则returnValueType为关键字void。
- 方法名:是方法的实际名称,方法名与参数表共同构成方法签名。
- 参数类型:像一个占位符。方法被调用时,传递值给参数,该值称为实参或变量。参数列表是指方法的参数类型、顺序和参数个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
- 方法体:方法体包含具体的语句,定义该方法的功能。
方法的调用
调用方法:对象名.方法名(实参列表)。
- 扩展:值传递和引用传递 ( Java都是值传递)。
- 调用其他类的方法,除非是static静态方法,不然必须实例化这个类(new)
public class Demo01 {
public static void main(String[] args) {
int add = Demo01.add(1,2); // 通过类名直接调用静态方法
System.out.println(add); // 3
}
// static静态方法,否则就要new实例化来调用
public static int add(int a,int b){
return a+b;
}
}
静态方法(使用 static 关键字修饰的方法)是属于类本身的,而不是属于类的某个实例。在类加载到 Java 虚拟机(JVM)时,静态方法就已经被分配了内存空间,并且可以通过类名直接访问。这意味着不需要创建类的实例,就可以调用静态方法。
非静态方法(没有使用 static 关键字修饰的方法)是属于类的实例的,它们通常依赖于对象的状态(即实例变量的值)。每个对象都有自己独立的实例变量副本,非静态方法可能会访问或修改这些实例变量。因此,在调用非静态方法之前,必须先创建类的实例,以便明确该方法操作的是哪个对象的状态。
方法的重载
重载是在一个类中,有相同的方法名,参数列表不同的方法。
- 方法名称必须相同
- 参数列表必须不同(个数、参数类型、或排序不同)
- 返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以成为方法的重载
实现理论
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。