01-Java开发基础语言

一、数据类型

1.1 类型

  1. int
  2. double
  3. float
css 复制代码
float b = 2f;//float数据类型必须加f
  1. String
  2. boolean
  3. 数组
less 复制代码
 //初始方式一
 int []a = {1,2,3}
 //初始方式二
 int []a = new int[3]

1.2 强制转换

java强制转换通过(type)a实现

ini 复制代码
float a = 1.23f;
int b = (int)a;

二、输入、输出

2.1 输出

2.1.1 字符串

csharp 复制代码
System.out.println("abc");//换行
System.out.print("abc");

2.1.2 格式化输出

arduino 复制代码
 System.out.printf("abc%ddef",123);//abc123def

2.2 输入

2.2.1 非字符串类型输入

ini 复制代码
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
double b = scanner.nextDouble();

2.2.2 字符串输入

next()与nextLine()

next遇到空格或回车结,而nextLine一次读取一行,遇到回车结束。nextLine与其它类型输入混用时需要吸收回车

案例一:纯nextLine输入:输入1\n2\n

ini 复制代码
String a,b;
Scanner scanner = new Scanner(System.in);
a = scanner.nextLine();
b = scanner.nextLine();
System.out.println(a);//1
System.out.println(b);//2

案例二:nextLine与其它输入混合:输入1\n2\n

ini 复制代码
String a,b;
Scanner scanner = new Scanner(System.in);
a = scanner.next();
scanner.nextLine();//吸收回车
b = scanner.nextLine();
System.out.println(a);//1
System.out.println(b);//2

三、类

3.1 继承

子类继承父类的属性、方法,非private的都可以访问。

java 复制代码
import java.util.Scanner;
class Person{
  private String name;
  private int age;
  public Person(String name,int age){
    this.name = name;
    this.age = age;
  }
  public void sayHello(){
    System.out.println("Hello,I am "+name);
  }
}
class Student extends Person{
  public Student(String name,int age){
    super(name,age);
  }
}
public class Main{
  public static void main(String[] args) {
    Student student = new Student("张三",20);
    //System.out.println(student.name);//error
    student.sayHello();
  }
}

3.2 重载与重写

  • 重载:方法名相同,参数的类型和个数不同
  • 重写:父子类继承中,方法必须完全相同
csharp 复制代码
class Person{
  private String name;
  private int age;
  public Person(String name,int age){
    this.name = name;
    this.age = age;
  }
  public String getName(){
    return name;
  }
  public void sayHello(){
    System.out.println("Hello,I am father"+name);
  }
}

class Student extends Person{
  public Student(String name,int age){
    super(name,age);
  }
  //重写父类方法
  public void sayHello(){
    System.out.println("Hello,I am son"+super.getName());
  }
  //重载
  public void sayHello(String name){
    System.out.println("Hello,I am son"+name);
  }
}

3.3 多态

多态必须同时满足两个条件

  1. 子类对父类方法的重写
  2. 父类引用指向了子类对象

注意点父类引用只能访问子类重写的方法,其它的都无法拿到

typescript 复制代码
class Person{
  private String name;
  private int age;
  public Person(String name,int age){
    this.name = name;
    this.age = age;
  }
  public String getName(){
    return name;
  }
  public void sayHello(){
    System.out.println("Hello,I am father"+name);
  }
}

class Student extends Person{
  public Student(String name,int age){
    super(name,age);
  }
  //重写父类方法
  public void sayHello(){
    System.out.println("Hello,I am son"+super.getName());
  }
}

class Main{
    public static void main(String[] args) {
    Person student = new Student("张三",20);
    student.sayHello();
  }
}

3.4 抽象类

  1. 子类继承抽象类时,必须实现抽象类的抽象方法,除非子类自己是抽象类
  2. 抽象类里的抽象方法只能是方法体,不能实现。
  3. 抽象类是不能被new的,只用于被继承
java 复制代码
//抽象类可以有抽象方法和普通方法
import java.util.Scanner;
abstract class Person{
  private String name;
  private int age;
  public Person(String name,int age){
    this.name = name;
    this.age = age;
  }
  public abstract void sayHello();
  public void test(){
  
  }
}
class Student extends Person{
  public Student(String name,int age){
    super(name,age);
  }
  //重写抽象类的抽象方法
  public void sayHello(){
    System.out.println("Hello,I am son");
  }
}
public class Main{
  public static void main(String[] args) {
    Student student = new Student("张三",20);
    student.sayHello();
  }
}

