还是TIJ里把final解释得最彻底

以前我是这样理解final的:

final表示最终的,它可以修饰变量,方法和类。当它修饰变量的时候,这个变量不能再被与修改(注:错误的,至少不全);当它修饰方法时,该方法不能被override(重写);当它修饰类时,该类不能再派生出子类。

回头看了TIJ, 才知道自己的理解其实很片面,或者很肤浅,下面是TIJ里对final阐述的总结:


final表示“这样东西是不允许改动的”的意思。它可以修饰数据,方法,以及类。

[b]final数据[/b]

对primitive来说,final会将这个值定义成常量,在定义时赋值;既是static又是final的数据成员会只占据一段内存,并且不可修改。
对reference来说,final的意思则是这个reference是常量,初始化的时候,一旦将reference连接到某个对象,那么它就再也不能指别的对象了,但这个对象本身是可以修改的,Java没有提供将某个对象当作常量的方法。

[b]final 方法[/b]
禁止派生类修改该方法!

[b]final和private[/b]
Private方法已经隐含有final的意思,因为外部是不能访问private的,也就不存在覆写它。

[b]final类[/b]
出于类的设计考虑,它再也不需要作修改了;或者从安全角度出发,不希望它再派生出子类。
final类的数据可以是final的,也可以不是final的,这由自己决定;对于它的方法,由于final类禁止了继承,覆写方法已经不可能,所以所有的方法都隐含地变成final的了!

下面是TIJ4里关于final的一些示例:


/*************************** "final" 修饰参数示例/***************************/

class Gizmo
{
public void spin() {}
}

public class FinalArguments
{
void with(final Gizmo g)
{
// ! g = new Gizmo();
// 非法,g 是引用常量是不能指向新的对象的
}
void without(Gizmo g)
{
g = new Gizmo(); // 没有问题
g.spin();
}

// void f(final int i) { i++; }
// 只能读取primitive类型的常量,不能修改

int g(final int i) {return i + 1; }

public static void main(String[] args)
{
FinalArguments bf = new FinalArguments();
bf.without(null);
bf.with(null);
}
} // /:~

/*************************** final成员变量的示例 ***************************/
import java.util.*;
import static net.mindview.util.Print.*;

class Value
{
int i; // 包访问限制
public Value(int i) { this.i = i; }
}

public class FinalData
{
private static Random rand = new Random(47);
private String id;

public FinalData(String id) { this.id = id; }

// 编译时常量
private final int valueOne = 9;
private static final int VALUE_TWO = 99;

// 典型的公共访问常量
public static final int VALUE_THREE = 39;

// 非编译时常量
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);

// 对象引用常量
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);

// 数组
private final int[] a = { 1, 2, 3, 4, 5, 6 };

//重写toString()方法
public String toString()
{
return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
}

public static void main(String[] args)
{
FinalData fd1 = new FinalData("fd1");
// ! fd1.valueOne++; // Error: can't change value
fd1.v2.i++; // Object isn't constant!
fd1.v1 = new Value(9); // OK -- not final
for (int i = 0; i < fd1.a.length; i++)
fd1.a[i]++; // Object isn't constant!
// ! fd1.v2 = new Value(0); // Error: Can't
// ! fd1.VAL_3 = new Value(1); // change reference
// ! fd1.a = new int[3];
print(fd1);
print("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
print(fd1);
print(fd2);
}
}/* Output:
fd1: i4 = 15, INT_5 = 18
Creating new FinalData
fd1: i4 = 15, INT_5 = 18
fd2: i4 = 13, INT_5 = 18
*///:~

/*************************** final,private的示例 ***************************/

class WithFinals
{
// 虽然加上了final,但效果和只有private一样,private+final是无意义的
private final void f()
{
print("WithFinals.f()");
}
// private在其它类中本身就看不见,也就无法重写,相当于隐含了final
private void g()
{
print("WithFinals.g()");
}
}

class OverridingPrivate extends WithFinals
{
private final void f()
{
print("OverridingPrivate.f()");
}
private void g()
{
print("OverridingPrivate.g()");
}
}

