关于面向对象里的子类继承问题

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------


/*面向对象的两大基本特征“继承”和“多态”使它区别于“基于对象”。

   实际上,“继承”是“多态”的基础,“多态”是“继承”的一种重要表现,两者密不可分。
   方法的名称和参数表只是方法的一个声明,打比方来说就相当于对象的一个引用,引用的内容便是放在由方括号括起的代码块;
在abstract类和接口(Interface)里,可以将方法的声明和实现分隔开。即使没有将方法的声明和实现分隔开,在编译的时候,编译器需要的也只是方法的声明,其具体实现只有在运行时才会被关心。因为在java中,所有方法绑定都为“运行时绑定”,除非一个方法被明确声明成final。

    子类通过定义一个和父类的某个方法拥有同样名称和参数表的方法来达到“覆盖”的目的。但是要记住的是,在子类内部能够访问到那个父类方法是覆盖该父类方法的一个必要前提!如果在子类内部看不到那个父类方法,即使定义了和父类的某个方法拥有同样名称和参数表的方法,实质上也没有达到“覆盖的真正目的”。

*/


覆盖和重载的区别:
public class Base{
    public void method(){
    }
}

public class Sub extends Base

{
    public void method(){ } 
//覆盖Base类的method方法
    public int method(int a){ }
//重载Sub类的method方法

}




/*

1.子类方法不能缩小父类方法的访问权限(可以扩大),而且子类不能抛出比父类方法更多的异常,其必须抛出和父类方法抛出的相同的异常,或者子类方法抛出的异常类是父类方法抛出的异常类的子类。
2..父类的静态方法不能被子类覆盖为非静态方法。同样,父类的非静态方法不能被子类覆盖为静态方法。
3..子类可以定义与父类的静态方法同名的静态方法,以便在父类中隐藏父类的静态方法。子类覆盖静态方法和覆盖一般方法的区别是,运行时,JVM把静态方法和所属类绑定,而将一般方法和所属实例绑定。
4..父类的私有方法不能被子类覆盖。虽然不会出现编译错误,但是实际上子类并没有从父类继承这个方法,所以,其并没有覆盖关系。
5..父类的抽象方法通过子类实现父类的抽象方法或者子类重新声明父类的抽象方法来实现覆盖。
6..父类的非抽象方法可以被覆盖为抽象方法。

*/



---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

阅读更多

关于子类继承父类的问题。。

12-26

有一个抽象MainServlet类,继承了HttpServlet。又写了一个普通类AdminServlet,继承了MainServlet。当请求指向AdminServlet时,又走了MainServlet中的post方法,很是不解啊。。。另外,在post方法中打印this,竟然是AdminServlet的hash值。为什么啊???rn这是代码,rnMainServlet :rnpublic abstract class MainServlet extends HttpServletrn @Overridern public void doGet(HttpServletRequest req, HttpServletResponse resp)rn throws ServletException, IOException rn doPost(req, resp);rn rn @Overridern public void doPost(HttpServletRequest req, HttpServletResponse resp)rn throws ServletException, IOException rn String methodName = req.getParameter("cmd");rn if(methodName==null || methodName.trim().equals(""))rn methodName="execute";rn rn try rn Method method = this.getClass().getMethod(methodName, rn HttpServletRequest.class,HttpServletResponse.class);rn method.invoke(this,req, resp);rn catch (Exception e) rn throw new RuntimeException(e.getMessage(),e);rn rn rn public abstract void execute(HttpServletRequest req,HttpServletResponse resp) rn throws Exception;rnrnrnAdminServlet :rnpublic class AdminServlet extends MainServlet rn private AdminService service = new AdminService();rn public void execute(HttpServletRequest req, HttpServletResponse resp)rn throws Exception rn String name = req.getParameter("name");rn String password = req.getParameter("password");rn Admin admin = null;rn if(admin==null)rn System.err.println("wrong");rn rn rn还请大神们解答啊

关于子类继承单例类的问题

07-29

