java笔记
第一天:安装JAVA环境
打开网址:https://www.azul.com/downloads/?version=java-8-lts&os=windows&package=jdk#zulu
选择JDK下载
安装
执行java -version
代表安装完成
执行java程序
输入CMD
编译程序javac
编译完生成clss文件
运行编译文件 java Nihao
计算机执行class二进制文件,程序完成~
安装IDEA环境与使用
第二天 java基本语法:
public class Nihao { //class 申明一个类 public static void main(String[] args) { //main方法 System.out.println("Hellow World!"); //打印输出字符串 System.out.println("鸡哥你太美!"); } }
1.申明一个类
public class Nihao {
public class Nihao { //class 申明一个类 public static void main(String[] args) { //main方法 int x; //声明一个整数类型的变量 x = 10; //赋值x=10 System.out.println(x); //打印x这个值 int a,b; //申明a和b都是整数类型 a = 11; b = 12; System.out.println(a); System.out.println(b); } }
第三天基本的数据类型
名称 | 空间(bit) | 范围 |
byte | 8 | -128~+127 |
short | 16 | -32768~+32767 |
int | 32 | -21亿~+21亿 |
long | 64 | -92万兆~+92万兆 |
名称 | 空间(bit) | 范围 |
float | 32 | |
double | 64 | 最大 |
字符类型
名称 | 空间(bit) | 范围 |
char | 16 | 0~65535 |
String |
布尔类型 boolean
名称 | ||
true | 真 | 1 |
false | 假 | 0 |
符号 | 名称 |
> | 大于号 |
> | 小于号 |
== | 等于号(单个等号是赋值) |
!= | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
&& | 与运算 | 要求两边同时为true 才能返回true |
|| | 或运算 | 要求两边至少有一个为true才能返回true |
! | 非运算 | 一般放在表达式最前面,表达式用括号括起来,表示表达式的结果进行反转 |
if(条件判断) else 其他选择
if(条件判断) else if 循环判断
default其他情况
示例:
快捷方式
contnue 跳过某一轮循环
if (i == 1) contnue;
break 提前结束循环
先执行在判断 do while语句
public class shuixianhua { public static void main(String[] args){ for (int i = 100; i < 1000; i++) { int a =i % 10; int b =i /10 % 10; int c =i /100 % 10; if (a*a*a + b*b*b + c*c*c == i) System.out.println(i+"是水仙花束"); } } }
public static void main(String[] args){ for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) System.out.print(j+ "X" +i+ "=" +i*j+ " "); System.out.println( ); } }
public class Person { //这是一个类 String name; //属性 int age; //属性 String sex; //属性 }
public class Main { public static void main(String[] args) { //主方法 Person person = new Person(); //引用类创建对象 person.name = "小严"; //使用类属性 person.age = 18; //使用类属性 person.sex = "男"; //使用类属性 System.out.println(person.name); } }
方法的创建和使用
方法就是类的行为,比如一个人会跳会走路,会唱歌
方法定义:
返回值类型 方法名称( ){
方法体……
}
Void 表示方法没有返回值
public class Person { //这是一个类 String name; //属性 int age; //属性 String sex; //属性 void hello(){ //创建个没有返回值(void)的方案,名字叫做 hello System.out.println("我叫 " + name + ",今年" + age + "岁!"); //方法体内容是打印 } }
使用方法
public class Main { public static void main(String[] args) { //主方法 Person person = new Person(); //引用类创建对象 person.name = "小严"; //使用类属性 person.age = 18; //使用类属性 person.sex = "男"; //使用类属性 person.hello(); //使用自定义的hello方法 } }
我叫 小严,今年18岁!
进程已结束,退出代码0
int sum(int a,int b){ //创建一个有返回值 int 类型方法,在括号内定义类型和参数名称 形式参数 int c = a + b; //方法体:计算a+b return c; //返回输出值C 告诉别人返回结果 }
使用此方法
//int a = 18; //int b = 20; //int jisaun = person.sum(a,b); int jisaun = person.sum(18,21); System.out.println(jisaun);
形参/实参
方法中的参数/实际参数
方法的传递
外部的使用的方法,实参在类只做复制
引用自己的类改变的就是同一个类
第八天 方法进阶
int sum(int a,int b){ //创建一个有返回值 int 类型方法,在括号内定义类型和参数名称 形式参数 int c = a + b; //方法体:计算a+b return c; //终止方法 返回输出值C 告诉别人返回结果 } double sum(double a,double b){ //方法的重载,方法名一样,作用智能,sum这个方法能同时支持 int和double类型计算 double c = a + b; //方法体:计算a+b return c; //终止方法 返回输出值C 告诉别人返回结果 }
方法之间可以互相调用
void test(){ say(); //直接方法名,调用类中方法 } void say(){ test(); }
构造方法 (构造函数)
成员变量初始化操作存储地
Person(){ //java编译出来的class文件中自带一个构造方法,类名字(){} }
我们可以去声明,手动去修改
//第一个构造方法 Person(String name,int age,String sex){ //java编译出来的class文件中自带一个构造方法 //new 使用则会个类,必须需要形参 this.name=name; this.age=age; this.sex=sex; } Person (){//创建2个构造方法 }
类中有代码块执行顺序,初始值-代码块-构造方法
执行顺序
package com.tset; //package 关键字代表类位置 import com.tset.entity.Person; //引用其他路径下的类
java中引用了访问权限控制,我们可以为成员变量、成员方法、静态变量、静态方法甚至是类指定访问权限
默认:类本身和同包类访问
private-私有 只能被当前类访问
protected-受保护,只能被当前类和同胞中其他类访问,也可以被子类访问
public 公开的类,可以在任何地方使用
静态方法可以通过 import直接导入
import static com.tset.entity.Person.agetest;
第11天 类三大特性
继承 封装 多态
private void abc(){ System.out.println("这是一个限制当前类访问的方法"); } public void def(){ //可以通过公开的方法来使用封装的方法 abc(); }
通过关键字
public class Worker extends Person{ //创建Person子类,使用extends关键字 指定父类Person }
关键字 super 父类
当继承父类有构造函数 形参的时候,子类一样需要给默认值 (无参可以省略)
public class Person1 { //父类 String name; int age; String sex; public Person1(String name,int age,String sex){ //父类在构造函数的时候需要形参初始化 this.name=name; this.age=age; this.sex=sex; } }
子类继承方式,需要super (形参)
public class Student extends Person1{ public Student(String name,int age,String sex){ //与父类构造函数相同 super(name,age,sex); //值 } }
关键字
Person1 person1 = new Student("小明",18,"男"); if(person1 instanceof Student){ //instanceof 判断对应类型,是不是子类继承类 System.out.println("是Student类型的"); }
返回值真
另外子类的属性跟父类属性可以同名但是使用的时候子类方法使用的是优先子类中的属性
比如:
public class Worker extends Person1{ String name; public Worker(String name, int age, String sex) { super(name, age, sex); } //创建Person子类,使用extends关键字 指定父类Person public void work(){ System.out.println("我是 "+name+",我在工作!"); //这里的name是之当前类中的name非父类name } }
Worker worker = new Worker("小严",29,"男"); worker.work();//输出的结果是 我是 null,我在工作!
如果说上面方法中需要使用的是父类的属性name需要加关键字 super.name
public class Worker extends Person1{ String name; public Worker(String name, int age, String sex) { super(name, age, sex); } //创建Person子类,使用extends关键字 指定父类Person public void work(){ System.out.println("我是 "+super.name+",我在工作!"); //这里的name是之当前类中的name非父类name } } Worker worker = new Worker("小严",29,"男"); worker.work(); //我是 小严,我在工作!
继续完事了记得总结
Object类 所有类的祖宗
equals 方法 用户判断当前对象跟传入对象是否是同一对象
注意这里指判断是否同一对象并非值
@Override //@屎黄色的是注解 public boolean equals(Object obj) { //重写方法要求于父类定义完全一致 //equals 方法是检测一个对象是否等于另一个对象 对象A.equals(对象B)等于返回true 不等于则返回 files if (obj == null) return false; //方法体的内容:如果obj 等于 null 结束判断返回false if (obj instanceof Person1){ Person1 person1 = (Person1) obj; //强制转换类型进行比较 return this.name.equals(person1.name) && //字符串比较不能用=号,需要用equals //这里相等equals就会返回真 this.age == person1.age && this.sex.equals(person1.sex); } return false; }
注意如果我不希望别的子类重写某些方法 可以在方法前面加 final关键字 表示最终形态
System.out.println("方法一");
}
public abstract class Person2 { //这是说明这是一个抽象类 String name; int age; String sex; public Person2(String name,int age,String sex){ this.name=name; this.age=age; this.sex=sex; } protected abstract void exam(); //protected-受保护,只能被当前类和同胞中其他类访问,也可以被子类访问 //abstract 这是一个抽象方法,子类必须重写 }
有抽象方法的一定是抽象类,有抽象类不一定有抽象方法
public interface Study { //interface定义为接口 //接口里只能有抽象方法 void study();//public abstract(定义抽象类/方法) 可以省略默认的 }
使用抽象方法class 类名 + implements + 接口名
public class Student1 extends Person2 implements Study{ //implements 实现接口的意思 Study 接口名 public Student1(String name, int age, String sex) { super(name, age, sex); } public void study(){ System.out.println("我学习比较佛西"); } }
友情解释一下new Person 就是对类进行实例化
接口可以继承多个
public class Student1 extends Person2 implements Study,Cloneable{ }
Study 和 Cloneable 都是接口类
public interface Study { //interface定义为接口 //接口里只能有抽象方法 void study();//public abstract(定义抽象类/方法) 可以省略默认的 default //定义抽象方法默认实现 void test (){ System.out.println("我是默认实现"); } }
第十五天介绍一下Object类中提供克隆的方法
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
需要将 protected 升级成 public
Student1 student1 = new Student1("小静",29,"保密"); //复制过程 1.使用复制函数 student1.clone //2. student1 clone = student1.clone //3.强制转换 给的是Object 转给 Student1 Student1 clone = (Student1) student1.clone(); //student1 复制成 clone
在 Java 中,对象的克隆是通过 clone()
方法来实现的。clone()
方法定义在 Object
类中,因此所有的类都可以调用该方法来创建自身的副本(克隆)。
然而,在使用 clone()
方法进行对象克隆时,需要进行类型转换。这是因为 clone()
方法返回的是一个 Object
类型的引用,而不是原始对象的类型。为了将其赋值给特定类型的变量,我们需要将其强制类型转换为目标类型。
在你提供的代码中,student1
是一个 Student1
类型的对象,而 clone()
方法返回的是一个 Object
类型的引用。为了将克隆得到的对象引用赋值给 Student1
类型的变量 clone
,所以需要进行强制类型转换,即 (Student1) student1.clone()
。
下面是一个示例说明:
class Student1 implements Cloneable { private String name; // 构造函数和其他方法省略 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Main { public static void main(String[] args) { Student1 student1 = new Student1(); try { Student1 clone = (Student1) student1.clone(); // 克隆成功,将克隆得到的对象引用赋值给 Student1 类型的变量 clone } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
需要注意的是,为了使一个类能够被克隆,该类必须实现 Cloneable
接口,并且覆盖 clone()
方法。在上述示例中,Student1
类实现了 Cloneable
接口,并重写了 clone()
方法。
强制类型转换(也称为显式类型转换)是将一个数据类型转换为另一个数据类型的操作。在Java中,当需要将一个较大范围的数据类型转换为较小范围的数据类型时,就需要进行强制类型转换。
强制类型转换的格式如下:
目标类型 变量名 = (目标类型) 表达式;
以下是关于强制类型转换的一些要点:
- 强制类型转换会丢失精度或导致数据截断。当将一个可以表示更大范围数据的类型转换为较小范围的类型时,可能会丢失一些信息。
- 强制类型转换只能在具有继承或实现关系的类之间进行。例如,可以将子类对象转换为父类对象,或者将实现接口的类转换为该接口类型。
- 强制类型转换应该谨慎使用。由于可能导致数据丢失或错误,因此在进行强制类型转换时,需要确保转换是安全和合理的。
- 在进行强制类型转换之前,最好进行类型检查,以避免在转换过程中发生异常。可以使用
instanceof
运算符来检查对象是否属于特定的类或接口。
以下是一个示例说明强制类型转换的情况:
double d = 3.14; int i = (int) d; // 强制类型转换,将 double 类型转换为 int 类型 System.out.println(i); // 输出:3
在这个示例中,double
类型的变量 d
被强制转换为 int
类型,并赋值给 i
。由于强制类型转换会舍弃小数部分,所以 3.14
的小数部分被丢弃,结果为 3
。
需要注意的是,如果进行不合理的强制类型转换,例如将一个无关类之间进行转换或者超出目标数据类型范围的转换,可能会导致编译错误或运行时异常。
总之,强制类型转换是一种将一个数据类型转换为另一个数据类型的操作,但需要注意潜在的精度损失和数据截断问题。确保在进行强制类型转换时谨慎操作,并尽可能进行类型检查以避免异常情况的发生。
对象克隆的主要作用是:
-
数据保护:通过克隆,可以创建一个对象的副本,并对副本进行修改或处理,而不会影响到原始对象。这样可以保护原始对象的数据完整性和安全性。
-
提供备份机制:克隆允许在需要时创建对象的备份,以便在某些操作失败或发生错误时,能够恢复到之前的状态。
-
性能优化:在某些情况下,直接克隆对象比重新创建一个新对象更高效。克隆避免了重新初始化对象所需的成本和时间,因为已经有一个具有所需属性的现有对象。
需要注意的是,对象的克隆是浅拷贝(Shallow Copy),即只复制对象本身和其内部引用类型的地址,而不会递归复制引用的对象。如果需要进行深拷贝(Deep Copy),也就是复制所有嵌套对象的副本,需要自行实现。
快速生成方法
在Java中,Getter和Setter是一种常见的命名约定,用于访问和修改类的私有属性(成员变量)。Getter用于获取属性的值,而Setter用于设置属性的值。这个约定有助于封装和控制属性的访问。
以下是关于Getter和Setter的一些要点:
-
Getter方法:Getter方法用于返回私有属性的值。它通常以
get
为前缀,后跟首字母大写的属性名称,没有参数,并指定返回类型为属性的数据类型。例如,如果有一个名为name
的私有属性,那么对应的Getter方法应该命名为getName()
。 -
Setter方法:Setter方法用于设置私有属性的值。它通常以
set
为前缀,后跟首字母大写的属性名称,并且接受一个参数,参数类型与属性的数据类型相同或兼容。通常情况下,Setter方法不返回任何值,因此声明为void
类型。例如,如果有一个名为name
的私有属性,对应的Setter方法应该命名为setName(String name)
。 -
Getter和Setter方法的命名约定遵循JavaBean规范。这样做的好处是可以通过标准化的命名方式来自动生成代码,提高了代码的可读性和维护性。
-
Getter和Setter方法使得类的属性能够被外部访问和修改,并且可以在内部进行数据验证、控制和逻辑处理。
以下是一个示例,展示了如何使用Getter和Setter方法:
class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Main { public static void main(String[] args) { Person person = new Person(); person.setName("Alice"); System.out.println(person.getName()); // 输出:Alice } }
十七天 枚举类
enum 枚举名
1。创建枚举
public enum Status { RUNNING, STUDY, SLEEP; }
2.方法名改为枚举名字
public class Test { public Status status; public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } }
3.使用枚举
public class Main1 { public static void main(String[] args) throws CloneNotSupportedException { Test test = new Test(); test.setStatus(Status.SLEEP);
System.out.println(test.getStatus()); } }
进阶使用,覆盖构造方法,获取中文名称
package com.tset.entity; public enum Status1 { RUNNING("睡觉"), STUDY("学习"), SLEEP("跑步"); //因为覆盖了构造方法 枚举需要添加实参 名字后面+(实参) private final String name; //添加枚举的成员变量 Status1(String name){ //覆盖原有的构造方法 this.name = name; } public String getName(){ //获取封装的成员变量 return name; } } //顺序是当作一个类 添加了个属性,覆盖了构造方法,枚举名称需要添加实参,后面获取的时候可以获取枚举值.getName名称
public class Main1 { public static void main(String[] args) throws CloneNotSupportedException { Test2 test2 = new Test2(); test2.setStatus(Status1.RUNNING); System.out.println(test2.getStatus().getName());
//获取中文名称 } }
包装类实际上就是将我们的基本数据类型,封装成一个类(运用了封装思想)
public class Main3 { public static void main(String[] args) { //高级 包装类 Integer i = new Integer(10); System.out.println(i); } }
字符串转 int 类型 转换方法
public class Main3 { public static void main(String[] args) { //高级 包装类 Integer i = new Integer(10); //包装类 System.out.println(i); BigInteger a = BigInteger.valueOf(100); //特殊类,超大整数计算 System.out.println(a); BigDecimal b=BigDecimal.valueOf(10); //特殊类 超小小数 b = b.divide(BigDecimal.valueOf(3),100, RoundingMode.CEILING); //计算10/3的结果,精确到小数点后100位 //RoundingMode是舍入模式,就是精确到后一位时,该怎么处理,这里CEILING表示向上取整 System.out.println(b); } }
十九天数组
public class Main3 { public static void main(String[] args) { //定义一个一维数组变量 = 数组是10个int变量 int[] array = new int[10]; //语法:类型[] 名称 = 新建 类型[数据空间个数] System.out.println("数组的第一个元素为:"+array[0]); //使用变量名[下标]的方式访问 int[] array1 = new int[]{1,2,3,4,6}; //默认给array1 5 个int变量空间 分别是值 12346 System.out.println(array1.length); //length 方法访问数组长度 System.out.println("数组的第一个元素为:"+array1[0]); //使用变量名[下标]的方式访问 //注意 数组的下标是从0开始不是从1
System.out.println(array1[0]);
}
}