首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

来来来,聊聊7种内存泄露场景和13种解决方案

不当equals方法和hashCode方法实现 当我们定义个新时,往往需要重写equals方法和hashCode方法HashSet和HashMap中很多操作都用到了这两个方法。...但由于上述代码Person并没有重写equals方法,因此执行put操作时,Map会认为每次创建对象都是新对象,从而导致内存不断增长。...第一,如果创建一个实体,总是重写equals方法和hashCode方法;第二,不仅要覆盖默认方法实现,而且还要考虑最优实现方式; 外部类引用内部类 这种情况发生在非静态内部类(匿名)中,初始化时...finalize()方法 使用finalize()方法会存在潜在内存泄露问题,每当一个finalize()方法重写时,该类对象就不会被GC立即回收。...假设某个重写了finalize()方法,并且重写方法执行时需要一些时间。

1.7K10

面向对象-补充说明(static,抽象,接口,内部类)

static:属于,可直接调用采用 .方法()调用 非static:属于对象,只能采用 对象.方法()调用 static扩展中我们将讲到匿名代码块和静态代码块 这两者可写于中: public...new application(); } } 结果: 静态代码块 匿名代码块 构造方法 我们可以看到产生过程中,各部分生成先后顺序是:静态代码块,匿名代码块,构造方法。...抽象 概念: 抽象中可以包含未被定义抽象方法,有利于后者重构 抽象定义: public abstract class 抽象名{ ......//抽象中可包含未被定义抽象方法 public abstract void 抽象方法名(); ......必须重写接口方法 内部类(拓展) 内部类定义一个内部再定义一个 内部类在后面我们会再提起,所有这里先讲述一种类型:成员内部类 概念: 定义一个里面的另一个 //成员内部类

15820
您找到你想要的搜索结果了吗?
是的
没有找到

Java面向对象特性总结

final关键字 final 关键字声明可以把定义为不能继承,即最终;或者用于修饰方法,该方法不能被子类重写方法不能重写 不能继承 final标记变量(成员变量局部变量)即称为常量。...被修饰后成员具备以下特点: 修饰成员,被所有对象所共享 访问权限允许时,可不创建对象,直接用名.属性方法调用 static方法内部只能访问static修饰属性方法,不能访问非static...除此之外任何地方 都不能使用该类 但是它对象可以通过外部方法返回值返回使用,返回值类型只能是局部内部类 父接口类型 局部内部类可以使用外部方法局部变量,但是必须是final。...匿名内部类 匿名内部类不能定义任何静态成员、方法,只能创建匿名内部类一 个实例。一个匿名内部类一定是new后面,用其隐含实现一个接口 实现一个。...匿名内部类特点 匿名内部类必须继承父实现接口 匿名内部类只能有一个对象 匿名内部类对象只能使用多态形式引用 interface A{ public abstract void fun1(); }

45710

Java8中Lambda函数式编程详解

Runnable接口实现; 为了省去定义一个RunnableImpl实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;...传递一段代码——这才是我们真正目的。而创建对象只是受限于面向对象语法而不得不采取一种手段方式。那,有没有更加简单办法?...而为了指定线程执行内容,需要调用Thread构造方法: public Thread(Runnable target) 为了获取Runnable接口实现对象,可以为该接口定义一个实现RunnableImpl...; } }).start(); } } 匿名内部类好处与弊端 一方面,匿名内部类可以帮我们省去实现定义;另一方面,匿名内部类语法——确实太复杂了!...ComparatorImpl实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上,只有参数和方法体才是关键。

41720

Spring AOP 拦不下接口方法注解啊

背景 最近在做一个小工程项目,通过使用AOP和自定义注解方式实现了操作日志记录,并单独封装以供其他模块调用。...项目模块结构简示 如上所示 itf.service 定义 api 接口规范,然后 controller实现所接口并完善方法;所以最初为了代码上好看,将自定义注解直接标注了 itf.service...其实当我们把注解用在方法中,就没有没有所谓继承问题,只有方法重写问题。 即对于方法注解,若子类重写了父带注解方法,从子类无法获取到注解。 子类没有重写带注解方法,可以通过子类获得注解。...该方式中接口中注解无法被实现继承,AOP 中切点无法匹配上实现,所以也就不会为实现创建代理,所以我们使用其实是未被代理原始,自然也就不会被增强了。...则根据上边提到只有方法重写问题,可知,被重写方法将不会被拦截,而重写方法则走 Parent 路线,可以被 AOP 感知拦截。

94720

JDK1.9-Lambda表达式