有个问题,一个类继承自一个父类,该子类执行构造函数的时候,会执行父类的构造函数,如果父类的构造函数中使用了this这个指针,那么这个this指针是否与子类中的this指针是同一个指针呢。我在网上也搜了不少,很多答案都表示是相同地址的指针,但是我在最近撸的一个源码中发现了一个问题,特来请教一下。rn首先是一个单例的类rn[code=c]template rnclass Singletonrnrnprotected:rn static T* singleton_;rnrnpublic:rn Singleton(void)rn rn assert(!singleton_);rn#if defined(_MSC_VER) && _MSC_VER < 1200 rn int offset = (int)(T*)1 - (int)(Singleton *)(T*)1;rn singleton_ = (T*)((int)this + offset);rn#elsern singleton_ = static_cast< T* >(this);rn#endifrn rn rn rn ~Singleton(void) assert(singleton_); singleton_ = 0; rn rn static T& getSingleton(void) assert(singleton_); return (*singleton_); rn static T* getSingletonPtr(void) return singleton_; rn;rnrn#define KBE_SINGLETON_INIT( TYPE ) \rntemplate <> TYPE * Singleton< TYPE >::singleton_ = 0; \rn rn[/code]rn然后是一个子类,继承了这个单例模版类,rn[code=c]class Resmgr : public Singleton, public TimerHandlerrnrnpublic:rn // 引擎环境变量rn struct KBEEnvrn rn std::string root;rn std::string res_path;rn std::string bin_path;rn ;rnrn static uint64 respool_timeout;rn static uint32 respool_buffersize;rn static uint32 respool_checktick;rnrnpublic:rn Resmgr();rn ~Resmgr();rn rn bool initialize();rnrn void autoSetPaths();rn void updatePaths();rnrn const Resmgr::KBEEnv& getEnv() return kb_env_; rnrn /*rn 从资源路径中(环境变量中指定的)匹配到完整的资源地址rn */rn std::string matchRes(const std::string& res);rn std::string matchRes(const char* res);rn rn bool hasRes(const std::string& res);rn rn FILE* openRes(std::string res, const char* mode = "r");rnrn /*rn 列出目录下所有的资源文件rn */rn bool listPathRes(std::wstring path, const std::wstring& extendName, std::vector& results);rnrn /*rn 从资源路径中(环境变量中指定的)匹配到目录rn */rn std::string matchPath(const std::string& path);rn std::string matchPath(const char* path);rnrn const std::vector& respaths() rn return respaths_; rn rnrn void print(void);rnrn bool isInit() rn return isInit_; rn rnrn /**rn 获得引擎系统级资源目录rn kbe\\res\\*rn */rn std::string getPySysResPath();rnrn /**rn 获得用户级资源目录rn assets\\res\\*rn */rn std::string getPyUserResPath();rnrn /**rn 获得用户级脚本目录rn assets\\scripts\\*rn */rn std::string getPyUserScriptsPath();rnrn ResourceObjectPtr openResource(const char* res, const char* model, rn uint32 flags = RESOURCE_NORMAL);rnrn bool initializeWatcher();rnrn void update();rnrnprivate:rnrn virtual void handleTimeout(TimerHandle handle, void * arg);rnrn KBEEnv kb_env_;rn std::vector respaths_;rn bool isInit_;rnrn KBEUnordered_map< std::string, ResourceObjectPtr > respool_;rnrn KBEngine::thread::ThreadMutex mutex_;rn;[/code]rn然后我自己调试了一下,执行子类的构造函数,先执行父类的构造函数,我断点跟进去之后发现,父类的this指针与子类的this指针地址并不相同,并且在进行了强制类型转换之后指针地址发生了改变,变成了与子类this指针相同的值,如下图rn[img=http://img.bbs.csdn.net/upload/201607/29/1469721654_856942.png][/img]rn执行父类单例类的构造函数,this指针在强制转换之后赋值给singleton_,指针的值发生了变化rn[img=http://img.bbs.csdn.net/upload/201607/29/1469721740_93029.png][/img]rn在执行完父类构造函数,回到子类构造函数中,子类this指针的值与第一副图中父类this指针地址不同。rn请各位大神不吝赐教,谢谢rn

没有更多推荐了,返回首页