3.5 接口

  1. 接口内的所有方法只能是方法体,不能实现
  2. 子类使用接口时,必须实现其内部所有方法
  3. 接口内部的属性默认是static final修饰符,因此必须初始化。
typescript 复制代码
interface Animal{
  void sayHello();
  void sayHello(String name);
}
class Student implements Animal{
  
  @Override
  public void sayHello(){
    System.out.println("Hello,I am son");
  }
  @Override
  public void sayHello(String name){
    System.out.println("Hello,I am son"+name);
  }
}

3.6 final,static

3.6.1 final

final修饰的变量不可以更改,修饰的类不能被继承,修饰的方法不能被重写

错误案例1

arduino 复制代码
  public final int age=10;
  void setAge(int age){
    this.age = age;//
  }

3.6.2 static

  1. static修饰的属性、方法只能通过类访问
  2. static方法只能访问static的属性和方法,其它的报错

错误案例

csharp 复制代码
public class Main{
  public int a=10;
  public static void main(String[] args) {
    test();//error
    System.out.println(a);/error
  }
  public void test() {

  }
}

四、异常

java中所有异常的父类都是Exception,异常处理方式有两种

4.1 异常处理

1.方法中抛出异常

dart 复制代码
public static void main(String[] args)throws Exception {
      int num = 0;
      if(num<10) {
        throw new Myexception("num小于10");
      }else if(num>10) {
        throw new Myexception("num大于10");
      }else {
        System.out.println("num等于10");
      }
  } 

2.处理异常

csharp 复制代码
public static void main(String[] args) {
    int num = 0;
    try{
      if(num<10) {
        throw new Exception("num小于10");
      }else if(num>10) {
        throw new Exception("num大于10");
      }else {
        System.out.println("num等于10");
      }
    }catch(Exception e){
      System.out.println(e.getMyMsg());
    }
  } 

4.2 自定义异常

typescript 复制代码
class Myexception extends Exception{
  private String msg;
  public Myexception(String message){
    super(message);
    this.msg = message;
  }
  public String getMyMsg() {
    return "dzp:"+this.msg;
  }
}

//使用
public class Main{
  public int a=20;
  public static void main(String[] args) {
    int num = 0;
    try{
      if(num<10) {
        throw new Myexception("num小于10");
      }else if(num>10) {
        throw new Myexception("num大于10");
      }else {
        System.out.println("num等于10");
      }
    }catch(Myexception e){
      System.out.println(e.getMyMsg());
    }
  } 
}

五、集合

所有集合的父类都是Collection,它内部定义了许多方法与遍历

5.1 List

ArrayList

  1. add(e) 尾插入
  2. add(index,e) 指定位置插入
  3. get(index) 获取指定位置的元素
  4. size() 获取集合的大小
  5. set(index,e) 修改指定位置的元素
  6. remove(index) 删除指定位置的元素
  7. remove(e) 删除指定元素
  8. clear() 清空集合
  9. contains(e) 判断集合是否包含指定元素
  10. indexOf(e) 获取指定元素的索引
  11. lastIndexOf(e) 获取指定元素的最后一个索引
  12. isEmpty() 判断集合是否为空

LinkList

链表数据结构

  1. addFirst(e) 头插入
  2. addLast(e) 尾插入
  3. getFirst() 获取头元素
  4. getLast() 获取尾元素
  5. removeFirst() 删除头元素
  6. removeLast() 删除尾元素

5.2 Set

数据不能重复,HashSet、TreeSet;其中treeset按顺序输出

5.3 Map

键值对存储,键值不能重复出现;HashMap、TreeMap;其中TreeMap的key按顺序输出

5.4 集合遍历

5.4.1 List与Set遍历

vbnet 复制代码
Set<String> set = new TreeSet<>()
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
   System.out.println(iterator.next());
}

5.4.1 Map遍历

