java匿名对象

java学习面向对象之匿名内部类

之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名。

匿名对象回顾:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class NoObject
{
 
     void method()
     {
 
         System.out.println( "Hello NoNameObj" );
 
     }
 
 
}
 
class NoName
{
 
     public static void main(String[] args) {
         
         new NoObject().method(); // 这里创建完对象之后,并没有把对象直接赋值给某个值,而是创建完对象之后,直接调用对象,之后这个对象就不能被其他对象调用了<br>                        //因为要调用一个对象必须知道他的名字吧,没有名字怎么调用,这个就是匿名的概念。完事之后就成垃圾了不能再 调用了。
 
     }
 
}

因为在使用匿名对象的时候,那个对象只需要调用一次就好了,为了简写我门采用了匿名的写法。那么这里的匿名内部类也不例外,这里的匿名内部类也是内部类的一个简写,因为只需要调用一次就好了。那我们来看下日常内部类都是怎么调用的。

复制代码
 1 class Outer
 2 {
 3  4 int num = 10;  5  6 class Inner  7  {  8  9 void method() 10  { 11 12 System.out.println("The Outer Num is "+num); 13 14  } 15 16  } 17 18 void sayInner() 19  { 20 21 new Inner().method(); 22 23  } 24 25 } 26 27 28 class InnerClassDemo2 29 { 30 31 public static void main(String[] args) { 32 33 new Outer().sayInner(); 34 35  } 36 37 }
复制代码

我们正常调用内部类是这个样子调用的,如果是匿名内部类又是怎样的呢,我们按照匿名对象的思维来思考一下:

匿名对象没有把创建的值赋给指定类型的引用变量,还有就是这个对象用一次之后就不能用第二次了。相应的:

匿名类,第一个就是没有类名,第二个就是这个类用完一次之后,不能被实例化第二次,也就是匿名应用的时候采用,但是这个类不是真实存在的。

但是这里就存在一个问题了,一个类没有名字我们如何去实例化这个类?所以说要使用匿名内部类是有条件的:

使用匿名对象的条件:

内部类必须继承或者实现一个外部类接口,满足这个条件我们才能使用内部类。代码示例:

复制代码
 1 abstract class AbsDemo
 2 {  3  4 abstract void demo();  5  6 }  7  8 class Outer  9 { 10 11 int num = 10; 12 13 14 void sayInner() 15  { 16 /** 17  *这个地方我们直接new了一个父类或者接口类,但是这里有一点需要注意,那就是在new完了父类或者实现的接口之后, 18  *后面要加上大括号,加上大括号的意义是在于表示,这是一个类,并且是new关键字后面的类或者接口的子类或者实现 19  *之后我们在大括号后直接覆盖或者实现了类或者接口的方法 20 */ 21 new AbsDemo() 22  { 23 24 void demo() 25  { 26 27 System.out.println("This is a NoNameInnerClass Demo"); 28 29  } 30 31 }.demo();//这个地方是非常容易出错的,往往我们new abs(){}之后就忘了调用,因为我们只是单纯的new abs(){}这个样子是没有 32 //任何意义的,为什么因为这个是个匿名的类,也就是说没有类名,你匿名定义之后完了,就不能再引用了。只能立即调用 33 //这个方法后才会变的有意义。还有一点就是这个匿名类定义调用完之后,不要忘了后面的分号结束语句,因为new之后就是 34 //一个语句了,而不是class声明了。 35 36  } 37 38 } 39 40 41 class InnerClassDemo2 42 { 43 44 public static void main(String[] args) { 45 46 new Outer().sayInner(); 47 48  } 49 50 }
复制代码

匿名内部类通俗来说就是:就是一个匿名子类对象。定义的方法是:new 父类or接口(){子类内容}

匿名内部类的应用:

场景一:当函数参数是接口类型时,且接口方法不超过3个,此时我们可以采用匿名内部类来当参数传递。比如:

复制代码
 1 interface InterfaceDemo
 2 {
 3  4 public void show1();  5 public void show2();  6  7 }  8  9 class InnerClassDemo2 10 { 11 12 public static void main(String[] args) { 13 14 method(new InterfaceDemo(){ 15 16 public void show1() 17  { 18 19 System.out.println("Show 1"); 20 21  } 22 23 public void show2() 24  { 25 26 System.out.println("Show 2"); 27 28  } 29 30  }); 31 32  } 33 34 static void method(InterfaceDemo demo) 35  { 36 37  demo.show1(); 38  demo.show2(); 39  } 40 41 }
复制代码

这里method()方法需要一个接口类型的对象传入,为了简便期间,我们直接用了匿名内部类对象进行了传递,这样是不是很方便呢?但是这里还有一个地方需要注意,就是假如有现在这样的情况:

复制代码
 1 class InnerClassDemo2
 2 {
 3  4 class Inner  5  {  6  7  8  }  9 10 public static void main(String[] args) { 11 12 new Inner(); 13 14  } 15 16 17 }
复制代码

如果我们此时这么运行的话就会报下面的错误:

InnerClassDemo2.java:21: 错误: 无法从静态上下文中引用非静态 变量 this
new Inner();
^
1 个错误

为什么呢?因为我们知道main函数是静态的,他无法调用静态上下文当中的非静态成员,此时class Inner{}在这个类当中就相当于一个成员,但是是非静态的自然而然会报错的。

在这里还有一个多态的问题需要我们注意:比如

复制代码
 1 interface InterfaceDemo
 2 {
 3  4 public void show1();  5 public void show2();  6  7 }  8  9 class DuoTaiFalse 10 { 11 12 void method() 13  { 14 15 /** 16  *这个地方发生了向上转型。即多态 17 */ 18 InterfaceDemo inface = new InterfaceDemo(){ 19 20 public void show1() 21  { 22 23 System.out.println("Show1"); 24 25  } 26 public void show2() 27  { 28 29 System.out.println("Show2"); 30 31  } 32 33 public void show3() 34  { 35 36 System.out.println("Show3"); 37 38  } 39 40  }; 41 42  inface.show1(); 43  inface.show2(); 44 /**这个地方就是错误的,因为InterfaceDemo inface = new InterfaceDemo(){}当进行到这个地方的时候,就已经发生了 45  *向上转型,也就是说这个时候,不能够调用除父类当中已经有的其他的方法。所以调用inface.show3()会提示错误 46 */ 47 //inface.show3(); 48 49  } 50 51 52 } 53 54 class InnerClassDemo2 55 { 56 57 public static void main(String[] args) { 58 59 new DuoTaiFalse().method(); 60 61  } 62 63 }
复制代码

转载于:https://www.cnblogs.com/felix-/p/4319230.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之一,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 一、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是一种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是一种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单一模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值