java学习( 持续更新)

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
  1. 删除Java安装目录
  2. 删除环境变量JAVA_HOME
  3. 删除path下关于JAVA的目录
  4. Java -version
安装JDK
  1. 百度搜索JDK8,找到下载地址 同意协议,下载电脑对应的版本,如64位操作系统下载 jdk-8u281-windows-x64.exe
  2. 双击安装JDK 记住安装路径
  3. 配置环境变量
    1.我的电脑-》属性-》系统高级设置-》
    2.环境变量 系统变量 新建–> JAVA_HOME输入对应的jdk安装路径
    3.path变量–>% JAVA_HOME%\bin
  4. 测试是否成功 cmd–>java -version

jdk下存放了哪些文件

编译
  • 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(首页)查看文档注释

使用idea生成javadoc文档

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 关键字修饰的方法)是属于类的实例的,它们通常依赖于对象的状态(即实例变量的值)。每个对象都有自己独立的实例变量副本,非静态方法可能会访问或修改这些实例变量。因此,在调用非静态方法之前,必须先创建类的实例,以便明确该方法操作的是哪个对象的状态。

方法的重载

重载是在一个类中,有相同的方法名,参数列表不同的方法。

  • 方法名称必须相同
  • 参数列表必须不同(个数、参数类型、或排序不同)
  • 返回类型可以相同也可以不相同
  • 仅仅返回类型不同不足以成为方法的重载

实现理论

方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值