vbnet 复制代码
    Map<String,String> m = new HashMap<>();
    m.put("a","b");
    m.put("c","d");
    Iterator<Map.Entry<String,String>> iterator = m.entrySet().iterator();
    while(iterator.hasNext()){
      Map.Entry<String,String> entry = iterator.next();
      System.out.println(entry.getKey() + " " + entry.getValue());
    }

5.5 equals

equals用于判断两个对象是否相等,默认是判断两个对象的地址,如果对象内部重写了equals方法,则根据equals方法判断。

案例一:没有重写equals

csharp 复制代码
class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 没有重写equals()方法
}

// 测试
Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);
Person p3 = p1;  // p3指向p1的同一个对象

System.out.println(p1.equals(p2));  // false - 不同对象
System.out.println(p1.equals(p3));  // true - 同一个对象
System.out.println(p1 == p2); //false

案例二:重写equals

ini 复制代码
class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person other = (Person) obj;
        return age == other.age && Objects.equals(name, other.name);
    }
}

// 测试
Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);
Person p3 = p1;

System.out.println(p1.equals(p2));  // true - 内容相等
System.out.println(p1.equals(p3));  // true - 同一个对象
System.out.println(p1 == p2);       // false - 不同对象
System.out.println(p1 == p3);       //true

案例三:容器set、hash的key存储类

HashSet和HashMap存储时,需要保证存储的元素不能重复出现,如果元素是对象则需要重写equalshashCode方法

csharp 复制代码
class Person{
  public String name;
  public Person(String name) {
    this.name = name;
  }
  public boolean equals(Object obj) {
    if(obj != null && obj instanceof Person) { 
      Person p = (Person)obj;
      return this.name.equals(p.name);
    }
    return false;
  }
  public int hashCode(){
    return this.name.hashCode();
  }
}

public class Main {
  public static void main(String[] args) {
    HashSet<Person> set = new HashSet<>();
    set.add(new Person("dzp"));
    set.add(new Person("dzp"));  
    System.out.println(set.size());//1
  }
}

5.6 排序

排序一般两种方案,第一种就是在容器定义时传递lambda表达式,第二种就是自定义类实现Comparable接口

5.6.1 容器参数传递lambda表达式

java 复制代码
    TreeSet<Person> set = new TreeSet<>((a, b) -> {
      if(a!=null && b!=null) {
        return a.name.compareTo(b.name);
      }else{
        return 0;
      }
    });
    set.add(new Person("dzp"));
    set.add(new Person("azp"));  
    Iterator<Person> it = set.iterator();
    while(it.hasNext()){
      System.out.println(it.next().name);
    }

5.6.2 类实现Comparable接口

java 复制代码
public class Students<T, V extends Number> implements Comparable<Students<T, V>>  {
    private T name;
    private V age;
    private V score1;
    private V score2;
    public Students(T name, V age,V score1,V score2) {
        this.name = name;
        this.age = age;
        this.score1 = score1;
        this.score2 = score2;
    }
    public T getName() {
        return name;
    }
    public V getAge() {
        return age;
    }
    public void setName(T name) {
        this.name = name;
    }
    public void setAge(V age) {
        this.age = age;
    }
    public double getAvg() {
        return (this.score1.doubleValue() + this.score2.doubleValue()) / 2;
    }
    @Override
    public int compareTo(Students o) {
        return this.getAvg() > o.getAvg() ? 1 : this.getAvg() < o.getAvg() ? -1 : 0;
    }
    public String toString() {
        return "姓名: " + name + ", 年龄: " + age + ", 分数1: " + score1 + ", 分数2: " + score2;
    }
}

六、泛型

6.1 模版

arduino 复制代码
class Student<T>{
  public T name;
  public Student(T name,int age){
    this.name = name;
  }
}
Student<String> s = new Student("d");

6.2 通配符

6.2.1 ?

  • 写:只能写null
  • 读:用Object读取
  • 接收:接收任何类型

案例一:使用

ini 复制代码
List<?> list = new LinkedList<>();
list.add(null);
Object obj = list.get(0);

案例二:数据读取

scss 复制代码
public static void printList(List<?> list) {
  list.add(null);
  //list.add(1); 禁止添加
  for(Object obj : list) {
    System.out.println(obj);
  }
}

List<String> list1 = new LinkedList<>();
list1.add("1");
list1.add("2");
printList(list1);

