asbtract Person {
public abstractvoid eat ();
}
public class Demo {
public static void main(String[] args){
Person p = new Person (){
public void eat (){
system.out .println(“hello”)
}
}
}
}
public abstractvoid eat ();
}
public class Demo {
public static void main(String[] args){
Person p = new Person (){
public void eat (){
system.out .println(“hello”)
}
}
}
}
public void eat (){
system.out .println(“hello”)
}
实际上生成了一个继承Person,并实现了eat方法的匿名类的实例
匿名类,就是这个类没有显式的名字,但是继承父类并实现了所有的抽象方法,或者实现了接口方法
仔细理解我下面这段话:
1. new 关键字可以理解为在堆内存分配一块存储区域,这块区域长什么样由new关键字后面的东西决定,
2. 然后这块区域的入口地址赋给连着等号左边的的变量,以后拿这个变量就可以对这块区域进行操作,
3. 但是能做什么操作,取决于这个变量左边的类型。
如果还有问题可以来我空间提问(www.java123.vip)
你确定楼主的代码可以编译?不能编译说什么都是白搭,反正我是怎么改都不能通过编译的。楼主这笔误真够多的package test.gt50;abstract class Person {
public abstract void eat();
}public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("hello");
}
};
}
}
改成下面就可以了,用接口或抽象类new一个匿名类语法上没什么好说的,自己查查资料。abstract class Person {
public abstract void eat ();
}public class Demo {
public static void main(String[] args){
Person p = new Person (){
public void eat (){
System.out.println("hello");
}
};
p.eat();
}
}
new抽象类和new接口类似,实际上编译器是产生一个匿名类定义,实例化的时匿名类。
可以说是通过匿名类实现间接的实例化。
所以把抽象类和类的概念放一起是不对的,它实例化的方式更类似于接口。
接口和抽象类是不能实例化的,楼主的做法会在编译后产生匿名类class文件。
如果说抽象类和普通类一样是可以实例化的,何必要产生这样一个匿名类呢。
另外一个朋友可以去反编译看看这个匿名类,看是不是继承于这个抽象类就知道了。
而 Person p = new Person(){ public void eat (){ } }; 这样实例化的是一个继承自Person的匿名类(实现了方法eat),而不是实例化Person
public void eat (){
system.out .println(“hello”)
}
实际上生成了一个继承Person,并实现了eat方法的匿名类的实例
匿名类,就是这个类没有显式的名字,但是继承父类并实现了所有的抽象方法,或者实现了接口方法
2. 然后这块区域的入口地址赋给连着等号左边的的变量,以后拿这个变量就可以对这块区域进行操作,
3. 但是能做什么操作,取决于这个变量左边的类型。
你确定楼主的代码可以编译?不能编译说什么都是白搭,反正我是怎么改都不能通过编译的。楼主代码确实不能编译通过,基础性错误一大把:
1、abstract 写成 asbtract
2、定义抽象类没有写 class 关键字
3、Person 类里的 abstract void 两个关键字中间没有空格
4、用全角双引号
5、System 写成 system,Java 是大小写敏感的语言
6、System.out.println 语句后面没有加分号结束
7、new 了之后没有分号结束不过,楼主的问题是,为什么抽象类可以被实例化
你确定楼主的代码可以编译?不能编译说什么都是白搭,反正我是怎么改都不能通过编译的。楼主代码确实不能编译通过,基础性错误一大把:
1、abstract 写成 asbtract
2、定义抽象类没有写 class 关键字
3、Person 类里的 abstract void 两个关键字中间没有空格
4、用全角双引号
5、System 写成 system,Java 是大小写敏感的语言
6、System.out.println 语句后面没有加分号结束
7、new 了之后没有分号结束不过,楼主的问题是,为什么抽象类可以被实例化我本来想说的是语句本来都有问题,楼主是怎么得出 抽象类可以实体化的结果的。
猫是个类。
class Cat(){
public void eat(){syso("猫吃鱼")};
}
狗是个类。
class Dog(){
public void eat(){syso("狗吃肉")};
}然后我们把猫和狗的eat的共性抽取出来,成一个类Animal,用abstract修饰.
public abstract class Animal{
public void eat();
}
而使用的话,就是
class Cat() extends Animal{
public void eat(){syso("猫吃鱼")};
}
还要重写抽象类中的方法。在我们声明一个猫实例的时候,
可以这样,Cat cat=new Cat();
也可以这样 , Animal animal=new Cat();父类引用指向子类的对象。
但是你要这样 Animal animal =new Animal(); 那么这句话的意思就是:通过动物这个模板产生一个动物的实例,那么,这个动物的实例具体指的是啥?我们说的实例一般都是具体的,比如说,猫,狗,兔子,pig,而动物这个词是从这些类抽象而来,你说,猫是动物,狗是动物,这是可以的。但是要说,动物是动物,这是不符的。这是个 "is a "的哲学问题。抽象类本来就是用来定义一些规则的。抽象类中有抽象方法,你要用它,就要继承它,进而必须实现它内部的抽象方法。 哈哈。纯手打。个人理解。
public abstract void eat();
}package test;public class Demo {
public static void main(String[] args) {
Person p = new Person(){
public void eat() {
System.out.print("hello");
}
};
p.eat();
}
}
下面是我测试的代码,楼主有一些语法错误也改回来了哈哈哈。
Person类:测试主类:
改成下面就可以了,用接口或抽象类new一个匿名类语法上没什么好说的,自己查查资料。abstract class Person {
public abstract void eat ();
}public class Demo {
public static void main(String[] args){
Person p = new Person (){
public void eat (){
System.out.println("hello");
}
};
p.eat();
}
}
正解,匿名内部类语法问题