Runnable接口实现; 为了省去定义一个RunnableImpl实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;...我们真正希望做事情是:将run方法体内代码传递给Thread知晓。 传递一段代码——这才是我们真正目的。而创建对象只是受限于面向对象语法而不得不采取一种手段方式。那,有没有更加简单办法?...而为了指定线程执行内容,需要调用Thread构造方法: public Thread(Runnable target) 为了获取Runnable接口实现对象,可以为该接口定义一个实现RunnableImpl...; } }).start(); } } 匿名内部类好处与弊端 一方面,匿名内部类可以帮我们省去实现定义;另一方面,匿名内部类语法——确实太复杂了!...ComparatorImpl实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上,只有参数和方法体才是关键。

47520

mybatis日志功能是如何设计

我们按照上面目录结构介绍其实已经有一些思路: 定义一个Log接口,以便于统一抽象日志功能,这8种日志功能都实现Log接口,并且重写日志打印方法。...它里面定义了一个静态构造器logConstructor,没有用if...else判断,static代码块中调用了6个tryImplementation方法,该方法会启动一个执行任务去调用了useXXXLogging...而这个方法Configuration调用,如果用户有自定义logImpl参数的话。 ? ? 具体是XMLConfigBuildersettingsElement方法调用 ?...根据getLog方法获取Log实例 通过Log实例具体日志方法打印日志 在这里还分享一个知识点,如果某个工具里面都是静态方法,那么要把该工具构造方法定义成private,防止被疑问调用,LogFactory...彩蛋 不知道大家有没有发现这样一个问题: LogFactory代码中定义了很多匿名任务执行器 ? 但是实际调用时,却没有在线程中执行,而是直接调用,这是为什么? ?

1.1K20

Java基础之——Lambda表达式

run 方法体,不得不需要 Runnable 接口实现; 为了省去定义一个 RunnableImpl 实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象 run 方法,所以方法名称、方法参数、...那,有没有更加简单办法?如果我们将关注点从 “怎么做” 回归到 “做什么” 本质上,就会发现只要能够更好地达到目的,过程与形式其实并不重要。...而为了指定线程执行内容,需要调用 Thread 构造方法: public Thread(Runnable target) 为了获取 Runnable 接口实现对象,可以为该接口定义一个实现 RunnableImpl...; } }).start(); } } 5.3、匿名内部类好处与弊端 一方面,匿名内部类可以帮我们省去实现定义;另一方面,匿名内部类语法——确实太复杂了!...; 为了省去定义一个 ComparatorImpl 实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象 compare 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上,

31460

62道Java核心面试题,这次全了

Java 中,抽象用于创建具有某些被子类实现默认方法,一个抽象可以有没有方法抽象方法,也可以有和普通一样有方法方法。...需要对自定义对象实现 Comparable 接口,重写 compareTo(T obj) 方法,该方法排序时候会被调用进行排序。...我们可以一个定义一个,这个被称为内部类。内部类可以访问外部类所有变量和方法,内部类中不能有任何静态变量。 44、什么是匿名内部类?...没有名称内部类称为匿名内部类,它通过单个语句进行定义和实例化,总是需要扩展一个或者实现一个接口。 由于匿名内部类没有名称,所以无法为匿名内部类定义构造方法。...当在子类中重写了父方法时,可以通过 super 关键字访问父方法。 也可以使用 super 关键字子类构造方法调用构造方法,它必须是构造方法第一条语句。

61320

【JAVA基础&高级】“面向对象篇” 知识点汇总

JDK7 以前:只能定义全局常量和抽象方法 JDK8 :除了可以定义全局常量和抽象方法之外,还可以定义静态方法,默认方法。 与继承关系类似,接口与实现之间存在多态性。...如果实现重写了接口中默认方法调用时,仍然调用重写以后方法 知识点3 如果子类(实现)继承实现接口中声明了同名同参数默认方法,那么子类没有重写方法情况下,默认调用是父同名同参数方法...(优先原则) 知识点4 如果实现实现了多个接口,而这多个接口中定义了同名同参数默认方法,那么实现没有重写方法情况下,报错 (接口冲突)。...这就需要我们必须在实现重写方法 知识点5 如何在子类(实现)方法调用、接口中被重写方法 public class SubClassTest { public static...一个匿名内部类一定是 new 后面,用其隐含实现一个接口实现一个

1K10

Java匹马行天下之JavaSE核心技术——面向对象

; 抽象可以被继承; 可以通过两种方式获得抽象对象:父引用指向子类对象、匿名内部类; 子类必须重写抽象父所有抽象方法,或者是把子类也定义为抽象; 如果一个继承抽象父还有上级抽象父...;  重写定义: 子类重新声明从父继承来方法,称为方法重写方法重写时,方法声明部分要和父保持一致(返回值类型,方法名,参数); 重写方法访问权限要大于等于父方法访问权限...; 子类重写方法,子类对象调用是子类中重写方法; 使用static修饰方法不能被重写,但是可以被子类重写声明; 不同包子类可以重写中protected修饰方法,但是不能以继承形式...,子类重写方法,父引用调用子类重写方法,执行结果是子类重写方法 o.print(); } } 运行结果: PPT打印 接口是完全抽象抽象,并且可以多实现...声明位置同局部内部类一样,前提条件:必须继承一个实现一个接口,匿名内部类声明和实例化对象是同时进行; 一般使用于获得抽象接口对象; 语法: 父名/接口名 对象名 = new

