A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-9 22:33  /  2395 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 全海波 于 2012-8-4 09:48 编辑

abstract为什么不能与static,final,private同时使用?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

6 个回复

正序浏览

抽象类abstract:
1-抽象方法一定在抽象类中。
2-抽象方法和抽象类都必须被abstract关键字修饰。
3-抽象类不可以用new创建对象,因为调用抽象方法没意义。
4-抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法 那么该子类还是一个抽象类即不能被使用。

static
用法:是一个修饰符,用于修饰成员(包括成员变量,成员函数)。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用:类名.静态成员。特点:随着类的加载而加载(也就是说:静态会随着类的消失而消失,说明它的生命周期最长);优先于对象存在;被所有对象所共享;可以直接被类名所调用。

final:修饰符,
1-可以修饰类、函数、变量。
2-被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
3-被final修饰的方法不可以被复写。
4-被fianl修饰的变量时一个常量只能赋值一次,既可以修饰成员变量 又可以修饰局部变量。当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。而这个值不需要改变 所以加上final修饰。作为常量:常量的书写规范是所有字母都大写,如果由多个单词组成,单词间通过_连接。
5-内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。

希望对楼主有用
回复 使用道具 举报
我通过反例的方式来让楼主明白:
首先明确一点,用abstract修饰的函数必须由子类对其进行复写才可以使用。
1.fanel:
用fanel修饰的函数无法被复写,而用abstract修饰的成员函数恰恰必须被子类进行复写后才可以调用。
2.static:
用static修饰的成员函数可以直接被类名调用,而抽象类中成员函数没有主体功能代码,不可以通过类名调用而被使用,所以两个关键字所起的作用相互矛盾。
3.private:
被private修饰的父类中的成员函数对于子类是透明的,子类根本无法知道父类拥有这些方法,所以子类根本无法对这些父类中的方法进行复写,也就不存在对父类中的抽象方法进行复写后使用。

我觉得以上的例子通俗易懂,希望可以让楼主加深理解:)

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 曹恒业 于 2012-7-10 00:14 编辑

首先,楼主要先明确这4个关键字的用法和意义。
abstract:表明方法是抽象方法,必须要子类复写实现。如果要搭配下面3个关键字,会有问题。
1.private :私有方法,只能被同类中的方法调用。所以要继承复写它的子类根本访问不到,就无法复写。
2.static:修饰类方法,它是不允许子类覆写(override),换言之,static是静态,就是在编译时已经确定的东西,当然不能是抽象(动态)的,那是运行时才能确定的东西,而abstract必须要子类复写实现。
3.final:用在方法上,Java规定final方法不能被复写,而abstract必须要子类复写实现。


回复 使用道具 举报
java中有很多语法都很符合常理,我们只要仔细思考思考就能明白其中的道理,不需要死记硬背
abstract为什么不能和static,final,private一起用?
想想其中的道理就能明白,首先必须明白,abstract方法因为具体的执行过程不明确,没有方法体,需要被子类重写才有意义
先看static:被stati修饰的方法可以直接使用类名调用,这样的目的在于方便被外界调用,如果这个方法是个抽象方法,他连方法体都没有,外界调用它有什么用呢?
再看final:抽象方法需要被子类重写才有意义,若定义成final了,子类还怎么重写?
最后是private:这个就更好理解了,private修饰的方法,外部是访问不到的,访问不到,怎么重写?
这样思考一下就不难明白这些语法规则了

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1,首先final:
     被final修饰的方法不可以被复写。
2,其次static:
     静态虽好,但只能访问静态静态的特点是:
   1.随着类的加载而加载(也就是说,静态会随着类的消失而消失,说明它的生命周期最长)。
   2.优先于对象存在。(明确一点,静态是先存在的,对象是后存在的)
   3.被所有对象所共享。
3.private:
    被private修饰的在同一个类中可以ok,同一个包中不可以,子类也是不可以的 不同的包也是不可以的。
4,abstract:
    抽象类中的抽象方法要被使用。必须有子类复写起所有的抽象方法后,建立子类调用。
  如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。抽象类不可以实例化。
  在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确定的部分在使用不
  确定的部分,那么这是就将不确定的不部分暴露出去。由该类的子类完成。
从以上四个就可以得出 absteact不能于static,final,private同时使用。
希望楼主采纳嘿嘿:)
   
   
回复 使用道具 举报
如果一个方法前有private或static修饰时系统会自动在前面加上final,即
private和static方法是默认均为final方法,不可被覆盖、继承(可以认为private、static 和final成对出现)
而abstract修饰类时必须被继承,与以上方法正相反,故不能同时出现
private void print(){};次句表示方法的空实现
Abstract void print(); 此句表示方法的抽象,无实现;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马