当前位置: 代码网 > it编程>编程语言>Java > Java - JDK17语法新增特性(如果想知道Java - JDK17语法新增常见的特性的知识点,那么只看这一篇就足够了!)

Java - JDK17语法新增特性(如果想知道Java - JDK17语法新增常见的特性的知识点,那么只看这一篇就足够了!)

2024年07月27日 Java 我要评论
Java - JDK17语法新增特性(如果想知道Java - JDK17语法新增常见的特性的知识点,那么只看这一篇就足够了!)

        前言:java在2021年发布了最新的长期支持版本:jdk 17。这个版本引入了许多新的语法特性,提升了开发效率和代码可读性。本文将简要介绍一些常见的新特性,帮助开发者快速掌握并应用于实际开发中。


先让我们看一下本文大致的讲解内容:

1.yield关键词

        ——先让我们来了解一下yield关键词的作用:

先让我们来看一个正常的switch的例子:

public class test {
    public static void main(string[] args) {
        string data = "one";
        int result = 0; // 接收数据的返回值
        switch (data) {
            case "one":
                result = 1; // 为result重新赋值
                break;
            case "two":
                result = 2; // 为result重新赋值
                break;
            default:
                result = -1; // 为result重新赋值
                break;
        }
        system.out.println(result);
    }
}

代码分析:

现在让我们将上述的代码进行简化,简化后的switch:

public static void main(string[] args) {
    string data = "one";
    int result = switch (data) {
        case "one" -> 1;
        case "two" -> 2;
        default -> -1;
    };
    system.out.println(result);
}

我们发现我们可以使用->来返回switch语句的值,当然有读者会问了,这和我们讲解的yield有什么关系呢?,接下来让我们将上述代码转换为yield的形式:

public static void main(string[] args) {
    string data = "one" ;
    int result = switch (data) {
        case "one" : yield 1;
        case "two": yield 2;
        default : yield -1;
    };
    system.out.println(result) ;
}

我们可以发现我们也可以使用yield来返回switch的值,这就是yield语句。

2.var关键词

        var是java 10中引入的一个新特性,用于局部变量类型推断。它允许编译器在编译时自动推断变量的类型,从而简化代码书写和增强代码可读性。

        接下来我们直接使用实例来进行讲解:

以下是一个使用var的示例:

import java.util.arraylist;

public class varexample {
    public static void main(string[] args) {
        // 使用var声明整型变量
        var number = 10;
        system.out.println("number: " + number);

        // 使用var声明字符串变量
        var text = "hello, java 10!";
        system.out.println("text: " + text);

        // 使用var声明集合
        var list = new arraylist<string>();
        list.add("apple");
        list.add("banana");
        system.out.println("list: " + list);

        // 使用var声明迭代器
        for (var item : list) {
            system.out.println("item: " + item);
        }
    }
}

        从上述的代码我们可以看到,我们使用var关键词来声明变量,其会自动的推断类型。这大大的方便了我们声明变量。

注意:

例如:

public static void main(string[] args) {
    map<string, list<map<integer, string>>> complexmap = new hashmap<string,
                list<map<integer, string>>>();

    //使用var关键词进行简化 
    var complexmap2 = new hashmap<string, list<map<integer, string>>>();
}

我们可以发现这样我们的代码繁琐度大大的简化了。

注意事项:

  • var只能用于局部变量声明,不能用于成员变量、方法参数或返回类型。

  • 变量必须在声明时初始化,因为编译器需要根据初始化值来推断变量类型。

  • var不能用于没有初始化值的变量声明。

  • var不能用于null初始化,因为无法推断类型。

以上就是java中的var关键词的使用了。

3.密封类 - sealed

        在讲解sealed关键词之前,先让我们讲解一下什么是密封类:

我们知道,在java中使用final修饰的类为密封类,其作用就是不能被其他类所继承,如果被继承就会报错,例如:

// 定义一个final类
public final class finalclass {
    private string message;

    public finalclass(string message) {
        this.message = message;
    }

    public string getmessage() {
        return message;
    }

    public void setmessage(string message) {
        this.message = message;
    }
}

// 尝试继承final类
public class subclass extends finalclass {  // 这行会导致编译错误
    public subclass(string message) {
        super(message);
    }
}

        当然,在jdk17中提供了一个新的关键字: sealed 。它允许你显式地列出可以扩展某个类或实现某个接口的类,从而增强了类型安全性和可维护性。

     

         —— 那么怎么使用sealed关键词呢?

     

使用sealed关键字的步骤如下:

让我们直接使用案例来帮助你进行理解:(代码如下)

// 定义一个sealed类
public sealed class shape permits circle, rectangle, square {
    // 声明一个抽象方法area,要求任何继承shape的子类必须实现这个方法
    public abstract double area();
}

