2 sinat 25136209 sinat_25136209 于 2017.01.12 14:06 提问

java中的一个小问题

一般实例化是这样的 A类 aa=new A类();
那如果直接写后面的 new A类(); 这样的叫啥?
还是叫实例化么??
我现在遇到的问题是抽象类,它不是不能被实例化嘛,
但是有段代码这么写的。就是我问的问题这样的形式new A类(); 这样的叫啥?

public class NiMingNeiBuLei {
    static abstract class Person {//这个版本的jdk凡是要创建新类的统统都要加static
        public abstract void eat();
    }

    public static void main(String[] args) {
        //Person p = new Person() 
        new Person()  {
            public void eat() {
                System.out.println("eat something");
            }
        }.eat();
       // p.eat();
    }
    }

8个回答

xionglangs
xionglangs   Rxr 2017.01.12 15:14
已采纳

它是抽象类的匿名实现,抽象类和接口都是不能直接实例化的,因为抽象类可能有根接口一样的没有方法主体的只是进行了声明的方法,如果一个方法没有方法主体,那么调用它也就完全没有意义,所以一个类要被实体化,就必须要里面所有的方法都需要有方法主体,而如果你不想写一个类去实现这个抽象方法的化,你可以在实例化它的时候在后面打个大括号,里面写你要实例化的类没有方法主体的方法的具体方法,如果全部有方法主体,那可以为空,接口也可以这样实例化,但他只能是当前实例才可以正常时候,别的实例如果不这样做还是会报错,这是java的一种实例化接口和抽象类的方法。

sinat_25136209
sinat_25136209 每次你回答的都特别多,赞
一年多之前 回复
sinat_25136209
sinat_25136209   2017.01.12 14:09

我不明白的是既然person是抽象类,那为啥还能创建对象呢?

ligen52
ligen52   2017.01.12 14:13

匿名实现,匿名内部类 你查一下就可以了

ligen52
ligen52   2017.01.12 14:15

其实相当于
class PersonImp extends Person() {
public void eat() {
System.out.println("eat something");
}
}

new PersonImp().eat();

sinat_25136209
sinat_25136209   2017.01.12 14:36

我想知道这样写的格式叫啥?? new AA类().匿名实例?

u014374173
u014374173 匿名类
一年多之前 回复
jdjdndhj
jdjdndhj   2017.01.12 14:54

这是使用匿名内部类 实现 创建一个继承自Person 的匿名类对象;叫法很多种,你可以就叫使用匿名内部类实现化抽象类。

这种写法里面存在一个自动向上转型的动作。

而且这种写法一般是只要在这个地方使用一次该抽象类的实例,其他地方基本不需要用的时候使用。

u011547347
u011547347   2017.01.12 19:42

这里是匿名类(对抽象类Person进行了实现)的实例化

这个版本的jdk不能创建内部类(其实例与他的外部类实例相关联,即内置了外部类实例的引用)是什么鬼,加static 就是普通的类了,实例对象不相关

dengminghli
dengminghli   2017.01.12 20:21

你在匿名内部类这一块的理解还不够。匿名内部类是通过继承一个父类或者实现一个接口的方式实现的。因为语法问题它没有使用extends 或者implement的关键字,而是直接通过 父类构造方法(){
//重写需要重写的方法来实现的
}
而为什么会让你有疑问,可能是因为代码中的Person p =new Person(){
void(){

    };

};
这样的格式让你误认为是抽象类在实例化对象,但实际上,代码的意思是,使用一个匿名内部类去继承了抽象类并重写了抽象类中的方法,然后用new 关键字去实例化匿名内部类,再将匿名内部类对象向上转型回Person类。将代码从右往左去分析,你可能更容易理解这一点

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
数组的两个小问题
1.不可以对数组名(指针常量)进行赋值操作2.对数组进行整体赋值只能在最初声明的时候进行。
java中的数组的常见操作问题
数组操作常见操作     对数组操作最基本的动作就是存和取。     核心思想:就是对角标的操作。     示例:遍历并打印数组元素 class ArrayDemo{ public static void main(String[] args) { int[] arr = {89,34,270,17}; for
AMDD 一个把大问题分成小问题的优化算法
还没看懂,先记下地址“ 这个博客上有基础知识: http://www.cnblogs.com/breezedeus/p/3496819.html 下面是AMDD http://web.stanford.edu/~boyd/admm.html
一个有趣的小问题
有兄弟三人:大毛,二毛,三毛。有帽子五顶:三顶蓝色,两顶红色。将这五顶帽子随机发给三个 兄弟,三兄弟站成一列,后面的人能看见站在他前面的人,按大毛、二毛、三毛的顺序站好。 帽子分发好后,大毛问三毛:你知道你的帽子是什么颜色的吗? 三毛说:我不知道。
Java中的一个小问题
今天突然被同学问到一个小问题:Java中有两个方法,其中两个方法的名称、返回值、参数列表都相同,但有一个带有static,有一个不带,那这两个方法属于方法重载吗?遇到这个问题,我首先想到的是一个方法属于类,一个方法属于对象,而且方法重载主要看参数列表的类型或数量,所以第一印象是这两个方法不属于方法重载。但心里没底,回到实验室编写一下程序看一下,结果是不合法,无语中。。。 public cla
善于用Java File类解决生活中遇到的一些问题
        在用手机QQ音乐升级完音质后,会将原来的音乐名xxx.mp3,变成了xxx_(1).mp3。由于本人有强迫症,所以自己编写了个方法去转换,其中可以使用File.renameTo()方法将原来的文件改名,然后移动到新的文件夹中。public class ChangeFileName { public static void ChangeFileName(String old...
一道需要完备逻辑思考的小Java题目(对入小白)
在网易云课堂上的《Java应用基础:入门篇》中有这样一道题,多项式加法: 一个多项式可以表达为x的各次幂与系数乘积的和,比如:(下图中倒数第二项应该是6x,而不是6的x次幂) 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。 程序要处理的幂最大为100。 输入格式: 总共要输入两个多项式,
使用java解决数学中的问题
1.输入两个正整数m和n,求其最大公约数和最小公倍数。package com.test;public class asgasaf { /** * 输入两个正整数m和n,求其最大公约数和最小公倍数 * 在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数, * 取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,
java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0
Java循环的一个小问题,java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0
JAVA常见小问题
类型一:数组 1,error:ArryIndexOutOfBoundsException: 数组索引越界异常 原因:访问了不存在的索引; 2,error:NullPointerExcoption: 空指针异常 原因:数组不再只想堆内存却还在访问他;