77530

Java匹马行天下之JavaSE核心技术——面向对象

,才有机会被创建,方法代码块执行结束后被自动销毁; 局部变量在内存栈区分配; 局部变量使用之前必须要先赋值; 静态变量(变量) 声明在所有方法体和代码块之外,并且使用static修饰变量...父引用指向子类对象、匿名内部类; 子类必须重写抽象父所有抽象方法,或者是把子类也定义为抽象; 如果一个继承抽象父还有上级抽象父,那么子类中需要要重写所有抽象父所有抽象方法; 抽象也可以继承非抽象...,子类对象调用是子类中重写方法; 使用static修饰方法不能被重写,但是可以被子类重写声明; 不同包子类可以重写中protected修饰方法,但是不能以继承形式,用子类对象直接调用方法...,子类重写方法,父引用调用子类重写方法,执行结果是子类重写方法         o.print();     } } 运行结果: PPT打印 接口是完全抽象抽象,并且可以多实现...声明位置同局部内部类一样,前提条件:必须继承一个实现一个接口,匿名内部类声明和实例化对象是同时进行; 一般使用于获得抽象接口对象; 语法: 父名/接口名  对象名 =  new  父

44430

Laravel Eloquent 模型中使用作用域进行查询

问题引出 通过 Eloquent 模型实现增删改查这篇教程中,我们已经学习了如何在 Eloquent 模型中进行各种查询,但是这些查询大多需要手动调用查询构建器提供各种方法实现。...如果有一些查询需要在多个地方调用,那么每个地方都要编写同样代码,有没有什么办法对这种场景下查询代码进行优化呢? Eloquent 模型提供「Scope」功能就可以帮我们实现这种优化。...通过匿名函数实现 如果你觉得编写一个「全局作用域」很麻烦,过滤逻辑又很简单,还可以模型 boot 方法中通过匿名函数实现全局作用域: protected static function boot...移除全局作用域 在某些特定场景下,我们可能需要移全局作用域,比如在后台用户管理页,我们需要将验证邮箱用户页显示出来,这个时候我们可以借助模型 withoutGlobalScope 方法实现,该方法支持多种传参格式...「局部作用域」实现也比较简单,需要应用它模型定义一个过滤器方法即可。

2.4K20

【Java】线程池、Lambda表达式

不得不需要Runnable接口实现; 为了省去定义一个RunnableImpl实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍...我们真正希望做事情是:将run方法体内代码传递给Thread知晓。 传递一段代码——这才是我们真正目的。而创建对象只是受限于面向对象语法而不得不采取一种手段方式。那,有没有更加简单办法?...而为了指定线程执行内容,需要调用Thread构造方法: public Thread(Runnable target) 为了获取Runnable接口实现对象,可以为该接口定义一个实现RunnableImpl...; } }).start(); } } 匿名内部类好处与弊端 一方面,匿名内部类可以帮我们省去实现定义;另一方面,匿名内部类语法——确实太复杂了!...为了省去定义一个ComparatorImpl实现麻烦,不得不使用匿名内部类; 必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上

28020

一文读懂《Effective Java》第7条:避免使用终结方法

终结方法弊端 java中,终结方法一般会结合 try-finally 块来一起使用, finally 子句内部调用终结方法。...由于JVM会延迟执行终结方法,所以大量文件会保留在打开状态,当一个程序不能打开文件时候回导致运行失败。 垃圾回收算法主要功能是:及时执行终结方法,而这种算法不同JVM有不同实现。...“终结方法链”(finalizer)同样不会被自动执行,如果类有定义终结方法,并且子类覆盖了该终结方法,那么子类终结方法就得手工调用终结方法:以确保即使子类终结方法过程抛出异常,父终结方法也会得以执行...我们不将终结方法封装在一个要求终结处理中,二是放在一个匿名里,该匿名唯一用途是终结它外围实例(enclosing instance),该匿名单个实例就被称为终结方法守卫者。...并没有终结方法(除了从Object继承finalize()之外),所以子类终结方法是否调用super.finalize 并不重要。

27320

java接口详解

