阿乐小屋 - JavaSe++
type: channel
link: https://blogdx.com/index.php/tag/ja/
items: Java之反射
items: Java之多线程
items: java之IO流
items: java之泛型
items: java之集合
items: Java之异常
items: Java之对日期处理
items: Java之String类
items: Java之常用类

Java之反射
type: item
date: 2023-04-01T22:36:00+08:00
description: Java之反射什么是反射Java中的反射（Reflection）是指在程序运行时动态地获取类的信息（如类名、方法、属性等），并能够操作对象的方法和属性，而不需要预先知道这些信息。反射使得程序具有更高的灵活性和可扩展性，但也会带来一定的性能开销。反射的种类类名说明Field类类的成员变量Method类类的方法Constructor类的构造方法反射获取Class对象的三种方式Class.forName("全类名");类名.class对象.getClass();package Demo; public class Person { String name; int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }package Demo; import org.junit.Test; public class ReflectionTest { //第一种方式:Class.forName // 全类名： 包名+类名 (全类名) 通常用第一种方式 @Test public void show() throws ClassNotFoundException { //Class.forName("全类名").var Class<?> aClass = Class.forName("Demo.Person"); System.out.println(aClass); //class Demo.Person } //第二种方式：类名.class // 通常在多线程中使用 用来当对象锁 synchronized @Test public void show1() { //Person.class.var Class<Person> personClass = Person.class; System.out.println(personClass); //class Demo.Person } //第三种方式： 对象.getClass //有了这个类当对象的时候才可以使用 @Test public void show2() { //先实例化对象 通过对象去调用getClass Person p = new Person(); //p.getClass().var Class<? extends Person> aClass = p.getClass(); System.out.println(aClass); //class Demo.Person } }反射获取构造方法属性说明newInstance创建对象getConstructors获取公共的构造方法getDeclaredConstructor获取空参的构造方法getDeclaredConstructors获取所有的构造方法public class Person { String name; private int age; public Person() { } public Person(String name) { this.name = name; } //受保护的构造方法 protected Person(int age) { this.age = age; } //私有构造方法 通过暴力反射可以进行访问 private Person(String name, int age) { this.name = name; this.age = age; } }public class ReflectionTest02 { public static void main(String[] args) throws Exception { //1.获取Class字节码文件对象 Class aClass = Class.forName("Demo.Person"); //2.获取公共的构造方法 Constructor[] constructors = aClass.getConstr…

Java之多线程
type: item
date: 2023-03-30T13:21:00+08:00
description: 多线程在一个程序中同时执行多个线程，每个线程独立执行自己的代码片段，并且共享该程序的内存空间和系统资源相关概念什么是程序程序是一组指令和数据的集合，用于描述计算机执行特定任务的过程什么是进程进程就是正在运行的程序（进程是驻留在内存中的）每一个进程都有自己的PID什么是线程一个进程至少有一个线程。线程是程序内部的一条执行路径什么是多线程单线程吃饭的时候 先接电话 接完了以后在继续吃饭。（优雅）程序只有一个执行路径，所有的代码都是顺序执行的多线程人一边听歌一边抽烟一边打游戏 一心三用。（牛逼）每个线程都是独立执行的代码片段，程序通过启动多个线程来并发执行不同的任务或操作多线程的优点提高程序的执行效率和响应速度提高用户体验和交互性支持复杂的程序逻辑和业务需求充分利用计算机的多核 CPU 和并发处理能力提高程序的可靠性和安全性什么是并行、并发并行多个任务或操作同时执行，并在同一时间段内完成（多个事件在同一时刻发生）并发执行多个独立的任务或线程（100个人抢10张火车票、1000个人一起访问你的网站）线程的创建和启动1.1继承thread类以下示例中one类来继承Thread类并重写run()方法 表示创建了一个线程通过实例化调用start方法进行启动线程当运行这段程序时,就可以看到两个线程分别交替打印出1到100的奇数和偶数了Thread.currentThread().getName()是Thread类的静态方法，调用该方法可以获取当前执行线程的名称this.getName()是实例方法，只能在当前线程对象中使用总之 都可以用于获取当前线程的名称public class TestDemo { public static void main(String[] args) { //将线程进行实例化 one o = new one(); two t = new two(); //启动线程 o.start(); t.start(); } } //打印偶数 class one extends Thread{ @Override public void run() { for (int i = 0; i <= 50; i++) { if (i % 2 ==0) { //获取线程的名称 System.out.println(Thread.currentThread().getName() + "--->" + i); } } } } //打印奇数 class two extends Thread{ @Override public void run() { for (int i = 0; i <= 50; i++) { if (i % 2 != 0) { //获取线程的名称 System.out.println(this.getName() + ">>>" + i); } } } }1.2通过匿名内部类创建线程有很多时候我们在测试的时候没有时间创建好几个类进行测试 可以使用匿名内部类 这样比较方便new Thread(){}.start();大括号中重写run方法 在写代码块public class TestDemo2 { public static void main(String[] args) { new Thread(){ @Override public void run() { for (int i = 0; i <= 10; i++) { if (i % 2 != 0) { System.out.println(this.getName() + "奇数" + i); } } } }.start(); new Thread(){ @Override public void run() { for (int i = 0; i <= 10; i++) { if (i % 2 == 0){ System.out.println(this.getName() + "偶数：" + i); } } } }.start(); new Thread(){}.start(); } }2.1实现Runnable接口以下示例中TestDemo4类实现了Runnable接口重写run方法TestDemo4 当前实现类的对象将实现类的对象作为参数传递到Thread构造器当中public class TestDemo4 implements Runnable{ public static void main(String[] args) { //创建实现类对象 TestDemo4 td = new TestDemo4(); //将对象作为参数传递到Thread类的构造器中 创建Thread的实例 线程0 Thread t = new Thread(td); t.…

java之IO流
type: item
date: 2022-10-05T19:23:00+08:00
description: IO流File类的常用方法File file = new file("路径的名称");属性说明getAbsoluteFile获取绝对路径getPath获取路径getName获取名称getParent获取上一层的目录length获取长度lastModified获取最后一次修改的时间list获取目录下的文件或文件名listFiles获取目录下的文件或文件名返回绝对路径renameTo剪切+粘贴示例：public class FileTest { public static void main(String[] args) { //在内存方面上 File file = new File("Hello.txt"); //相对路径 在当前的工程下创建Hello.txt File file1 = new File("D:\\Demo\\untitled\\src\\Day02\\File\\Hi.txt"); //绝对路径 System.out.println("绝对路径是：" + file.getAbsoluteFile()); System.out.println("路径是：" + file.getPath()); System.out.println("名称是：" + file.getName()); System.out.println("上一层的文件目录为：" + file.getParent()); //若无上层目录返回为NULL System.out.println("长度为：" + file.length()); System.out.println("获取最后一次修改的时间为：" + new Date(file.lastModified())); System.out.println(); System.out.println("绝对路径是：" + file1.getAbsoluteFile()); System.out.println("路径是：" + file1.getPath()); System.out.println("名称是：" + file1.getName()); System.out.println("上一层的文件目录为：" + file1.getParent()); //若无上层目录返回为NULL System.out.println("长度为：" + file1.length()); System.out.println("获取最后一次修改的时间为：" + file1.lastModified()); System.out.println(); show(); System.out.println(); add(); } public static void show(){ //输出这个目录下的文件和文件名 File file = new File("D:\\Program Files (x86)\\Tencent"); String[] list = file.list(); for (String s : list) { System.out.println("获取到的目录为：" + s); } System.out.println(); File[] files = file.listFiles(); for (File f : files) { System.out.println("获取到的绝对路径为：" + f); } } public static void add(){ File file = new File("Hello.txt"); File file1 = new File("D:\\Demo\\untitled\\src\\Day02\\File\\Hi.txt"); //file必须存在 file1 不可以存在 这个操作相当于是将Helo.txt 剪切 到D\\Demo\\untitled\\src\\Day02\\File目录 在粘贴为Hi.txt //linux表示：mv D/Demo/untitled/Hello.txt /D/Demo/untitled/src/Day02/File/hi.txt 移动+重命名 boolean b = file.renameTo(file1); System.out.println(b); } }运行结果：绝对路径是：D:\Demo\untitled\Hello.txt 路径是：Hello.txt 名称是：Hello.txt 上一层的文件目录为：null 长度为：5 获取最后一次修改的时间为：Wed Dec 21 16:13:40 CST 2022 绝对路径是：D:\Demo\untitled\src\Day02\File\Hi.t…

java之泛型
type: item
date: 2022-10-04T19:22:00+08:00
description: 泛型Java 泛型（generics）是 JDK 5 新增的特性泛型的类型必须是类，不能是基本数据类型在JDK8当中创建泛型可以省略后面的 例如：GenericClass it = new GenericClass();GenericClass it = new GenericClass<>();java中泛型标记符：标记符说明EElement (在集合中使用，因为集合中存放的是元素)TType（Java 类）KKey（键）NNumber（数值类型）?表示不确定的 java 类型public class Test { public static void main(String[] args) { //使用泛型后 Map<Integer,String> map = new HashMap<>(); map.put(1,"张三"); map.put(2,"李四"); map.put(3,"王五"); map.put(4,"赵六"); Set<Map.Entry<Integer, String>> entries = map.entrySet(); for (Map.Entry<Integer,String> key : entries) { System.out.println(key.getKey() + "=" + key.getValue()); } } }自定义泛型类public class 类名 <泛型标记符>{ }//<T> 泛型的类型 public class Test <T>{ String name; int age; T test; public Test() { } public Test(String name, int age, T test) { this.name = name; this.age = age; this.test = test; } public T getTest() { return test; } public void setTest(T test) { this.test = test; } @Override public String toString() { return "Test{" + "name='" + name + '\'' + ", age=" + age + ", test=" + test + '}'; } }测试public class Test01 { public static void main(String[] args) { //如果定义了泛型类 实例化没有指明类型的泛型 则认为此泛型类型为Object类型 Test t = new Test(); t.setTest("likedx"); t.setTest(541884615); Object test = t.getTest(); System.out.println(test); //实例化指明泛型的类型为String Test<String> tt = new Test<>(); tt.setTest("https://likedx.com"); String test1 = tt.getTest(); System.out.println(test1); //下面会报错 因为指定了类型 //tt.setTest(123); //指明泛型的类型 Test<String> t2 = new Test<>("张三",18,"是大傻叉"); Test<Integer> t3 = new Test<>(); t3.setTest(18); } }P1的Test02不是泛型类 P2的Test02是泛型类public class Test02 extends Test<Integer>{}public class Test02<T> extends Test<T>{}总结自定义泛型类可能有多个参数 此时应将多个参数一起放在尖括号内 例如：<T1,T2,T3>泛型不同的引用不能相互赋值泛型类的构造器用默认的就可以如果泛型的类型不指定 泛型对应的类型均按照Object处理 但不等同于Object 要不用都别用泛型 要用就一路都用上静态方法中不能使用类的泛型异常类不能声明为泛型 public class MyException extends Exception{}父类有泛型子类可以选择保留泛型也可以选择指定泛型类型自定义泛型方法泛型方法和泛型类没有关系泛型方法可以声明为静态的public <泛型标识符> 返回值类型 方法名(泛型标识符[] 形参){ //方法体... }public class Test02 { public static void main(String[] args) { …

java之集合
type: item
date: 2022-10-03T19:21:00+08:00
description: 集合到底是什么数组就是一个集合 集合实际上就是一个容器 可以来容纳其他类型的数据集合与数组的区别数组的长度是固定的 集合的长度是可变的数组中存储的是同一类型的元素，可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。主要内容Collection集合迭代器增强forList集合Set集合学习目标[ ] 能够使用迭代器对集合进行取元素[ ] 能够使用集合存储自定义类型[ ] 能够说出什么是集合[ ] 能够说出集合与数组的区别[ ] 能够说出ArrayList、LinkedList、Vector区别[ ] 够说出Set集合各种实现类的区别[ ] 能够说出Collection和Map集合的区别[ ] 说出Map集合的常用功能[ ] 能够遍历Map集合[ ] 能够说出各种Map集合实现类的区别[ ] 能够简单阐述HashMap的底层实现[ ] 能够查询和使用集合工具类的相关方法[ ] 能够说出Set与Map的关系集合框架Collection接口：单列集合 用来存储一个一个的对象List接口：有序的 可重复 支持索引ArrayList：作为List接口的主要实现类；线程不安全 效率高 底层使用数组存储LinkedList：底层使用双向链表存储 线程不安全 执行效率高Vector：作为List接口的古老实现类；线程安全的 效率低 底层使用数组存储Set接口：无序的 不可重复的数据HashSet：作为Set接口的主要实现类 线程不安全的 可以存储NULL值LinkedHashSet：有序 作为HashSet的子类 遍历内部数据时 可以按照添加的顺序遍历 频繁的遍历操作 效率高与HashSetTreeSet：添加数据要求是同一类型Map接口：双列集合 用来存储一对一对的数据（Key - value）HashMap：作为Map的主要实现类；线程不安全 效率高 存储Null的Key和valueLinkedHashMap：在HashMap原有的基础上 添加了一对儿指针，指向前一个和后一个元素TreeMap：按照添加的Key-value进行排序 实现排序遍历Hashtable：作为古老的实现类；线程安全 效率低 不能存储Null的Key和valueProperties：用来处理配置文件 Key和value都是String类型Collection 常用功能属性说明add添加元素对象到当前集合中addAll添加新集合中的所有元素对象到当前集合中remove删除第一个找到的与obj对象equals返回true的元素removeAll删除所有与coll集合中相同的元素isEmpty判断当前集合是否为空集合contains判断当前集合中是否存在一个与obj对象equals返回true的元素containsAll判断c集合中的元素是否在当前集合中都存在size查询当前集合中实际存储的元素个数toArray集合转换为数组Arrays.asList数组转换为集合hashCode查询当前对象的哈希值Collection集合基本使用package Collection01; import java.util.*; public class CollectionTest { public static void main(String[] args) { //1.添加元素 Collection coll = new ArrayList(); coll.add("张三"); coll.add(new String("Tom")); coll.add("李四"); Collection coll1 = new ArrayList(); coll1.add("likedx"); coll1.add("likedx1"); coll1.add("李哈哈"); coll1.add("李四"); //添加新集合中的所有对象到当前集合中 coll.addAll(coll1); System.out.println(coll); //2.删除元素 //coll.remove("张三"); //删除所有并且与coll集合中相同的元素 //coll.removeAll(coll1); System.out.println(coll); //3.判断元素 System.out.println("判断coll是否为空的集合" + coll.isEmpty()); System.out.println("判断张三是否存在Coll集合中" + coll.contains("张三")); System.out.println("判断coll1集合中的元素是否在当前集合中都存在" + coll.containsAll(coll1)); //4.查询 System.out.println(…

Java之异常
type: item
date: 2022-09-29T19:17:00+08:00
description: 异常异常的概念异常指的是程序运行时发生的不正常事件；异常能够被程序处理，保证程序继续运行下去public class Demo { public static void main(String[] args) { int a = 10; int b = 0; //明知10/0 除不尽 非要运算导致算数异常 //java.lang.ArithmeticException System.out.println(a/b); } }开车--->撞车--->报警--->继续开车（由开车到撞车到报警解决问题）程序--->运行--->异常--->处理异常（程序运行出现异常、能够被处理还可以继续运行）开车--->撞车--->不报警--->协商无果--->打架（撞车处理不当导致事情无法解决）程序--->运行--->错误--->程序终止--->修改代码（程序运行出现错误、异常无法处理导致程序崩溃）异常结构图图中所示:Throwable是Java中所有错误（Error）和异常（Exception）的父类。在Java中，所有的异常和错误都必须继承自Throwable类。Error（错误）：JVM内部错误或系统错误，这类错误一般由JVM或操作系统引起，而程序本身一般无法处理和恢复。Exception： 程序运行过程中可能会出现的异常情况，包括可检查异常（Checked Exception）和不可检查异常（Unchecked Exception）两种类型。RuntimeException：子类都是运行时异常 其他都为编译时异常异常的语法public class Demo { public static void main(String[] args) { try{ //产生异常的代码段 }catch (异常类型 1){ //异常类型代码块 }finally { //最后执行的语句块 } } }try-catch-finally 块中使用 return 语句时，finally 块中的代码会在返回结果之前执行，但是通常情况下，return 语句仍然是最后执行的语句有一个特殊情况 finally 块可能不会被执行。那就是在程序运行的时候遇到了 System.exit() 方法调用。System.exit() 方法并不仅仅只在 finally 块中会导致程序退出。在任何地方调用这个方法都会使程序立即退出，包括在 main() 方法中调用 System.exit() 也会导致 JVM 关闭public class Demo { public static void main(String[] args) { //show(10,0); //单独执行只是说抛出了异常没有处理 try { show(10,0); } catch (Exception e) { e.printStackTrace(); //打印异常错误信息 } } public static void show(int a,int b){ if (b == 0) { //主动抛出异常 一般在方法内部使用但是并没有处理 throw new ArithmeticException("出现算数异常"); } } }public class Demo { public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat(); Date date = new Date(); String str = sdf.format(date); System.out.println(str); //23-3-6 下午11:13 String s = "23-3-6 下午11:12"; //当出现异常直接对异常进行捕捉处理 try { Date parse = sdf.parse(s); } catch (ParseException e) { e.printStackTrace(); } System.out.println("s = " + s); //s = 23-3-6 下午11:12 } }自定义异常定义异常类--->继承Throwable类、继承Exception类或者RuntimeException类--->编写构造方法继承父类的实现--->实例化自定义对象--->使用throw抛出public class MyException extends Exception{ private int a; public MyException(int a) { this.a = a; } //打印异常信息 @Override public String toString() { return "MyException…

Java之对日期处理
type: item
date: 2022-09-28T19:16:00+08:00
description: Java日期类java.util.Date类封装当前的日期和时间 大部分方法都已经过时第一代日期类Date属性说明long getTime();获取当前时间，时间戳void setTime(long time);设置时间boolean after(Date when)测试此日期是否晚于指定日期。boolean before(Date when)测试此日期是否早于指定日期。public class DateTest2 { public static void main(String[] args) { //gettime 获取当前系统毫秒时间 (时间戳) Date d = new Date(); System.out.println(d.getTime()); //获取今天时间 此方法已过时 System.out.println(d.toLocaleString()); //获取昨天时间 Date d2 = new Date(d.getTime()-(60*60*24*1000)); System.out.println(d2.toLocaleString()); //比较今天是否晚于昨天 boolean after = d.after(d2); System.out.println(after); //比较今天是否早于昨天 boolean before = d.before(d2); System.out.println(before); } }SimpleDateFormat类属性说明format将一个Date格式转化为日期/时间字符串，此方法继承的父类DateFormat的方法parse从给定字符串的开始解析文本，以生成一个日期，此方法为继承的父类DateFormat的方法java.text.DateFormat类是日期/时间格式化子类的抽象类，它以与语言无关的方式格式化并解析日期或时间public class DateTest3 { public static void main(String[] args) throws ParseException { //创建日期 Date date = new Date(); //对日期进行格式化 //格式:yyyy-MM.dd HH:mm:ss SSS SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); System.out.println(sdf.format(date)); //字符串转换为时间 String str = "2001-10-17 10:17:15 888"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); Date parse = sdf1.parse(str); System.out.println(parse); } }第二代日期类CalendarDate类用于返回日期对象，不适合获取日历字段。设置和获取日历字段的方法，被JDK1.1推出的Calendar代替。属性说明getInstance()使用默认时区和语言环境获得一个日历，也可以通过getInstance(TimeZone time,Locale loc)或指定时区和语言环境的日历get(int field)获取指定日历字段set(int year,int month,int date,int hourOfDay,int minute,int second)设置字段YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE和SECOND的值public class DateTest4 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); int Year = calendar.get(Calendar.YEAR); //年 int Month = calendar.get(Calendar.MONTH)+1; //1月从0开始 月 int DayMonth = calendar.get(Calendar.DAY_OF_MONTH); //日 int Hour = calendar.get((Calendar.HOUR)); //时 int Minute = calendar.get(Calendar.MINUTE); //分 int Second = calendar.get(Calendar.SECOND); //秒 System.out.println(Year + "-" +…

Java之String类
type: item
date: 2022-09-27T19:16:00+08:00
description: String类Java中的String类是一个不可变的字符串类型。属于引用类型，由于String对象是不可变的，所以每次对字符串进行操作时都会创建新的String对象构造方法属性说明public String()创建空白的字符串 不包含任何内容public String(String original)根据传入的字符串 创建字符串对象public String(char[] chs)根据字符数组 创建字符串对象public String(byte[] chs)根据字节数组 创建字符串对象public class StringDemo { public static void main(String[] args) { String s = "阿乐的小屋"; String s1 = new String("阿乐的小屋"); String s2 = new String(); //传递一个字符数组 将数组转换为字符串对象 char [] chs = {'a','b','c'}; chs[0] = 'z'; String s3 = new String(chs); //zbc //传递一个字节数组 将数组转换为字符串对象 byte [] bytes = {97,98,99,100,101}; bytes[0] = 90; String s4 = new String(bytes); //Zbcde } }String内存分析在使用双引号直接赋值的时候，系统会检查字符串在字符串常量池中是否存在 不存在就创建新的 存在了就复用 所以str = str1使用String构造方法new String创建两个对象 那么这两个对象在内存上地址是不相同的字符串的比较public class StringDemo02 { public static void main(String[] args) { String s = "blgodx.com"; String s1 = "Blgodx.com"; int a = 10; int b = 10; // == 如果是基本类型 比较的是数据值 如果是引用类型比较的地址值 System.out.println(s == s1); //true //比较字符串是否相同 System.out.println(s.equals(s1)); //true //忽略大小写进行比较 System.out.println(s.equalsIgnoreCase(s1)); //以下使用的==进行比较两个对象内存地址 由于Scanner是在栈内存中创建的 而str1是在堆内存中创建的 所以两个地址并不相同 Scanner scan = new Scanner(System.in); System.out.print("请输入一个字符串:"); String str = scan.next(); String str1 = "abc"; System.out.println(str == str1); } }String常用方法属性说明public boolean isEmpty()判断是否为空public boolean startsWith(String prefix)判断字符串以什么开头public boolean endsWith()判断字符串以什么结尾public String toUpperCase()将字符串小写转换为大写public String toLowerCase()将字符串大写转换为小写public char charAt()查找索引输出字符串public int indexOf(String str)查找字符串输出索引下标public int lastIndexOf()查找最后一个字符串的下标public String substring(int beginindex)从下标起始位置截取到结束public String substring(int beginindex,int beginendindex)从起始下标到结束下标截取字符串public String trim()去除字符串中的空格public String replace(char old Char,char newChar)将旧的字符替换为新的public class StringDemo { public static void main(String[] args) { String str = "blogdxm.com"; System.out.println(str.isEmpty()); //是否空 false System.out.println(str.startsWith("b")); //判断是否以b开头 true…

Java之常用类
type: item
date: 2022-09-26T19:28:00+08:00
description: Java常用类Object类Object是所有类的父类 所有类都默认继承了Object类属性说明hashCode返回该对象的哈希码值equals比较字符串是否相等toString返回对象的字符串表示形式getclass获取对象运行时类的class对象hashcodepublic class Demo { public static void main(String[] args) { String a = "张三"; String b = "李四"; System.out.println(a.hashCode()); //774889 System.out.println(b.hashCode()); //842061 System.out.println(a.hashCode() == b.hashCode()); //false } }equalspublic class Demo1 { public static void main(String[] args) { String a = "likedx.com"; String a1 = new String("likedx.com"); System.out.println(a.equals(a1)); //true String b = "likedx"; //这里用了字符串的拼接 b += ".com"; System.out.println(b.equals(a)); //true } }equals和==有什么区别equals用来比较字符串是否相同==用来比较字符串的内存地址toStringpublic class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //这里可以用快捷键生成 alt+ins public String toString() { return "name = " + name + "\t" + "age = " + age; } }public class Demo2 { public static void main(String[] args) { Student s = new Student("张三",15); //这里调用的就是toString方法 System.out.println(s); //name = 张三 age = 15 } }getClasspublic class Demo3 { public static void main(String[] args) { Demo3 d = new Demo3(); System.out.println(d.getClass()); //class Demo3.Demo3 } }Math类属性说明Math.abs(a)取a的绝对值Math.sqrt(a)取a的平方根Math.cbrt(a)取a的立方根Math.max(a,b)取a、b之间的最大值Math.min(a,b)取a、b之间的最小值Math.pow(a,b)取a的b平方public class Demo3 { public static void main(String[] args) { //abs 绝对值 System.out.println("【绝对值】"+Math.abs(-10.3));//结果： 10.3 System.out.println("【最大值】"+Math.max(10,30));//结果： 30 System.out.println("【最小值】"+Math.min(10,30));//结果： 10 System.out.println("【正弦值】"+Math.sin(3.56));//结果： -0.4063057021444168 System.out.println("【对数值】"+Math.log(20));//结果： 2.995732273553991 } }Random类属性说明Random生成一个对象nextInt生成一个随机数，如果有参数则生成一个在0~参数之间的随机数next…