// 定义一个final子类
public final class circle extends shape {
    // 声明一个私有的最终变量radius,用于存储圆的半径
    private final double radius;

    // circle类的构造方法,接收一个半径参数并初始化radius
    public circle(double radius) {
        this.radius = radius;
    }

    // 实现shape类中声明的抽象方法area,计算并返回圆的面积
    @override
    public double area() {
        return math.pi * radius * radius;
    }
}

// 定义一个sealed子类
public sealed class rectangle extends shape permits filledrectangle {
    // 声明两个私有的最终变量width和height,用于存储矩形的宽和高
    private final double width;
    private final double height;

    // rectangle类的构造方法,接收矩形的宽和高参数并初始化width和height
    public rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    // 实现shape类中声明的抽象方法area,计算并返回矩形的面积
    @override
    public double area() {
        return width * height;
    }
}

// 定义一个non-sealed子类
public non-sealed class square extends shape {
    // 声明一个私有的最终变量side,用于存储正方形的边长
    private final double side;

    // square类的构造方法,接收一个边长参数并初始化side
    public square(double side) {
        this.side = side;
    }

    // 实现shape类中声明的抽象方法area,计算并返回正方形的面积
    @override
    public double area() {
        return side * side;
    }
}

// 进一步定义一个final子类
public final class filledrectangle extends rectangle {
    // 声明一个私有的最终变量color,用于存储填充矩形的颜色
    private final string color;

    // filledrectangle类的构造方法,接收矩形的宽、高和颜色参数,并调用父类rectangle的构造方法进行初始化
    public filledrectangle(double width, double height, string color) {
        super(width, height);
        this.color = color;
    }

    // 添加一个额外的方法getcolor,用于获取填充矩形的颜色
    public string getcolor() {
        return color;
    }
}

在这个例子中:

并且我们要注意:

这样我们就大致的了解了sealed关键词了。

4.接口中的私有方法

        在接口中的私有方法常常用于对接口中的default修饰的方法和静态方法进行辅助,将其内部的代码进行封装简化。

例如:

interface helloservice {
    public void sayhello();
    // 默认方法
    default void saysomething(){
        syaenghello();
        sayhello();
    };
    // 私有方法
    private void syaenghello(){
        system.out.println("hello!");
    }

        接口的私有方法为java语言引入了更多的灵活性和功能性,可以帮助编写更干净、更模块化的代码,提升了接口的设计和实现的效率和质量。

        这就是java中接口中的私有方法的使用。

5.instanceof关键词

        在java中,instanceof是一个关键字,用于测试一个对象是否是一个类的实例或者是其子类的实例。它的语法形式如下:

object instanceof type

        其中,object是要检查的对象,type是一个类名或接口名。instanceof操作符的作用是检查object是否是type类型的实例,或者是type类型的子类的实例。它返回一个布尔值,如果objecttype类型或其子类的实例,则返回true;否则返回false

        ——接下来让我们使用一个实例来进行对其进一步理解:

class animal {
    // animal 类的成员和方法
}

class dog extends animal {
    // dog 类的成员和方法
}

public class main {
    public static void main(string[] args) {
        animal animal = new dog(); // 创建一个 dog 对象并赋值给 animal 类型的变量

        // 使用 instanceof 来检查对象的类型
        if (animal instanceof dog) {
            system.out.println("animal 是 dog 类的实例");
        }
        
        if (animal instanceof animal) {
            system.out.println("animal 是 animal 类的实例");
        }
        
        if (animal instanceof object) {
            system.out.println("animal 是 object 类的实例");
        }
    }
}

解释:

  1. animal是一个类,doganimal的子类。

  2. main方法中,创建了一个dog对象,并将其赋值给一个animal类型的变量animal

  3. 使用instanceof关键字,首先检查animal是否是dog类的实例,结果为true,因为animal确实是dog类的实例。

  4. 接着检查animal是否是animal类的实例,同样为true,因为dog类是animal类的子类。

  5. 最后检查animal是否是object类的实例,结果同样为true,因为所有类在java中最终都是继承自object类的。

        通过上面的讲解,我相信你已经对java中instanceof关键词有了一定的理解,那么instanceof关键词有什么用处呢?

instanceof的用途:

  • 类型检查和转换instanceof通常用于在运行时检查对象的类型,以便进行类型转换或根据对象的实际类型执行特定的操作。

  • 条件控制:可以根据对象的类型来决定执行不同的代码路径,以实现多态性和灵活的程序逻辑。

  • 安全性检查:在某些情况下,使用instanceof可以帮助避免类型转换异常(classcastexception),在进行类型转换之前先检查对象的类型是否符合预期。

这样我们就大致的了解了java中的instanceof关键词了。


以上就是本篇文章的全部内容了~~~

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com