List<Integer> list2 = new LinkedList<>();
list1.add(1);
list1.add(2);
printList(list2);

6.2.2 下界通配符

使用 ? extends T

  • 写:只能写null

  • 读:用T读取

  • 接收:接收T及其子类

案例一:使用

scss 复制代码
public static void printList(List<? extends Number> list) {
  list.add(null);
  for(Number obj : list) {
    System.out.println(obj);
  }
}


List<Integer> list2 = new LinkedList<>();
list1.add(1);
list1.add(2);
printList(list2)

6.2.3 上界通配符 ? super T

  • 写:写入T及其子类

  • 读:用Object读取

  • 接收:接收T及其父类

案例一:使用

scss 复制代码
public static void printList(List<? super Number> list) {
  list.add(1);
  for(Object obj : list) {
    System.out.println(obj);
  }
}


List<Integer> list2 = new LinkedList<>();
list1.add(1);
list1.add(2);
printList(list2)

七、文件

7.1 常用api

  1. getAbsolutePath 获取绝对路径
  2. getName 文件名
  3. isDirectory 是否是目录
  4. isFile 是否是文件
  5. createNewFile 创建文件
csharp 复制代码
    File file = new File(filePath);
    System.out.println("文件路径:" + file.getAbsolutePath());
    System.out.println("文件名:" + file.getName());
    System.out.println("文件大小:" + file.length());
    System.out.println("文件是否存在:" + file.exists());
    System.out.println("文件是否可读:" + file.canRead());
    System.out.println("文件是否可写:" + file.canWrite());
    System.out.println("文件是否隐藏:" + file.isHid

7.2 字节流

用途:适用于绝大多数文件,音频

1.InputStream

InputStream是字节流的父类,FileInputStream是InputStream的子类,用于处理文件的输入

  • read(byte\[\]) 读取指定字节大小的数据
csharp 复制代码
File f1 = new File("src/1.txt");
try {
    FileInputStream f2 = new FileInputStream(f1);
    byte [] b = new byte[1024];
    int len;
    while((len = f2.read(b)) != -1) {
        System.out.println(new String(b, "UTF-8"));
    }
}catch (Exception e) {
    throw new Error("异常"+e);
}

2.OutputStream

OutputStream是字节流的父类,FileOutputStream是OutputStream的子类,用于处理文件的输出

  • write(byte\[\]) 写入指定字节的数据
ini 复制代码
File f1 = new File("src/1.txt");
try {
    FileOutputStream f2 = new FileOutputStream(f1);
    String test = "dongzepingc测试";
    byte [] b1 = test.getBytes(StandardCharsets.UTF_8);
    f2.write(b1);
}catch (Exception e) {
    throw new Error("异常"+e);
}

7.3 字符流

用途:主要适用于文件操作

1.Reader

Reader是字符流的父类,FileReader是Reader的子类,用于处理文件的输入

  • read(char\[\])
ini 复制代码
File f1 = new File("src/1.txt");
try {
    FileReader f2 = new FileReader(f1);
    char [] c = new char[1024];
    int len;
    while((len = f2.read(c)) != -1) {
        System.out.println(new String(c, 0, len));
    }
}catch (Exception e) {
    throw new Error("异常"+e);
}

2.Writer

Writer是字符流的父类,FileWriter是Writer的子类,用于处理文件的输出

  • write(char\[\])
ini 复制代码
File f1 = new File("src/1.txt");
try {
    FileWriter f2 = new FileWriter(f1,true);
    String test = "dongzepingc测试2";
    f2.write(test);
    f2.flush();
}catch (Exception e) {
    throw new Error("异常"+e);
}

7.4 字节-字符流

用途:结合字节流和字符流,适用于任何文件、文本、音频等

1.InputStreamReader

  • read(char\[\])
ini 复制代码
File f1 = new File("src/1.txt");
try {
    InputStreamReader isr2 = new InputStreamReader(new FileInputStream(f1));
    char[] buf = new char[1024];
    int len = isr2.read(buf);
    System.out.println("批量读取: " + new String(buf, 0, len));
    isr2.close();
}catch (Exception e) {
    throw new Error("异常"+e);
}

2.OutputStreamWriter

  • write(char\[\])
java 复制代码
File f1 = new File("src/1.txt");
try {
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(f1, true), StandardCharsets.UTF_8);
    osw.write("\nOutputStreamWriter 写入测试");
    osw.write("\n第一行内容");
    osw.write("\n第二行内容");
    osw.flush();
    osw.close();
}catch (Exception e) {
    throw new Error("异常"+e);
}

