什么是抽象类?
抽象类是不是有的方法是没有方法体的?
比如:
abstract void eat();
但是,今天去看了一下java的源码,发现WindowAdapter是抽象类,但是它的所有方法都是有空方法体的,这个也是抽象类吗?烦请高手解释一下。肯定是我的理解出现问题了
源码如下
public abstract class WindowAdapter
implements WindowListener, WindowStateListener, WindowFocusListener
{
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowStateChanged(WindowEvent e) {}
public void windowGainedFocus(WindowEvent e) {}
public void windowLostFocus(WindowEvent e) {}
}
[最优解释]
抽象类是可以有私有方法或私有变量的。。。。
public的 当然也可以有。。。。
这个最好 对比一下接口的概念。。
http://blog.csdn.net/duanml61/article/details/8133258
我写的应该还算易理解吧。。。
[其他解释]
大家一起努力加油
[其他解释]
没有抽象方法的类,也可以定义成抽象类. 其目的就是不允许(或不需要)生成这个类的实例(不能new 出对象)。
比如一个类只有静态方法和静态属性,(这些都部需要实例来访问,)定义成抽象的也可以。
public abstract class TestHelloWorld//定义成抽象类也能运行。
{
public static void main(String[] args)
{
System.out.println("Hello world");
}
}
[其他解释]
抽象类中的方法可以加abstract,也可以不加abstract,如果想要继承抽象类的话,必须要在子类中覆写抽象类中的全部抽象方法才行。
抽象类里面的方法只需声明,无需写方法体,方法体在子类中覆写时写入方法体就行了。
个人理解,如有错误,请纠正,谢谢。
[其他解释]
这个说得不错++
[其他解释]
++
[其他解释]
抽象类的特点:
1.抽象方法一定在抽象类中。
2.抽象方法和抽象类都必须被abstract关键字修饰。
3.抽象类不可以用new创建对象,因为调用抽象方法没意义。
4.抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后
建立子类对象调用,如果子类只覆盖了部分抽象方法,那么该子类还
是一个抽象类。
抽象类和一般类没有太大的不同。
该如何描述事物,就如何描述事物,只不过,该事物中,出现了一些看不懂
的东西,这些不确定的部分,也是该事物的功能,需要明确出来,但是无法
定义主体。通过抽象方法来表示。
抽象类比一般类多了抽象方法。就是在类中可以定义抽象方法。
抽象类不可以实例化。
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
[其他解释]
类定义时带abstract 关键字的就是抽象类
abstract类WindowAdapter的方法为什么会有方法体呢,是因为它 implements WindowListener, WindowStateListener, WindowFocusListener 等接口。那些方法中有一个到几个是这些接口中定义要被实现的方法。
抽象类不能不实例化(编译通不过),一般是使用它的子类。
package org.iteye.bbjava.csdn.problems;
public abstract class AbstactClass {
public static void main(String []args){
//new AbstactClass(); //Cannot instantiate the type AbstactClass
}
}
[其他解释]
抽象类里可以有非抽象方法,方法可以写方法体!
[其他解释]
只要带有abstract关键字的都是抽象类
抽象类的一个明显特征是不能被实例化,也就是不能new
[其他解释]
用abstract?修饰的类都是抽象类。
抽象类中可以有抽象方法,也可以有非抽象方法。
WindowAdapter这个抽象类实现了WindowListener, WindowStateListener, WindowFocusListener这些接口,以上的方法就是这几个接口的方法。
之所以这些方法写成空实现,是为了在用到WindowAdapter这个类时,可以自己选择实现其中的某个方法,避免了实现WindowListener, WindowStateListener, WindowFocusListener这些接口时,都要讲方法在子类中实现。
[其他解释]
抽象类可以基本上就是普通方法和接口类的结合体。你可以这么记着使用,当然不能这么理解。
[其他解释]
正解。
[其他解释]
抽象类其实用你看的源码来说最好,把所有的可能会出现的方法都抽象出来,我要使用他,那我就要去实现他的方法,同时抽象类中的方法不一定只是一个空方法,你也可以写具体的方法。
[其他解释]
接口中的方法必须都是抽象的。抽象类中的方法可以是抽象的,也可以是非抽象的。
抽象类实现接口后,可以不实现接口中的方法, 因为抽象类中也可以有抽象方法。
非抽象类实现接口后, 就必须实现接口中的方法。
[其他解释]
of course
[其他解释]
学习了,
[其他解释]
抽象方法能实现一部分
------其他解决方案--------------------
抽象类也可以有非abstarct的成员方法。
[其他解释]
楼主这样理解对.
因为这个windowadapter就是为了要省去实现某些listener不必要的方法。
[其他解释]
兄弟,你要知道,有抽象方法的类 肯定是 抽象类;
但是抽象类不一定有抽象方法,以前我学有的视频确实说的不是很清晰;
抽象类可以有抽象方法,可以有部分抽象方法,甚至没有抽象方法。
LZ上面的类就算是抽象类,
他的方法都是实现了(没有抽象方法)“因为都有{}实现了”,只不过是空的实现,即什么也没有做的实现。
[其他解释]
这个适配器类就是为了解决监听器接口必须实现每个方法,而适配器只要实现一个就可以了。
[其他解释]
用 abstract 修饰的类是抽象类。
在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。
在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,并且它只能用作基类。它与非抽象类的不同:
1、抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
2、允许(但不要求)抽象类包含抽象成员。
3、抽象类不能被密封。
[其他解释]
抽象类不能创建对象。
[其他解释]
一个类被关键字abstract修饰,并且这个类不能实例化,
[其他解释]
你说的那个我也懂,比如这个“抽象类里面的方法只需声明,无需写方法体”,这正是我想问的地方。因为我给的这个源码它的抽象方法是有方法体的
[其他解释]
“只要带有abstract关键字的都是抽象类”?就算里面的方法都有方法体?
[其他解释]
抽象类可以全部方法都是非抽象方法?看来是我以前理解错了,以为抽象类必须要有抽象方法。
现在有点晃过来了。其实实现接口就必须实现他们的方法,呵呵。
[其他解释]
觉得有点道理。看来以前是惯性思维的问题,觉得抽象类必须有抽象方法
[其他解释]
上机试了一下,其实这么想就对了。如果没有在adapter里面实现listener接口的方法,那么这上adapter实例化时还是要重写抽象方法,不管用不用。那么这个adapter就没意义了(本意是要免去重写一些不必要的方法)。
[其他解释]
楼上各位大神,不知我这么说对不对。因为这个windowadapter就是为了要省去实现某些listener不必要的方法。所以在这个抽象类里都实现了空方法体。如果在这个抽象类中没有实现,那么这个adapter在被调用的时候,某些人只重写了其中的部分方法,其他没重写的还是抽象方法,还是不能实例化,所以这个adapter也就没作用了。对不对?
[其他解释]
现在看过来我这一层回复,又理解错了。抽象类实现接口,不一定要全部实现接口的方法!
[其他解释]
你那个总结不错,才发现接口不能有私有的修饰符,不能定义变量。这个能给分
[其他解释]
被抽的类....
[其他解释]
这一问,发现自己基础还真不扎实
[其他解释]
被抽过的类
[其他解释]
该回复于2012-11-14 17:14:00被管理员删除
[其他解释]
我只是说无需写方法体,并没有不可以写,在抽象类中,是可以有抽象方法和非抽象方法的,如果类中有一个抽象方法,那么这个类必须要声明成抽象类。所以我没有错,你也没有错,呵呵。