(即自己设置自己用) 知识点2:通过实现对象,可以调用接口中默认方法。 如果实现重写了接口中默认方法调用时,仍然调用重写方法,和继承中重写一样....知识点3:如果子类(实现)继承实现接口(父接口)中声明了同名同参数默认方法,那么子类没有重写方法情况下,默认调用是父同名同参数方法。...–>优先原则,针对方法,属性不存在谁优先。 知识点4:如果实现 仅仅是 实现了多个接口,而这多个接口中定义了同名同参数默认方法,那么实现没有重写方法情况下,报错 —>接口冲突。...(实现)继承实现接口(父接口)中 * 声明了同名同参数默认方法,那么子类没有重写方法情况下,默认 * 调用是父同名同参数方法。...("子类:深圳"); } //知识点5:如何在子类(实现方法调用、接口中重写方法 public void myMethod(){ method3

25421

实现线程方式到底有几种?

实现 Runnable 接口,然后重写 run() 方法,之后只需要把这个实现了 run() 方法实例传到 Thread 中就可以实现多线程。...,并重写了其中 run() 方法。...表达式创建线程,它们仅仅是语法层面上实现了线程,并不能把它归结于实现多线程方式,如匿名内部类实现线程代码所示,它仅仅是用一个匿名内部类把需要传入 Runnable 给实例出来。...然后,我们来看第二种方式,也就是继承 Thread 方式,实际上,继承 Thread 之后,会把上述 run() 方法重写重写后 run() 方法里直接就是所需要执行任务,但它最终还是需要调用...第三点好处在于 Java 语言不支持双继承,如果我们一旦继承了 Thread ,那么它后续就没有办法再继承其他,这样一来,如果未来这个需要继承其他实现一些功能上拓展,它就没有办法做到了,

1.8K30

Java知识面试题复习(三)Java面向对象

多态性:父接口定义引用变量可以指向子类具体实现实例对象。提高了程序拓展性。 Java中有两种形式可以实现多态:继承(多个子类对同一方法重写)和接口(实现接口并覆盖接口中同一方法)。...运行时多态是面向对象最精髓东西,要实现多态需要做两件事: 方法重写(子类继承父重写中已有的抽象方法); 对象造型(用父类型引用子类型对象,这样同样引用调用同样方法就会根据子类对象不同而表现出不同行为...重写:子类对父中某些方法进行重新定义调用这些方法时就会调用子类方法。 向上转型:多态中需要将子类引用赋给父对象,只有这样该引用才能够具备技能调用方法和子类方法。...解决办法里加上一个不做事且没有参数构造方法调用子类构造方法之前会先调用没有参数构造方法,其目的是? 帮助子类做初始化工作。 一个构造方法作用是什么?...匿名内部类不能定义任何静态成员和静态方法。 当所在方法形参需要被匿名内部类使用时,必须声明为 final。 匿名内部类不能是抽象,它必须要实现继承或者实现接口所有抽象方法

35130

Java入门教程-面向对象

,又定义了子类特有的内容 区别 方法重写继承体系中,子类出现了和父一模一样方法声明(方法名,参数列表,返回值类型) 方法重载:同一个中,方法名相同,参数列表不同,与返回值无关 方法重写是子类对父方法增强...(方法),抽取到父之后,发现该方法实现逻辑无法中给出具体明确,该方法就可以定义为抽象方法。...注意事项 抽象不能实例化(创建对象) 抽象中有构造方法创建子类对象时,初始化抽象自动调用) 抽象子类 要么重写中所有的抽象方法 要么将自己也变成一个抽象(了解) 抽象方法...通俗来说就是写代码风格 模板设计模式:把抽象整体就可以看做成一个模板,模板中不能决定东西定义成抽象方法 让使用模板(继承抽象)去重写抽象方法实现需求 优势:模板已经定义了通用结构,使用者只需要关心自己需要实现功能即可...匿名内部类 本质上是一个特殊局部内部类(定义方法内部)【使用次数远远大于成员内部类和局部内部类】 前提:需要存在一个接口 格式new 名或者接口名(){ 重写方法; } 理解:将继承\实现

21320

Java基础(最精美 全干货)

方法重载 ,可以让我们不同需求下, 通过传递不同参数调用方法来完成具体功能 构造方法重载: 参数列表长度 类型不同 即可完成构造方法重载 ~ static:...synchronized(obj)//需要被同步代码块} super: super表示当前, 1 用在子类里调用(父里面)隐藏重写属性行为 2 用在子类构造方法里(初始化用...格式: abstract class 名{ // 抽象 } public abstract void 方法名() ; // 抽象方法,只声明而实现 抽象使用中有几个原则: · 抽象本身是不能直接进行实例化操作...如果有实现抽象方法,那么子类也必须定义为 abstract 接口: 如果一个全部方法都是抽象方法,全部属性都是全局常量,那么此时就可以将这个定义成一个接口。...重写equals 有快捷键 内部类: Java中,可以将一个定义另一个里面或者一个方法里面,这样称为内部类。

47830
领券