7.5 缓冲流

用途:用于处理大量数据,提高效率,Buffer可以结合字节流、字符流的输入输出

  • BufferedInputStream是InputStream的子类,用于处理文件的输入
ini 复制代码
File f1 = new File("src/1.txt");
try {
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
    byte[] buf = new byte[1024];
    int len;
    while((len = bis.read(buf)) != -1) {
        System.out.println(new String(buf, 0, len));
    }
    bis.close();
}catch (Exception e) {
    throw new Error("异常"+e);
}
  • BufferedOutputStream是OutputStream的子类,用于处理文件的输出
ini 复制代码
File f1 = new File("src/1.txt");
try {
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f1));
    String test = "dongzepingc测试";
    byte [] b1 = test.getBytes(StandardCharsets.UTF_8);
    bos.write(b1);
    bos.flush();
    bos.close();
}catch (Exception e) {
    throw new Error("异常"+e);
}
  • BufferedReader是Reader的子类,用于处理文件的输入
arduino 复制代码
File f1 = new File("src/1.txt");
try {
    BufferedReader br = new BufferedReader(new FileReader(f1));
    String line;
    while((line = br.readLine()) != null) {
        System.out.println(line);
    }
    br.close();
}catch (Exception e) {
    throw new Error("异常"+e);
}
  • BufferedWriter是Writer的子类,用于处理文件的输出
java 复制代码
File f1 = new File("src/1.txt");
try {
    BufferedWriter bw = new BufferedWriter(new FileWriter(f1, true));
    bw.write("\nBufferedWriter 写入测试");
    bw.write("\n第一行内容");
    bw.write("\n第二行内容");
    bw.flush();
    bw.close();
}catch (Exception e) {
    throw new Error("异常"+e);
}

7.6 序列化与反序列化

用途:java的程序对象无法直接存储到文件,并且文件也无法直接读取存储的对象,需要借助序列化实现转换。

  • 序列化的类实现必须Serializable接口
arduino 复制代码
public class Person implements Serializable {
    private String name;
    public int age;
    public Person(String name) {
        this.name = name;
    }
    public Person() {
        this.name = "dzp";
    }
    public String getName() {
        return name;
    }
}
  • 序列化与反序列化

ObjectOutputStream与ObjectInputStream可以实现序列化与反序列化

ini 复制代码
File file = new File("src/1.txt");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);//对象化
oos.writeObject(p);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Person p1 = (Person) ois.readObject();
System.out.println(p1.getName());

八、枚举

java的枚举有两种方式

方式一

ini 复制代码
//定义枚举
public enum Test {
   ONE,TWO,THREE
}
//使用测试,Student类有status属性
Student s = new Student()
s.status = Test.ONE
System.out.print(s.status == Test.ONE)

方式二

这种是企业常用的枚举定义,枚举数据支持灵活配置,需要定义构造函数

arduino 复制代码
public enum Test {
    ONE(1,"one"),
    TWO(2,"tow");
    private int code;
    private String desc;

    Test(int code,String desc) {
        this.code = code;
        this.desc = desc;
    }

}

//使用
Students s1 = new Students();
s1.setTest(Test.ONE);
System.out.println(s1.getTest()==Test.ONE);

九、线程

9.1 线程创建

1.继承 Thread类

scala 复制代码
class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("线程启动了");
    }
}
// Main.java
Thread t1 = new MyThread();
t1.start();

2.实现Runnable接口

java 复制代码
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("线程启动了");
    }
}
// Main.java
Thread t2 = new Thread(new MyRunnable());
t2.start();

3.Lambda

ini 复制代码
Thread t3 = new Thread(() -> {
    System.out.println("线程启动了");
});
t3.start();

9.2 join()

join() 是阻塞方法,调用线程会暂停执行。谁调用了join,则谁被阻塞

案例一:主线程里面调用的worker.join(),所以是主线程被阻塞了,而不是worker线程被阻塞