class OverridingPrivate2 extends OverridingPrivate
{
public final void f()
{
print("OverridingPrivate2.f()");
}
public void g()
{
print("OverridingPrivate2.g()");
}
}

public class FinalOverridingIllusion
{
public static void main(String[] args)
{
OverridingPrivate2 op2 = new OverridingPrivate2();
op2.f();
op2.g();
// You can upcast:
OverridingPrivate op = op2;
// But you can't call the methods:
// ! op.f();
// ! op.g();
// Same here:
WithFinals wf = op2;
// ! wf.f();
// ! wf.g();
}
}
/* Output:
OverridingPrivate2.f()
OverridingPrivate2.g()
*///:~

疾风气象大模型4.0白皮书 《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降 阅读详情

相关推荐

信号与系统——卷积、相关运算与FFT关系以及工程应用(三)

卷积运算、相关运算

qq_35028634的博客 6612

tij学习笔记(static,final关键字的一些问题和比较)

     一,static关键字    当申明为static型的时候,意味着此域或者方法不会与包含它的实例联系在一起,也就是说,即便没有创建某个类的任何对象,也可以调用static域或者方法。    1,static域初始化的问题:        一般来说,类的代码在初始化时才加载(即创建第一个对象),但当访问static域或者方法时,包含该static域或者方法的对象也会被加载。

游永的鱼 1193

ST7789T3与CST816D驱动全解析,面试技巧第11篇:嵌入式面试场景问答 10 连发。

SPI模式下,SCLK、MOSI、CS、DC、RST为必需引脚;8080模式下需连接D0-D7、WR、RD等信号线。CST816D触摸芯片通常通过I2C接口通信,需连接SCL、SDA及INT(中断)引脚。确保电源引脚(VCC、GND)稳定供电,ST7789T3典型工作电压为3.3V。显示异常时检查时序参数,如SPI时钟频率(建议≤40MHz)、数据建立时间。初始化流程需发送一系列命令序列,包括设置像素格式、扫描方向、帧率控制等。扫描方向(MADCTL)可调整显示旋转角度,需根据实际硬件布局配置。

a967gsvj的博客 373

TIJ 复习笔记7

