WWW.YOUINFO.SITE
标签聚合 关键字

/tag/关键字

LinuxDo 最新话题 · 2026-06-07 15:33:22+08:00 · tech

抽象类 当父类的一些方法无法给出具体实现时,可以用abstract关键字来修饰该方法,不写方法体,把方法变成抽象方法,同时这个类也必须被修改为抽象类 抽象类的语法 abstract class XX {//这是抽象类 private String name; ​ public XX(String name) { this.name = name; } ​ public abstract void YY(); //这是抽象方法 } 抽象类的使用细节 抽象类可以没有抽象方法 抽象类不能被实例化,但可以有构造器 一旦类包含了abstract方法,则这个类必须被声明为abstract abstract只能修饰类和方法 抽象类的本质还是类,可以有类的一切内容 抽象方法不能有主体,即不能实现 如果一个类继承了抽象类,则它也必须实现抽象类的所有抽象方法,除非他自己也是抽象类 抽象方法不能被final、static、private修饰,因为这些都会阻碍类方法的重写 练习题 1)思考:abstract final class A{}能编译通过吗,why? 2)思考:abstract public static void test2()能编译通过吗,why? 3)思考:abstract private void test3();能编译通过吗,why? 答案是:都不能通过编译,final、static、private三者均阻碍类方法的重写 4)编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary,提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问,实现work(),提示“经理/普通员工名字工作中… 答案代码略:比较简单也比较长,就不放了 抽象类的最佳实践——模板设计模式 先阅读下面这段代码 public class TestTemplate { public static void main(String[] args) { new AA().job(); new BB().job(); } } ​ class AA { public void job() { long start = System.currentTimeMillis(); int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } long end = System.currentTimeMillis(); System.out.println("AA耗时:" + (end - start)); } } ​ class BB { public void job() { long start = System.currentTimeMillis(); int sum = 0; for (int i = 1; i <= 10000000; i++) { sum *= i; } long end = System.currentTimeMillis(); System.out.println("BB耗时:" + (end - start)); } } 我们可以发现,两个类中的job方法其实有重复性逻辑,我们考虑让其变简洁 于是我们可以考虑把job方法中的计时逻辑提取出来,只在job方法中保留工作逻辑 public void calTime() { long start = System.currentTimeMillis(); this.job(); long end = System.currentTimeMillis(); System.out.println("BB耗时:" + (end - start)); } public void job() { int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } } 这样虽然job里的内容少了,但是整体代码量并没有减轻,并且calTime方法的大部分逻辑在AA类和BB类中是重合的。假如还有CC、DD类,那会更加臃肿。 为了让代码更加简洁,复用性更高,我们对代码进行更进一步的修改,考虑把calTime方法统一提取到一个更高级别的类,在其中需要调用job方法,job方法的具体实现存在于子类中。 public class TestTemplate { public static void main(String[] args) { new AA().calTime(); new BB().calTime(); } } ​ abstract class Template { public void calTime() { long start = System.currentTimeMillis(); this.job(); long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - start)); } ​ public abstract void job(); } ​ class AA extends Template { public void job() { int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } } } ​ class BB extends Template { public void job() { int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } } } 简单的说,抽象类的意义就是提升代码可复用性(把公共代码提取到父类抽象类中),同时定义统一规范(用抽象方法强制要求子类实现某些行为),告诉其他人,这个抽象类里哪些方法需要得到重写 2 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-07 11:56:58+08:00 · tech

final关键字 final可以修饰类、属性、方法、局部变量。 final的使用时机 不希望某个类被继承时 不希望某个类中属性的值被修改时 不希望类中的某方法被子类重写时 不希望局部变量的值被修改时 final修饰不同目标的具体含义 修饰目标 含义 类 不可被继承 方法 不可被重写,但可以被子类继承 属性 不可修改值 局部变量 不可修改值 方法参数 不可修改值 final的注意事项 final常量的命名通常为XX_YY final修饰的属性定义时必须被赋初值,初始化的位置如下 直接赋值 构造器内 构造代码块内 final修饰静态属性时,初始化位置如下 定义时 静态代码块内 final类不可被继承,但可以实例化 final修饰的方法虽然不可被重写,但可以继承 如果一个类已经是final了,那它无法被继承,因此其中的方法没必要用final final和static搭配使用效率更高,不会导致“类加载”,因为底层编译器做了优化处理 public class Test { public static void main(String[] args) { System.out.println(AA.num); } } class AA{ public static final int num = 10; static { System.out.println("AA的静态代码块被调用"); }; } 输出 10 静态代码块未被执行,说明类甚至没有被加载,编译器生成字节码文件时,编译器把对常量 num 的符号引用替换为常量值 10(即字面量) 包装类(Integer、Double、Float、Boolean都是fianl类型),String也是final类型,无法被继承 final如果修饰引用类型变量,不可修改的是引用地址本身,引用对象的内部状态可变 练习题 写计算圆的面积,分别在三个地方尝试初始化PI的值 package com.hspedu.finall; public class Test { public static void main(String[] args) { Circle circle = new Circle(2.0); System.out.println(circle.calArea()); } } class Circle { private double radius; private final double PI = 3.14; public Circle(double radius) { this.radius = radius; //PI = 3.14; //在构造器里赋值也可以 } { //PI = 3.14; 在普通代码块里赋值也可以 } public double calArea() { return PI * radius * radius; } } PS:注意三个地方初始化都可以,但是只能保留一个,因为如果保留两个就相当于修改PI的值了 1 个帖子 - 1 位参与者 阅读完整话题

V2EX - 技术 · 2026-05-26 19:48:53+08:00 · tech

想用它预处理文档,然后帮助提取与关键字匹配的内容。看起来很理想,但实际提取不尽人意。 我做了个小工具,把切分后的每段,与关键字的匹配程度,可视化出来了,可以直观看到匹配度。 从网页内容中,提取“中国人民银行的编制”,效果不错: 从网页内容中,提取“中国人民银行的职责”,开头匹配的很好,但漏掉了接下来的那些: 可以看到,在提取“中国人民银行的职责”匹配的句段时,会漏掉枚举的那几条。 这可以说是段落拆分的问题,我是逐句拆分的,问题是,段落怎么才能合理拆分呢?如果必须知道哪些跟哪些是在一起的,那就相当于已经提前理解文章的内容了,就没有必要上向量数据库了。 所以,向量数据库如何做是比较合适的呢?就比如我上面的这种应用场景。