scss 复制代码
// 假设有主线程和工作线程
Thread worker = new Thread(() -> {
    // 工作线程的代码
});

worker.start();

// 主线程调用 join()
worker.join(); // ← 这里是主线程被阻塞!

案例二:

  1. A开始
  2. B开始
  3. A休眠时,cpu被b抢到了,但是b线程体内调用了join,导致其被无限阻塞,A执行结束后,B才能继续
csharp 复制代码
Thread threadA = new Thread(() -> {
    System.out.println("A开始");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {}
    System.out.println("A结束");
});

Thread threadB = new Thread(() -> {
    System.out.println("B开始");
    try {
        threadA.join(); // ← B线程调用join(),所以B被阻塞!
        System.out.println("B继续执行");
    } catch (InterruptedException e) {}
});

threadA.start();
threadB.start();

9.3 synchronized

synchronized用于控制多个并发请求的执行,同一时间永远只有1个资源在执行,如下案例synchronized代码块只有执行结束后才能释放锁。

scss 复制代码
Object lock = new Object();

// 线程A
new Thread(() -> {
    synchronized(lock) {
        System.out.println("A开始");
        Thread.sleep(2000); // A持有锁2秒
        System.out.println("A结束");
    }
    // A释放锁后,其他线程才能进入上面的synchronized块
}).start();

// 线程B  
new Thread(() -> {
    synchronized(lock) {
        System.out.println("B开始"); // 必须等A完全退出synchronized块
        System.out.println("B结束");
    }
}).start();

// 线程C(不相关代码)
new Thread(() -> {
    System.out.println("C独立执行"); // 这个可以立即执行,不受影响
}).start();

//结果
C独立执行
A开始
(等待2秒)
A结束
B开始
B结束

十、反射

反射目的是在运行时动态获取类的信息,进而可以操作类的内部属性和方法等。

11.1 Class获取

Class是反射最核心的api,只有通过Class才能进行后续操作,Class的获取3种方式,如下

1.Class.forName("包名.类名")

ini 复制代码
Class<Person> personClass = Person.class;

2.对象.getClass()

ini 复制代码
Person p = new Person("dzp");
Class<?> personClass = p.getClass();

3.类名.class

ini 复制代码
Class<?> personClass = Class.forName("Person");

11.2 Class常用api

1.clazz.getName()

获取完整的类名

ini 复制代码
Class<Person> personClass1 = Person.class;
System.out.println(p.getName());

2.clazz.getSimpleName()

获取类名

ini 复制代码
Class<Person> personClass1 = Person.class;
System.out.println(p.getSimpleName());

3.clazz.isArray()

判断是否是数组

ini 复制代码
Class<Person> personClass1 = Person.class;
System.out.println(p.isArray());

11.3 构造函数

1.获取构造函数

1.getConstructors()//获取所有的构造函数

2.getConstructor(参数类型)//获取指定的构造

ini 复制代码
Class<?> clazz = Class.forName("Person");
Constructor<?>[] constructor1 = clazz.getConstructors();//获取所有的构造函数
for (Constructor<?> c:constructor1) {
    System.out.println(c);
}
Constructor<?> constructor2 = clazz.getConstructor(String.class);
System.out.println(constructor2);

2.创建对象

1.newInstance(...args)//创建对象

ini 复制代码
Constructor<?> constructor2 = clazz.getConstructor(String.class);
System.out.println(constructor2);
Person p = (Person) constructor2.newInstance("dzp");
System.out.println(p.getName());

11.4 属性

1.获取属性

1.getFields()//获取所有的public属性

2.getDeclaredFields()//获取所有的属性,public,private等

3.getField(name)//获取指定的属性

ini 复制代码
Class<?> clazz = Class.forName("Person");
Field[] fields = clazz.getFields();
for (Field f:fields) {
    System.out.println("field"+f);
}
Field field = clazz.getField("age");

2.属性操作

1.getName()//获取属性名

2.get(实例对象)//获取对属性的值

3.set(实例对象,value)//属性值写入

ini 复制代码
Class<?> clazz = Class.forName("Person");
Field field = clazz.getField("age");
Person p = new Person("test");
System.out.println(field.getName()+"获取值"+field.get(p));

11.5 方法

1.方法获取