复用代码是Java众多引人注目的功能之一。 组合与继承是两种代码重用的机制。本章概览: 组合、继承、代理(java中没有delegation) 组合继承一起用 什么时候用组合、什么时候用继承 介绍@Override 介绍向上转型 介绍protect final关键字 补充又一次说初始化及类的加载(加静分清成构造) 组合、继承和代理组合class Bed { } class House { B

xshalk的专栏 433

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1288

MATLAB实战:从零推导合成孔径雷达(SAR)后向投影(BP)算法核心公式与代码实现

本文详细介绍了如何使用MATLAB从零推导合成孔径雷达(SAR)后向投影(BP)算法的核心公式与代码实现。通过基础概念讲解、数学原理推导、距离维脉冲压缩实现及完整MATLAB代码展示,帮助读者掌握SAR成像的关键技术。特别针对BP算法的优化技巧和常见问题提供了实用解决方案,适合雷达信号处理领域的开发者和研究者参考。

weixin_28683689的博客 251

TIJ阅读笔记(第六章)[转]

6:复用类合成所使用的语法  如果想对reference进行初始化,那么可以在以下几个时间进行:    1。在定义对象的时候。这就意味着在构造函数调用之前,它们已经初始化完毕了。    2。在这个类的构造函数里。    3。在即将使用那个对象之前。这种做法通常被成为“偷懒初始化(lazy initialization)”。如果碰到创建对象的代价很高,或者不是每次都需要创建对象的时候,这种做法就

hmsxq的专栏 742

ArcGIS Pro MCP 开源:自然语言驱动的 AI 制图与分析

人工智能与大模型的快速发展,正推动专业软件从“手动操作”走向“自然语言控制”。模型上下文协议(MCP)作为连接 AI 与外部工具的标准接口,类似为 AI 安装的“USB 接口”,让大模型可以通过统一协议调用 GIS 软件能力。基于 ArcPy 构建的 ArcGIS Pro MCP 项目,将复杂的地图制图与空间分析封装为 112 个可被 AI 调用的工具,使文本指令直接驱动软件完成数据加载、符号化、出图乃至叠加统计等任务。对 GIS 工程师、数据分析师与测绘规划从业者而言,该开源项目显著降低专业软件使用门槛,

weixin_29054195的博客 274

读TIJ -6 类再生

《Think in java·第 6 章类再生》 读TIJ -1 对象入门 中已经就代码复用性吐槽了。继承关系在结果上(不是为了代码复用而设计继承关系)为代码复用提供了新的途径。 本章看其目录就比较杂,程序员的内聚思想去哪儿了?

yqj2065的博客 1434

skywalking各项指标说明

skywalking各项指标说明

没有简介 2487

深度学习-176-知识图谱技术之langchain与neo4j的嵌入向量Neo4jVector

使用Neo4jVector将输入的文档向量化,并创建向量索引,然后进行语义检索。

qq_20466211的博客 440

TIJ 复习笔记9

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 抽象类和抽象方法 接口 适配器模式(完全解耦) 多重继承 扩展接口(继承) 接口中的域 接口嵌套 工厂模式 接口与抽象类的区别 抽象类 包含抽象方法的类,就是抽象类,抽象类不可以产生实例,但是不能继承。 抽象类往往作为一个基类,用于扩展和多态。 abstract ...

weixin_30929011的博客 85

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

tij3笔记 006

•    •    继承语法关键字extends只要main是public,无论其所属的类是否public,命令行均可调用该main方法。可以为每个类都创建一个main方法。考虑:javac文件时每个类都会做成class文件,再java类文件时便可以调用该main方法。可以利用main方法实际地对类进行测试。在导出类中修改了基类的方法,再调用基类该方法时则需引入super关键字。编译器将强制初始化

mind in black 767

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

记录一次TIJ中提出的对象引用计数法

Thinking in Java中提到的一种引用计数的技巧

張先生的博客 273

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TIJ——Chapter Seven:Reusing Classes

ReusingClasses 有两种常用方式实现类的重用,组件(在新类中创建存在类的对象)和继承。 Compositionsyntax Everynon-primitiveobjecthasatoString()method,andit’scalledinspecialsituationswhenthecompilerwantsaStringbut...

weixin_30699955的博客 158

TIJ学习笔记-匿名类

package com.zhiru; /* * 匿名类示例 */ //创建匿名类的基类 class Wrapping { private int val; public Wrapping(int x){ val=x; } public int value(){ return val; } } public class Parcel8 { //在方法体中创建一个没有名字的继

591

《TIJ4》多态 E13 继承与清理中的引用计数问题

引言 通常,我们无需考虑对象的清理问题,垃圾回收器会代劳。然而在特定情况下,需要手动控制对象的清理,这时,我们必须小心翼翼为类创建dispose()方法。由于继承的原因,如果子类中含有自己特殊的清理,那么子类就必须重写dispose()方法,并在执行完自己特殊的清理后调用父类的dispose()方法,否则,基类就不会清理。 一般的组合和继承中,对象会创建组合中的成员对象,并且在dispose()时...

weixin_30906671的博客 123

Thinking in Java 读书总结(三)

前言 TIJ第7,8,9章分别讲的是类的复用,多态和接口,这些特性在Java中不得不说都是特别特别重要的。之前校招面试的时候其实一直心里有个疑问,Java那么多底层特性真的工作上用得着么,不会是面试造火箭什么的吧。但是真正工作之后静下来去学习才发现,要想真正理解Java里的很多表面的语法和特点,必须要结合底层的特性才能真正知其然且知其所以然。长路漫漫,一点点积累! 第七章 复用类 7.1...

a814333256的博客 151

java中多态理解

1.多态的含义及作用 在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。 封装,说简单点就是合并属性和行为创建一种新的数据类型,而继承就是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用。 简单点说,多态就是把做什么和怎么做分开了;其中,做什么是指调用的哪个方法,我是去吃饭(方法a)还是去睡觉(方法b),怎么做是指实现方案,如果我选择吃饭,...

lxj的博客 218

Java读书笔记--Thinking in Java

Java初学者,记录TIJ自己觉得重要的点。static 只有在创建类的第一个对象 (或者第一次访问static成员) 的时候,static成员才会被初始化,此后static对象不会再作初始化。如果先前没有创建过对象,因而其static的成员尚未初始化的话,初始化会先处理其static成员,再处理非static的对象。package 对于一个MyClass.jav

tuzkimo的专栏 390

第一话 从头再来

一直打算让自己的Java回炉重新锻造一下,那么,从现在开始吧。 本文是阅读《Thinking in Java》(以下简称TIJ)第七章之后的产物,会包含以下: 一个问题 一些思考 重载与重写 final 一个问题 如图代码,test明明是类A的私有成员变量,(1)为什么其子类B的实例能够正常使用set方法打印出test?(2)这又使我想起了前一段时间一个朋友问我的问题,new一个子类的时候,是...

weixin_34273479的博客 171

面试|如何理解Java中的多态

1 多态的含义及作用 在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。 封装,说简单点就是合并属性和行为创建一种新的数据类型,而继承就是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用。 简单点说,多态就是把做什么和怎么做分开了;其中,做什么是指调用的哪个方法,我是去吃饭(方法a)还是去睡觉(方法b),怎么做是指实现方案,如果我选择吃饭,那么...

星空下的程序猿 8960

数学建模竞赛实战:交通需求规划与可达率优化模型全解析

交通需求规划与可达率是城市交通系统分析与优化的核心概念。其基本原理在于,通过数学模型对出行需求进行预测,并将其分配到交通网络上,进而评估网络的服务水平。从技术价值看,这不仅是评估交通系统效率与公平性的关键指标,更是进行交通网络设计、公交线路优化、拥堵管理等决策的科学基础。在应用场景上,该技术广泛应用于城市规划、智慧交通系统建设以及大型活动交通组织等领域。本文以数学建模竞赛为切入点,深入探讨了基于用户均衡理论和BPR函数的交通流分配模型,并结合网络优化算法,系统阐述了如何通过模型量化并提升可达率,为未来新城背

weixin_34032621的博客 420

Java编程陷阱-类成员初始化

如果你忽略Java的细节,恐怕你的代码会充满bug,下面讨论关于类成员初始化问题。 第一类,初始化成员变量在构造方法之前 主要参考TIJ中的代码,来说明问题!! 1. 新建一个类Tag package mark.initial; public class Tag { /** * 构造方法 * * @param maker */ public Tag(int mak...

mmdev 85

Thinking in Java 中闪耀的星星(一)

《Thinking in java》做为进阶是一个不错的选择,下面是我对书的一些理解: 1.什么是面向对象编程? 1.)我们所处的世界是由对象构成的,java的设计的本质也是基于世界的!在理解什么是面向对象要先清楚“自顶而下”的设计思想,就是把大的方面细分为小的方面,直到原子性,比如,早上洗漱,细分为洗脸,刷牙,刷牙细分为挤牙膏,牙刷刷动牙齿… 2.)为什么是面向对象?举个例子:人类的上层是灵

小浩子的博客 1564

【java】java面试题经典汇总,包括并发多线程

近期一直在找java的工作,除了认真回顾《TIJ》的笔记,准备点java面试题也是很重要的。 下面放上的东西大都是网上可以搜索的到的,经过我的阅读我把他们精简了一下,变成了一个个的知识点。 过两天再写关于java内存模型和java垃圾回收机制的总结,这2个点也是面试常常出现的。 java面试题汇总 1.     面向对象的特点: a)    抽象:数据抽象和行为抽象。 b)

a2888409 1462
上一篇: 对象的初始化全过程
下一篇: 快速排序(v 2.0)
rush2012
博客等级 码龄14年 2粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值