精华内容
下载资源
问答
  • 什么Java匿名内部类

    2017-11-20 14:58:41
    Thread本身并不是抽象类或接口,但此处重写了run方法,只有子类可以重写父类方法,所以new出的并不Thread类,而是Thread类的匿名子类,即匿名内部类。如果不重写run方法,那么new出的就是Thread类本身,就不存在...

    public class Demo {
        public static void main(String[] args) {
            Thread t = new Thread() {
                public void run() {
                    for (int i = 1; i <= 5; i++) {
                        System.out.print(i + " ");
                    }
                }
            };
            t.start();
        }
    }


    Q:上面的一段代码中,Thread类是匿名内部类吗?

    A:是匿名内部类(其实还不准确)。Thread本身并不是抽象类或接口,但此处重写了run方法,只有子类可以重写父类方法,所以new出的并不是Thread类,而是Thread类的匿名子类,即匿名内部类。如果不重写run方法,那么new出的就是Thread类本身,就不存在匿名内部类了。(摘自java中的匿名内部类总结

    展开全文
  • 抽象类能实例化吗?这个问题我想了一个晚上,看了好几篇...也可以匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象 。(后面会细说)现在重点来了,要研究这个问题,前提你...

    抽象类能实例化吗?

    这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了:

    抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的对象, 需要先用一个类继承抽象类,  然后去实例化子类。也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象 。(后面会细说)

    现在重点来了,要研究这个问题,前提是你要了解抽象类,万变不离其宗,我们从抽象类的根源谈起 , 深化对抽象类的理解。

    首先看这个例子:

    package com.my.animal;//动物类

    public classAnimal {

    String name;//名字

    String color;//颜色

    publicAnimal(String name,String color){this.name =name;this.color =color;

    }public voidrun(){

    System.out.println(name+"四条腿跑的很快!!!");

    }

    }//狗类继承动物类

    classDog extends Animal{publicDog(String name,String color){

    super(name,color);

    }

    }//鱼类继承动物类

    classFish extends Animal{publicFish(String name, String color) {

    super(name, color);

    }

    }classTest{public static voidmain(String[] args) {

    Dog dog= new Dog("哈巴狗","白色");

    dog.run();

    Fish fish= new Fish("锦鲤","红色");

    fish.run();

    }

    }

    运行结果:

    哈巴狗四条腿跑的很快!!!

    锦鲤四条腿跑的很快!!!

    是不是发现问题了,鱼怎么能用腿跑呢,难道是原始鱼?哈哈,开玩笑的,这个问题如何解决,估计大家马上想到了,在子类中重写父类的run方法不就行了,对,确实这样就可以解决,但是大家想过没有,我们是如何发现这个问题的?是不是编译运行之后才看到的,当然,也有大佬能不编译运行就能看到,不抬杠啊,意思是说有发现不了这个问题的风险,对别人可能无所谓,但对我们程序员来说,这种低级错误还是不犯的好,程序员应该有更高的追求,岂能在这被绊倒,我们要把这种风险降为零,那该如何做呢?不急,心急吃不了热豆腐,且看我慢慢分析:

    目前存在的问题:

    1.动物类的run方法描述的不正确

    2.没有强制要子类一定要重写父类的run方法

    解决方案:(抽象类的应用场景)

    我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前是不具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类

    先看下面的例子:

    package com.my.animal;//动物类(抽象类)

    public abstract classAnimal {

    String name;//名字

    String color;//颜色//构造方法

    publicAnimal(String name,String color){this.name =name;this.color =color;

    }

    //非抽象方法

    public void eat(){

    System.out.println(name+"吃东西!!!");

    }//抽象方法

    public abstract voidrun();

    }classDog extends Animal{publicDog(String name,String color){

    super(name,color);

    }

    @Overridepublic voidrun() {

    System.out.println(name+"四条腿跑得快!!");

    }

    }classFish extends Animal{publicFish(String name, String color) {

    super(name, color);

    }

    @Overridepublic voidrun() {

    System.out.println(name+"摇摇尾巴游啊游!!");

    }

    }classTest{public static voidmain(String[] args) {

    Dog dog= new Dog("哈巴狗","白色");

    dog.run();

    Fish fish= new Fish("锦鲤","红色");

    fish.run();

    }

    }

    运行结果:

    哈巴狗四条腿跑得快!!

    锦鲤摇摇尾巴游啊游!!

    这个问题解决了,那还有一个问题就是:抽象类能实例化对象吗?

    看这个例子就知道了:

    public abstract classAnimal {

    String name;

    String color;publicAnimal(String name,String color){this.name =name;this.color =color;

    }public abstract voidrun();

    }classTest{public static voidmain(String[] args) {

    Animal a= newAnimal();

    a.run();

    }

    }

    运行结果:

    Error:(45, 20) java: com.my.animal.Animal是抽象的; 无法实例化

    抽象类注意的细节:

    1.如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象的函数。

    2.如果一个类出现了抽象的函数,那么该类也必须使用abstract修饰。

    3.如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。

    4.抽象类可以存在抽象方法,也可以存在非抽象方法,还可以不存在抽象方法,但是这样没任何意义,Java是不写废话的。

    5.抽象类是不能实例化对象的

    6.抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。

    疑问:为什么抽象类不能实例化对象?

    因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象类的对象调用抽象方法是没有任何意义的。

    疑问排解了,故事结束了?不,学海本无底,我们来点扩展,就是开头提到的如何用匿名内部类去实例化子类对象。

    看下面的例子:

    package Practice_Anything;public abstract classJava_Abstract2 {public voida(){

    System.out.println("我是抽象类中的一个非抽象方法");

    }public staticJava_Abstract2 newIntences(){return newJava_Abstract2(){

    };

    }

    }classTest2{public static voidmain(String[] args) {

    Java_Abstract2 java_abstract2=Java_Abstract2.newIntences();

    java_abstract2.a();

    }

    }

    运行结果:

    我是抽象类中的一个非抽象方法

    这个故事到这就结束了,但是学习还没有停止,比如接口也是一种抽象类型,是抽象方法的集合,由此,我们是不是该联想到学习接口了呢?哈哈,学海本无底,前行莫彷徨!

    此篇为本人原创,花了大概半天时间,找了不知多少相关资料整合而成,如若对你有用,记得推荐,如若哪有不当,感谢指正!

    本文已独家授权给脚本之家(jb51net)公众号独家发布

    展开全文
  • 枚举类包含匿名内部类,该父类不是final修饰,其内部类final修饰 在今天的学习,我发现了枚举类enum是可以派生子类的,可是不是说enum为了不改变数据,使用final修饰的吗,于是我就自己试了试,首先使用正常没...
    枚举类默认是final修饰的,不能派生子类,但是

    枚举类如果是抽象的,则其不是final修饰,可以派生子类,其子类为final修饰

    枚举类包含匿名内部类,该父类不是final修饰,其内部类是final修饰

    在今天的学习,我发现了枚举类enum是可以派生子类的,可是不是说enum为了不改变数据,使用final修饰的吗,于是我就自己试了试,首先使用正常没有派生子类的枚举类如下:

    public enum AceEnum{
    	BOY("男孩"),GIRL("女孩");
    	private String gender;
    	private AceEnum(String gender){
    		this.gender = gender;
    	}
    }
    

    然后编译,并进行反编译:
    在这里插入图片描述
    可以看的出,在编译后,AceEnum枚举类已经是final类,那么按理说应该是不能派生子类的,可是,继续向下看。如果我们要为每个不同的枚举对象设置一个特定的方法,那么就需要应用的匿名内部类,为其实现相应方法,也就是改成下面的代码

    public enum AceEnum{
    	BOY("男孩"){
    		public void show(){
    			System.out.println("我是男孩");
    		}
    	},GIRL("女孩"){
    		public void show(){
    			System.out.println("我是女孩");
    		};
    	};
    	private String gender;
    	private AceEnum(String gender){
    		this.gender = gender;
    	}
    }
    

    在这里插入图片描述
    结果发现,他的final修饰符没有了,所以是可以派生出匿名子类,不过也同样注意到,匿名内部类中的方法是无意义的,因为没有办法通过枚举类使用该方法,所以需要为其添加一个可以呗访问的方法,

    public enum AceEnum{
    	BOY("男孩"){
    		public void show(){
    			System.out.println("我是男孩");
    		}
    	},GIRL("女孩"){
    		public void show(){
    			System.out.println("我是女孩");
    		};
    	};
    	private String gender;
    	private AceEnum(String gender){
    		this.gender = gender;
    	}
    	public abstract void show();
    }
    

    在这里插入图片描述
    也就发现,现在这种情况符合我们的要求,并且这个枚举类是抽象的,然后通过查阅资料,我发现

    枚举类,如果是非抽象的,那么会默认采用final修饰,而如果是抽象的,也即是最后一个例子,那么由于抽象类是不能被final修饰的,(抽象类如果不实现就没什么意义,用final修饰的话会导致其不能被实现),所以是可以派生子类的。

    而另一种情况,就是非抽象,不过用匿名内部类实现自己特定的方法:

    public enum AceEnum{
    
    	MALE("男"){
    		public void info() {
    			System.out.println("男的");
    		}
    	},
    	FEMALE("女"){
    		public void info() {
    			System.out.println("女的");
    		}
    	};
    	private final String name;
    	private AceEnum(String name) {
    		this.name = name;
    	}
    	public String getName() {
    		return name;
    	}
    	public void info() {
    		System.out.println("我是默认");
    	}
    	public static void main(String[] args) {
    		AceEnum boy = AceEnum.MALE;
    		boy.info();
    	}
    }
    
    

    在这里插入图片描述
    编译后,有三个文件,一个是枚举类父类,他是没有final修饰符的,还有两个内部类,都继承于父类,他们都是final修饰的。

    我认为这个机制是能更好的让我们使用枚举类

    1.我们在使用枚举类的时候,不能更改枚举类的信息

    2.枚举类可以根据不同需求,对不同枚举值编写其不同的方法

    转载于:https://www.cnblogs.com/xiatom/p/10784853.html

    展开全文
  • 接口中可以有实现代码吗?

    千次阅读 2017-03-23 09:37:08
    西城旧梦梦旧人 2017-03-22 21:59 大家可能会很坚定的说,怎么可能!...然而对于一般的程序,接口确实没有任何实现,但是匿名内部类(或者内部类)呢?下面请看代码。 public interface
    
    

    大家可能会很坚定的说,怎么可能!接口可以声明常量,声明抽象方法,也可以继承父接口,但是不能有具体实现。因为接口是一种契约,是一种框架性协议,这表明它的实现类都是同一种类型,或者说具备相似特征的一个集合体。然而对于一般的程序,接口确实没有任何实现,但是匿名内部类(或者内部类)呢?下面请看代码。

    1. public interface A {

      public void doSomething();

      }

    2. public interface B {

      public static final A a=new A(){

      public void doSomething(){

      System.out.println("我再接口B中实现了");

      }

      };

      }

    下面看一下测试类的内容

    public class Test {

    public static void main(String[] args) {

    //调用接口的实现

    B.a.doSomething();

    }

    }

    可以看到在接口A中声明了一个方法,在B接口中声明了一个静态变量a,他的值是一个匿名内部类的实例对象,就是该内部类实现了A的接口,这样就在B接口中存在着实现代码。而我们测试类的main方法中,调用了B接口的常量,在没有任何显示实现类的情况下,可以打印出B中实现的代码(打印出了“我再接口B中实现了”)。

    可以,这样很强大对吧!但是在代码中是严禁出现的,因为这是一种不好的编码习惯,接口是用来干嘛的?接口是一个契约,不仅仅约束着实现着,同时也是一个保证,保证提供的服务(常量、方法)是稳定的,可靠的,如果把实现的代码写到了接口中,那接口就绑定可可能变化的因素,导致实现不再稳定和可靠,是随时可以被更改,被重构的。所以在接口中可以有实现代码,但是应该避免使用。面试的时候是不是可以装一波了嘿嘿。

    谢谢大家的观看,喜欢的关注一波~~~

    展开全文
  • 基础知识: 1.什么面向对象(OOP)? 2.什么多态?实现多态的机制什么? 3.接口(Interface)与抽象类(Abstract Class)的区别?...内部类、静态内部类、局部内部类和匿名内部类的区别及作...
  • 你还不懂Lambda吗!

    2016-05-18 01:04:39
    Lambda相当于就是一个匿名方法,其在代替匿名内部类创建对象的时候,Lambda表达式代码块会代替实现抽象方法的方法体 Lambda表达式的目标类型必须“函数式接口(FunctionalInterface)”。函数式接口只能包含一个抽象...
  • lambada表达式总结

    千次阅读 2019-03-22 14:46:27
    前言 作为jdk1.8的新特性,8的标准库都开始大量使用lambda表达式了,你有什么理由不去学习lambda,这么简洁,这么爽的一种编程方法,不学不觉得可惜吗?...匿名内部类可以对接口和抽象类进行使用,直接生...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 枚举类 217 6.8.1 手动实现枚举类 217 6.8.2 枚举类入门 219 6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...
  • 10.5.3 instanceof运算符——让对象告诉你它的类是谁 286 10.6 小结:继承和多态让世界丰富多彩 287 10.7 习题 290 第11章 修饰符(Qualifier) 291 教学视频:26分钟 11.1 插曲:的组成部分的名字 291 11.2...
  • 10.5.3 instanceof运算符——让对象告诉你它的类是谁 286 10.6 小结:继承和多态让世界丰富多彩 287 10.7 习题 290 第11章 修饰符(Qualifier) 291 教学视频:26分钟 11.1 插曲:的组成部分的名字 291 11.2...
  • 10.5.3 instanceof运算符——让对象告诉你它的类是谁 286 10.6 小结:继承和多态让世界丰富多彩 287 10.7 习题 290 第11章 修饰符(Qualifier) 291 教学视频:26分钟 11.1 插曲:的组成部分的名字 291 11.2...
  • Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。  接口(interface)是抽象类的变体。在接口中,所有...
  • java 面试题 总结

    2009-09-16 08:45:34
    Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...
  • java面试宝典

    2013-02-28 16:04:01
    44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)? 12 45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制什么...
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以implements(实现)interface(接口)? 12 45、内部类可以引用他包含类的成员吗?有没有什么限制? 12 46、java 中实现多态的机制什么...
  • 【基础】Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 30 【基础】Java 中的final关键字有哪些用法? 31 【基础】内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制? 31 ...
  • java基础题 很全面

    2009-05-09 09:24:24
    68. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 15 69. LINUX下线程,GDI类的解释。 15 70. java常用的设计模式?说明工厂模式。 15 71. 内部类可以...
  • 31、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 33、数字转字符有多少种方式,分别什么 22 34、Java创建对象有几种方式 22 35、写出验证...
  • 28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String最基本的数据类型吗? 22 31、String s = ...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    52. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以 implements(实现)interface(接口)? 16 53. BS与CS的联系与区别。 16 54. 内部类可以引用他包含类的成员吗?有没有什么限制? 17 二...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 21 29、super.getClass()方法调用 21 30、String最基本的数据类型吗? 22 31、String s = "Hello...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    28、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 29、super.getClass()方法调用 30、String最基本的数据类型吗? 31、String s = "Hello";s = ...
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     实例179 匿名内部类的使用规范 297  实例180 电话与移动电话 299  10.4 静态内部类 300  实例181 静态内部类的使用规范 300  实例182 苹果的来历 302  10.5 接口 303  实例183 求n的幂数与倍数 304 ...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     实例179 匿名内部类的使用规范 297  实例180 电话与移动电话 299  10.4 静态内部类 300  实例181 静态内部类的使用规范 300  实例182 苹果的来历 302  10.5 接口 303  实例183 求n的幂数与倍数 ...
  • java范例开发大全

    2013-03-08 20:06:54
    实例179 匿名内部类的使用规范 297 实例180 电话与移动电话 299 10.4 静态内部类 300 实例181 静态内部类的使用规范 300 实例182 苹果的来历 302 10.5 接口 303 实例183 求n的幂数与倍数 304 实例184 商品订单 306 ...
  • 密封类不能同时为抽象类。 sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理...
  • java面试题

    2018-01-01 15:35:15
    29. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 15 30. 构造器Constructor是否可被override 15 31. try {}里有一个return语句,那么紧跟在这个try...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    实例179 匿名内部类的使用规范 297 实例180 电话与移动电话 299 10.4 静态内部类 300 实例181 静态内部类的使用规范 300 实例182 苹果的来历 302 10.5 接口 303 实例183 求n的幂数与倍数 304 实例184 商品...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

匿名内部类可以是抽象类吗