1.getMethods()//获取所有的方法-public

2.getDeclaredMethods(实例对象)//获取所有的方法-包含public,private

3.getMethod(name)//获取指定的方法

2.方法操作

1.getName()//获取方法名

2.invoke(实例对象,参数1,参数2)//执行这个方法

十一、网络编程

11.1 InetAddress

用途:获取主机、IP、端口等网络信息。

1.InetAddress实例创建

InetAddress.getByName(String host):根据主机名获取IP地址

InetAddress.getLocalHost():获取本地主机IP地址

ini 复制代码
InetAddress ad1 = InetAddress.getByName("www.baidu.com");

InetAddress ad2 = InetAddress.getLocalHost("127.0.0.1");

2.getHostName 获取主机

ini 复制代码
InetAddress ad1 = InetAddress.getByName("www.baidu.com");
System.out.println(ad1.getHostName());//www.baidu.com

3.getHostName 获取IP地址

ini 复制代码
InetAddress ad1 = InetAddress.getByName("www.baidu.com");
System.out.println(ad1.getHostAddress());//124.1231.1212

11.2 URL

用途:获取网络资源

scss 复制代码
URL u1 = new URL("https://www.baidu.com:443/s?wd=123");
getProtocol()//获取协议
getHost()//获取主机
getPort()//获取端口
getPath()//获取路径
getQuery()//获取参数

11.3 TCP、UDP

用途:网络传输协议层

scss 复制代码
public void tcpDemo() {
    /*
    * 三、TCP
    * 1.服务器端
    * 2.客户端
    * */
    new Thread(() -> {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("服务端启动,等待连接...");
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("客户端连接成功:" + socket.getInetAddress().getHostAddress());

                InputStream inputStream = socket.getInputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = inputStream.read(buffer)) != -1) {
                    System.out.println("服务端收到消息:" + new String(buffer, 0, len, StandardCharsets.UTF_8));
                }
                socket.close();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }).start();

    new Thread(() -> {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        try {
            Thread.sleep(500);
            Socket socket = new Socket("127.0.0.1", 8888);
            socket.getOutputStream().write("Hello World".getBytes(StandardCharsets.UTF_8));
            socket.getOutputStream().flush();
            socket.close();
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }).start();
}

11.4 HttpServer(高频重点)

用途:网络应用层

ini 复制代码
public void httpGetDemo() throws IOException, InterruptedException {
    /*
    * 四、httpClient 应用层
    * 用途:发送get,post,调用第三方接口
    * */
    HttpClient cl = HttpClient.newHttpClient();
    HttpRequest rq = HttpRequest.newBuilder().uri(URI.create("https://www.baidu.com")).GET().build();
    HttpResponse rp = cl.send(rq, HttpResponse.BodyHandlers.ofString());
    System.out.println(rp.body()+"状态码"+rp.statusCode());
}

public void httpPostDemo() throws IOException, InterruptedException {
    /*
     * 四、httpClient 应用层
     * 用途:发送get,post,调用第三方接口
     * */
    String form = "wd=123&age=123";
    HttpClient cl = HttpClient.newHttpClient();
    HttpRequest rq = HttpRequest.newBuilder().uri(URI.create("https://www.baidu.com")).POST(HttpRequest.BodyPublishers.ofString(form)).build();
    HttpResponse rp = cl.send(rq, HttpResponse.BodyHandlers.ofString());
    System.out.println(rp.body()+"状态码"+rp.statusCode());
}

十二、工具

1.Math

ini 复制代码
int a = Math.abs(-5);
int b = Math.max(1,2)

2.Date

ini 复制代码
Date d = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(d);
相关推荐
前端兰博1 小时前
02-Servlet、JDBC、Maven、Mybatis
后端
咖啡八杯2 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
码事漫谈2 小时前
Loop 正在排斥人为操作
后端
爱勇宝3 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
庄周de蝴蝶3 小时前
梅开二度,这次拿下系统分析师
后端·程序员
林小帅4 小时前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
IT_陈寒5 小时前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端
逝水无殇6 小时前
C# 字符串(String)详解
开发语言·后端·c#
神奇小汤圆7 小时前
牛客网Java八股文|2026秋招面试题汇总(金九银十冲刺专用)
后端