不当的equals方法和hashCode方法实现 当我们定义个新的类时,往往需要重写equals方法和hashCode方法。在HashSet和HashMap中的很多操作都用到了这两个方法。...但由于上述代码的Person类并没有重写equals方法,因此在执行put操作时,Map会认为每次创建的对象都是新的对象,从而导致内存不断的增长。...第一,如果创建一个实体类,总是重写equals方法和hashCode方法;第二,不仅要覆盖默认的方法实现,而且还要考虑最优的实现方式; 外部类引用内部类 这种情况发生在非静态内部类(匿名类)中,在类初始化时...finalize()方法 使用finalize()方法会存在潜在的内存泄露问题,每当一个类的finalize()方法被重写时,该类的对象就不会被GC立即回收。...假设某个类重写了finalize()方法,并且重写的方法在执行时需要一些时间。
static:属于类,可直接调用或采用 类.方法()调用 非static:属于对象,只能采用 对象.方法()调用 在static扩展中我们将讲到匿名代码块和静态代码块 这两者可写于类中: public...new application(); } } 结果: 静态代码块 匿名代码块 构造方法 我们可以看到在类的产生过程中,各部分的生成先后顺序是:静态代码块,匿名代码块,构造方法。...抽象类 概念: 抽象类中可以包含未被定义的抽象方法,有利于后者重构 抽象定义: public abstract class 抽象类名{ ......//抽象类中可包含未被定义的抽象方法 public abstract void 抽象方法名(); ......必须重写接口的方法 内部类(拓展) 内部类定义: 在一个类的内部再定义一个类 内部类在后面我们会再提起,所有这里先讲述一种类型:成员内部类 概念: 定义在一个类里面的另一个类 //成员内部类
final关键字 final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写: 方法不能重写 类不能继承 final标记的变量(成员变量或局部变量)即称为常量。...被修饰后的成员具备以下特点: 修饰的成员,被所有对象所共享 访问权限允许时,可不创建对象,直接用类名.属性或方法调用 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static...除此之外的任何地方 都不能使用该类 但是它的对象可以通过外部方法的返回值返回使用,返回值类型只能是局部内部类 的父类或父接口类型 局部内部类可以使用外部方法的局部变量,但是必须是final的。...匿名内部类 匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一 个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或 实现一个类。...匿名内部类的特点 匿名内部类必须继承父类或实现接口 匿名内部类只能有一个对象 匿名内部类对象只能使用多态形式引用 interface A{ public abstract void fun1(); }
Runnable接口的实现类; 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;...传递一段代码——这才是我们真正的目的。而创建对象只是受限于面向对象语法而不得不采取的一种手段方式。那,有没有更加简单的办法?...而为了指定线程执行的内容,需要调用Thread类的构造方法: public Thread(Runnable target) 为了获取Runnable接口的实现对象,可以为该接口定义一个实现类RunnableImpl...; } }).start(); } } 匿名内部类的好处与弊端 一方面,匿名内部类可以帮我们省去实现类的定义;另一方面,匿名内部类的语法——确实太复杂了!...ComparatorImpl实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上,只有参数和方法体才是关键。
背景 最近在做一个小的工程项目,通过使用AOP和自定义注解的方式实现了操作日志的记录,并单独封装以供其他模块的调用。...项目模块结构简示 如上所示 itf.service 定义 api 接口规范,然后 controller实现所接口并完善方法;所以最初为了代码上的好看,将自定义的注解直接标注在了 itf.service...其实当我们把注解用在方法中,就没有没有所谓继承问题,只有方法的重写问题。 即对于类中方法上的注解,若子类重写了父类带注解方法,从子类无法获取到注解。 子类没有重写父类带注解方法,可以通过子类获得注解。...在该方式中接口中的注解无法被实现类继承,AOP 中的切点无法匹配上实现类,所以也就不会为实现类创建代理,所以我们使用的类其实是未被代理的原始类,自然也就不会被增强了。...则根据上边提到的只有方法的重写问题,可知,被重写的方法将不会被拦截,而未重写的方法则走 Parent 路线,可以被 AOP 感知拦截。
Runnable接口的实现类; 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;...我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓。 传递一段代码——这才是我们真正的目的。而创建对象只是受限于面向对象语法而不得不采取的一种手段方式。那,有没有更加简单的办法?...而为了指定线程执行的内容,需要调用Thread类的构造方法: public Thread(Runnable target) 为了获取Runnable接口的实现对象,可以为该接口定义一个实现类RunnableImpl...; } }).start(); } } 匿名内部类的好处与弊端 一方面,匿名内部类可以帮我们省去实现类的定义;另一方面,匿名内部类的语法——确实太复杂了!...ComparatorImpl实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上,只有参数和方法体才是关键。
我们按照上面目录结构的介绍其实已经有一些思路: 定义一个Log接口,以便于统一抽象日志功能,这8种日志功能都实现Log接口,并且重写日志打印方法。...它里面定义了一个静态的构造器logConstructor,没有用if...else判断,在static代码块中调用了6个tryImplementation方法,该方法会启动一个执行任务去调用了useXXXLogging...而这个方法是在Configuration类中调用的,如果用户有自定义logImpl参数的话。 ? ? 具体是在XMLConfigBuilder类的settingsElement方法中调用 ?...根据getLog方法获取Log实例 通过Log实例的具体日志方法打印日志 在这里还分享一个知识点,如果某个工具类里面都是静态方法,那么要把该工具类的构造方法定义成private的,防止被疑问调用,LogFactory...彩蛋 不知道大家有没有发现这样一个问题: 在LogFactory的代码中定义了很多匿名的任务执行器 ? 但是在实际调用时,却没有在线程中执行,而是直接调用的,这是为什么? ?
run 的方法体,不得不需要 Runnable 接口的实现类; 为了省去定义一个 RunnableImpl 实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象 run 方法,所以方法名称、方法参数、...那,有没有更加简单的办法?如果我们将关注点从 “怎么做” 回归到 “做什么” 的本质上,就会发现只要能够更好地达到目的,过程与形式其实并不重要。...而为了指定线程执行的内容,需要调用 Thread 类的构造方法: public Thread(Runnable target) 为了获取 Runnable 接口的实现对象,可以为该接口定义一个实现类 RunnableImpl...; } }).start(); } } 5.3、匿名内部类的好处与弊端 一方面,匿名内部类可以帮我们省去实现类的定义;另一方面,匿名内部类的语法——确实太复杂了!...; 为了省去定义一个 ComparatorImpl 实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象 compare 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上,
在 Java 中,抽象类用于创建具有某些被子类实现的默认方法的类,一个抽象类可以有没有方法体的抽象方法,也可以有和普通类一样有方法体的方法。...需要对自定义对象的类实现 Comparable 接口,重写 compareTo(T obj) 方法,该方法在排序的时候会被调用进行排序。...我们可以在一个类中定义一个类,这个类被称为内部类。内部类可以访问外部类的所有变量和方法,内部类中不能有任何静态变量。 44、什么是匿名内部类?...没有名称的内部类称为匿名内部类,它通过单个语句进行定义和实例化,总是需要扩展一个类或者实现一个接口。 由于匿名内部类没有名称,所以无法为匿名内部类定义构造方法。...当在子类中重写了父类方法时,可以通过 super 关键字访问父类方法。 也可以使用 super 关键字在子类构造方法中调用父类构造方法,它必须是构造方法中的第一条语句。
JDK7 以前:只能定义全局常量和抽象方法 JDK8 :除了可以定义全局常量和抽象方法之外,还可以定义静态方法,默认方法。 与继承关系类似,接口与实现类之间存在多态性。...如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法 知识点3 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法...(类优先原则) 知识点4 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错 (接口冲突)。...这就需要我们必须在实现类中重写此方法 知识点5 如何在子类(或实现类)的方法中调用父类、接口中被重写的方法 public class SubClassTest { public static...一个匿名内部类一定是在 new 的后面,用其隐含实现一个接口或实现一个类。
; 抽象类可以被继承; 可以通过两种方式获得抽象类对象:父类引用指向子类对象、匿名内部类; 子类必须重写抽象父类的所有抽象方法,或者是把子类也定义为抽象类; 如果一个类继承的抽象父类还有上级抽象父类...; 重写定义: 子类重新声明从父类继承来的方法,称为方法重写; 方法重写时,方法的声明部分要和父类保持一致(返回值类型,方法名,参数); 重写方法的访问权限要大于等于父类中方法的访问权限...; 子类重写父类方法,子类对象调用的是子类中重写后的方法; 使用static修饰的方法不能被重写,但是可以被子类重写声明; 不同包的子类可以重写父类中protected修饰的方法,但是不能以继承的形式...,子类重写父类方法,父类引用调用子类重写后的方法,执行的结果是子类重写后的方法 o.print(); } } 运行结果: PPT打印 接口是完全抽象的抽象类,并且可以多实现...声明位置同局部内部类一样,前提条件:必须继承一个类或实现一个接口,匿名内部类的声明和实例化对象是同时进行的; 一般使用于获得抽象类或接口对象; 语法: 父类名/接口名 对象名 = new
,才有机会被创建,在方法或代码块执行结束后被自动销毁; 局部变量在内存的栈区分配; 局部变量在使用之前必须要先赋值; 静态变量(类的变量) 声明在所有方法体和代码块之外,并且使用static修饰的变量...父类引用指向子类对象、匿名内部类; 子类必须重写抽象父类的所有抽象方法,或者是把子类也定义为抽象类; 如果一个类继承的抽象父类还有上级抽象父类,那么子类中需要要重写所有抽象父类的所有抽象方法; 抽象类也可以继承非抽象类...,子类对象调用的是子类中重写后的方法; 使用static修饰的方法不能被重写,但是可以被子类重写声明; 不同包的子类可以重写父类中protected修饰的方法,但是不能以继承的形式,用子类对象直接调用父类的该方法...,子类重写父类方法,父类引用调用子类重写后的方法,执行的结果是子类重写后的方法 o.print(); } } 运行结果: PPT打印 接口是完全抽象的抽象类,并且可以多实现...声明位置同局部内部类一样,前提条件:必须继承一个类或实现一个接口,匿名内部类的声明和实例化对象是同时进行的; 一般使用于获得抽象类或接口对象; 语法: 父类名/接口名 对象名 = new 父类名
问题引出 在通过 Eloquent 模型实现增删改查这篇教程中,我们已经学习了如何在 Eloquent 模型类中进行各种查询,但是这些查询大多需要手动调用查询构建器提供的各种方法来实现。...如果有一些查询需要在多个地方调用,那么在每个地方都要编写同样的代码,有没有什么办法对这种场景下的查询代码进行优化呢? Eloquent 模型类提供的「Scope」功能就可以帮我们实现这种优化。...通过匿名函数实现 如果你觉得编写一个「全局作用域」类很麻烦,过滤逻辑又很简单,还可以在模型类的 boot 方法中通过匿名函数实现全局作用域: protected static function boot...移除全局作用域 在某些特定场景下,我们可能需要移全局作用域,比如在后台用户管理页,我们需要将未验证邮箱的用户页显示出来,这个时候我们可以借助模型类的 withoutGlobalScope 方法来实现,该方法支持多种传参格式...「局部作用域」的实现也比较简单,在需要应用它的模型类中定义一个过滤器方法即可。
不得不需要Runnable接口的实现类; 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍...我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓。 传递一段代码——这才是我们真正的目的。而创建对象只是受限于面向对象语法而不得不采取的一种手段方式。那,有没有更加简单的办法?...而为了指定线程执行的内容,需要调用Thread类的构造方法: public Thread(Runnable target) 为了获取Runnable接口的实现对象,可以为该接口定义一个实现类RunnableImpl...; } }).start(); } } 匿名内部类的好处与弊端 一方面,匿名内部类可以帮我们省去实现类的定义;另一方面,匿名内部类的语法——确实太复杂了!...为了省去定义一个ComparatorImpl实现类的麻烦,不得不使用匿名内部类; 必须覆盖重写抽象compare方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; 实际上
终结方法的弊端 在java中,终结方法一般会结合 try-finally 块来一起使用,在 finally 子句内部调用终结方法。...由于JVM会延迟执行终结方法,所以大量的文件会保留在打开状态,当一个程序不能打开文件的时候回导致运行失败。 垃圾回收算法的主要功能是:及时的执行终结方法,而这种算法在不同的JVM有不同的实现。...“终结方法链”(finalizer)同样不会被自动执行,如果类有定义终结方法,并且子类覆盖了该终结方法,那么子类的终结方法就得手工调用父类的终结方法:以确保即使子类的终结方法过程抛出异常,父类的终结方法也会得以执行...我们不将终结方法封装在一个要求终结处理的类中,二是放在一个匿名类里,该匿名类唯一用途是终结它的外围实例(enclosing instance),该匿名类的单个实例就被称为终结方法守卫者。...并没有终结方法(除了从Object继承的finalize()之外),所以子类的终结方法是否调用super.finalize 并不重要。
(即自己设置自己用) 知识点2:通过实现类的对象,可以调用接口中的默认方法。 如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写后的方法,和继承中的重写一样的....知识点3:如果子类(或实现类)继承的父类和实现的接口(父接口)中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。...–>类优先原则,针对方法来的,属性不存在谁优先。 知识点4:如果实现类 仅仅是 实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错 —>接口冲突。...(或实现类)继承的父类和实现的接口(父接口)中 * 声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认 * 调用的是父类中的同名同参数的方法。...("子类:深圳"); } //知识点5:如何在子类(或实现类)的方法中调用父类、接口中的被重写的方法 public void myMethod(){ method3
类实现 Runnable 接口,然后重写 run() 方法,之后只需要把这个实现了 run() 方法的实例传到 Thread 类中就可以实现多线程。...类,并重写了其中的 run() 方法。...表达式创建线程,它们仅仅是在语法层面上实现了线程,并不能把它归结于实现多线程的方式,如匿名内部类实现线程的代码所示,它仅仅是用一个匿名内部类把需要传入的 Runnable 给实例出来。...然后,我们来看第二种方式,也就是继承 Thread 方式,实际上,继承 Thread 类之后,会把上述的 run() 方法重写,重写后 run() 方法里直接就是所需要执行的任务,但它最终还是需要调用...第三点好处在于 Java 语言不支持双继承,如果我们的类一旦继承了 Thread 类,那么它后续就没有办法再继承其他的类,这样一来,如果未来这个类需要继承其他类实现一些功能上的拓展,它就没有办法做到了,
多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。 在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。...运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事: 方法重写(子类继承父类并重写父类中已有的或抽象的方法); 对象造型(用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为...重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。...解决办法是在父类里加上一个不做事且没有参数的构造方法。 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是? 帮助子类做初始化工作。 一个类的构造方法的作用是什么?...匿名内部类不能定义任何静态成员和静态方法。 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
,又定义了子类特有的内容 区别 方法重写:在继承体系中,子类出现了和父类一模一样的方法声明(方法名,参数列表,返回值类型) 方法重载:在同一个类中,方法名相同,参数列表不同,与返回值无关 方法重写是子类对父类方法的增强...(方法),抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法。...注意事项 抽象类不能实例化(创建对象) 抽象类中有构造方法(在创建子类对象时,初始化抽象类自动调用) 抽象类的子类 要么重写父类中所有的抽象方法 要么将自己也变成一个抽象类(了解) 抽象类中的方法...通俗来说就是写代码的风格 模板设计模式:把抽象整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法 让使用模板的类(继承抽象类的类)去重写抽象方法实现需求 优势:模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可...匿名内部类 本质上是一个特殊的局部内部类(定义在方法内部)【使用次数远远大于成员内部类和局部内部类】 前提:需要存在一个接口或类 格式new 类名或者接口名(){ 重写方法; } 理解:将继承\实现
方法的重载 ,可以让我们在不同的需求下, 通过传递不同的参数调用方法来完成具体的功能 构造方法的重载: 参数列表的长度 或类型不同 即可完成构造方法的重载 ~ static:...synchronized(obj)//需要被同步的代码块} super: super表示当前类的父类, 1 用在子类里调用(父类里面)隐藏或重写的属性或行为 2 用在子类的构造方法里(初始化用...格式: abstract class 类名{ // 抽象类 } public abstract void 方法名() ; // 抽象方法,只声明而未实现 在抽象类的使用中有几个原则: · 抽象类本身是不能直接进行实例化操作的...如果有未实现的抽象方法,那么子类也必须定义为 abstract类 接口: 如果一个类中的全部方法都是抽象方法,全部属性都是全局常量,那么此时就可以将这个类定义成一个接口。...重写equals 有快捷键 内部类: 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
领取专属 10元无门槛券
手把手带您无忧上云