javaSE小知识点

javaSE小知识点

var关键字

var sb = new StringBuilder();//自动推断sb的类型

多行字符串

public class Main {
   public static void main(String[] args) {
       String s = """ //java13
                  SELECT * FROM
                    users
                  WHERE id > 100
                  ORDER BY name DESC
                  """;
       System.out.println(s);
  }

输出不换行

package com.bi;

public class Main {
   public static void main(String[] args) {
       System.out.print("A,");
       System.out.print("B,");
       System.out.print("C.\teee\n");\\不换行
  }
}

格式化输出

public class Main {
   public static void main(String[] args) {
       double d = 3.1415926;
       System.out.printf("%.2f\n", d); // 显示两位小数3.14
       System.out.printf("%.4f\n", d); // 显示4位小数3.1416
  }
}

输入

import java.util.Scanner;

public class Main {
   public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in); // 创建Scanner对象
       System.out.print("Input your name: "); // 打印提示
       String name = scanner.nextLine(); // 读取一行输入并获取字符串
       System.out.print("Input your age: "); // 打印提示
       int age = scanner.nextInt(); // 读取一行输入并获取整数
       System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
  }
}

判断引用类型是否相等

判断值类型的变量是否相等,可以使用==运算符。但是,判断引用类型的变量是否相等,==表示引用是否相等,或者说,是否指向同一个对象。要判断引用类型的变量内容是否相等,必须使用equals()方法。


switch

  • java12增加表达式

public class Main {
   public static void main(String[] args) {
       String fruit = "apple";
       switch (fruit) {
       case "apple" -> System.out.println("Selected apple");
       case "pear" -> System.out.println("Selected pear");
       case "mango" -> {
           System.out.println("Selected mango");
           System.out.println("Good choice!");
      }
       default -> System.out.println("No fruit selected");
      }
  }
}
  • 利用switch表达式会返回值给变量赋值

public class Main {
   public static void main(String[] args) {
       String fruit = "apple";
       int opt = switch (fruit) {
           case "apple" -> 1;
           case "pear", "mango" -> 2;
           default -> 0;
      }; // 注意赋值语句要以;结束
       System.out.println("opt = " + opt);
  }
}
  • 如果需要复杂的语句,我们也可以写很多语句,放到{...}里,然后,用yield返回一个值作为switch语句的返回值:

public class Main {
   public static void main(String[] args) {
       String fruit = "orange";
       int opt = switch (fruit) {
           case "apple" -> 1;
           case "pear", "mango" -> 2;
           default -> {
               int code = fruit.hashCode();
               yield code; // switch语句返回值
          }
      };
       System.out.println("opt = " + opt);
  }
}
  • switch的计算结果必须是整型、字符串或枚举类型;


变量应该把访问范围缩到最小的原则。


for each循环

for each循环能够遍历所有可迭代的数据类型,如List,数组、Map等。无法拿到索引

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 4, 9, 16, 25 };
        for (int n : ns) {
            System.out.println(n);
        }
    }
}

数组打印、排序

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 1, 2, 3, 5, 8 };
        System.out.println(Arrays.toString(ns));
    }
}

可变参数

class Group {
    private String[] names;

    public void setNames(String... names) {//传空可以,无法传null
        this.names = names;
    }
}

调用时:

Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames("Xiao Ming"); // 传入1个String
g.setNames(); // 传入0个String

构造方法

  • 没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int和boolean的默认值分别是0、false

  • 创建对象实例时,按照如下顺序: 1. 先初始化字段,例如,int age = 10;表示字段初始化为10double salary;表示字段默认初始化为0String name;表示引用类型字段默认初始化为null 2. 执行构造方法的代码进行初始化。

  • 多构造方法,一个构造方法可以复用其他构造方法,通过this关键字。

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
        this(name, 18); // 调用另一个构造方法Person(String, int)
    }

    public Person() {
        this("Unnamed"); // 调用另一个构造方法Person(String)
    }
}

super

  • 子类引用父类的字段时,可以用super.fieldName

  • 任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会帮我们自动加一句super();


final

  • 只要某个class没有final修饰符,那么任何类都可以从该class继承即不允许子类继承。

  • 如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final。用final修饰的方法不能被Override

  • 被final修饰的变量或引用不允许再赋值。

  • 对于一个类的实例字段,同样可以用final修饰。用final修饰的字段在初始化后不能被修改。


转型

  • 向上转型:把一个子类类型安全地变为父类类型的赋值(upcasting),转型后只能调用父类的方法,如果子类覆盖了父类的方法,则调用子类的方法,对于只有子类才有的方法,通过父类的引用将无法调用。

  • 向下转型:把一个父类类型强制转型为子类类型,就是向下转型(downcasting)。只用父类引用真实指向的是子类,才能向下转型,否则会失败,会报ClassCastException

  • instanceof操作符,可以先判断一个实例究竟是不是某种类型。


多态

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)。

Override和Overload不同的是,如果方法签名如果不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

这个非常重要的特性在面向对象编程中称之为多态。它的英文拼写非常复杂:Polymorphic。

多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

 

posted @ 2021-01-11 17:04  喜琅琅  阅读(107)  评论(0编辑  收藏  举报