`

Tomcat源码"历险"之protected关键字理解

阅读更多

周末了有大块时间,我又忍不住地想鼓捣下Tomcat的源码,像往常一样又是从头看起:org.apache.catalina.startup.Bootstrap类.顾名思义,这个类是Tomcat启动时的main方法所在类.这个类本身没什么特别的,可看着看着,发现有点不对:怎么这个类里ClassLoader类型的三个属性是用protected来修饰的,而这个类本身又是不能再被extends的(也就是用final来修饰的)?

 

不对呀,这不自绝后路吗?用protected修饰的属性只能在本类或子类中访问,而这个类又给final掉了,protected在此不就多此一举了么?难道说protected修饰的成员可以让本package中的其它类访问?

 

是Tomcat作者写错了?还是自己对protected关键字的理解有问题?

 

这种情况下我是不怎么相信自己的,于是先用代码试了下.

 

1, 验证protected修饰的成员可以让本package中的其它类访问,我用如下的两个类:

package accessControl;

public class ProtectedAccess {
	protected int aNumber;
}

 ..........

package accessControl;

import accessControl.innerPackage.AnotherProtectedAccess;

public class LabClass {
	private ProtectedAccess pa= new ProtectedAccess();
	
	
	public void printProtectedAccess() {
		System.out.println("Result: "+pa.aNumber);		
	}
}

 .........

当在LabClass类里写了上面的pa.aNumber时,Eclipse没有报错.

 

2,验证protected修饰的成员不能被本package外的类访问,我用了如下个类:

 

package accessControl.innerPackage;

public class AnotherProtectedAccess {
 	protected int bNumber;
}

 ..........

 

package accessControl;

import accessControl.innerPackage.AnotherProtectedAccess;

public class LabClass {
	private ProtectedAccess pa= new ProtectedAccess();
	private AnotherProtectedAccess apa = new AnotherProtectedAccess();
	
	public void printProtectedAccess() {
		System.out.println("Result: "+pa.aNumber);
		// System.out.println("Result of apa: "+apa.bNumber); 
		// The field AnotherProtectedAccess.bNumber is not visible		
	}
}

 写下apa.bNumber后,Eclipse报错了:The field AnotherProtectedAccess.bNumber is not visible.

 

以上实验纠正了我的一个认识:protected修饰的成员可以被本package里的其它类访问的,而不是只能被子类和本类访问.

再看Thinking In Java,这本书里有如下的描述:


 1, The levels of access control from "most access" to "least access" are public,protected,package access(which has no keyword), and private.


 2,  protected also gives package access - that ism other classes in the same package may access protected elements.

 

这样也就进一步证实了实验结果.

 


上面的这个实验是验证了protected修饰的成员除了被子类访问外,还可以被本package里的类访问.不错.但这里的Bootstrap类是final了,这样就没有子类而只剩下同package里其它的类访问了.可不写岂不更好?难道说是Tomcat项目组的疏忽?还是另有别的我现在还没接触到的东东?

 

4
1
分享到:
评论
8 楼 leeo 2009-03-06  
protected一般是为了继承复用而设计的,
在系统中设计一个基类,所有相关功能的子类都要继承这个基类;

private一般是为了实现本类功能而设计的;

public则是一个类对外的接口,是最终实现类的“门户”。

什么都不写?不推荐吧?难道是为了教学?
String method1(){
//code
}
7 楼 leeo 2009-03-06  
访问控制符
权限

public
所有类都可以访问

(包括本类、本类的子类、和本类处在同一包下的类、和本类处在不同包下的类)

protected
本类、本类的子类、和本类处在同一包下的类

什么都不写
本类、和本类处在同一包下的类

private
只有本类可以访问


可以将java的包结构理解为一个家族,同一包下就是同一个家族,每个类是一户人家,继承则是直系血亲;
6 楼 hatedance 2008-07-03  
这个基础知识咱们似乎很少用。
5 楼 Aga 2008-07-02  
我现在也在看tc6。不过很多文档都是针对4.1.x的,所以我还是希望能够找到部署tc4的方式。
4 楼 rmn190 2008-07-01  
To Aga:
   现在我用Eclipse跑的是Tomcate 6.0.16版本的,以前试过Tomcat5.X,但效果不好,后来改成6.0.16后感觉不错,就像对自己写的程序那样地Debug.
3 楼 Aga 2008-07-01  
请问,你看得tc源代码是怎么看得?
总之我想问下老兄:你能把tc4.1.x导入eclipse跑下么?
2 楼 rmn190 2008-07-01  
Thanks a lot to zhoden!
1 楼 zhoden 2008-07-01  
老兄.对技术挺执着的.但基本功又待加强,我也一样,互相学习

相关推荐

    tomcat源码+文档pdf+源码解析

    这个资源包包含了Tomcat的源码、文档以及源码解析,对于深入理解Tomcat的工作原理、优化应用性能以及进行二次开发具有极大的帮助。 首先,让我们深入探讨Tomcat的源码。源码是软件的基石,通过阅读源码,我们可以...

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    在深入研究Tomcat源码时,理解其模块结构和主要组件是非常重要的。Tomcat的主要组件包括Catalina(核心Servlet容器)、 Coyote(处理HTTP连接)、Jasper(JSP引擎)等。你可以通过阅读源码和官方文档来了解这些组件...

    tomcat源码

    理解Tomcat源码不仅有助于提升个人技能,还能够帮助开发者解决实际问题,比如调试应用异常、优化性能、自定义功能等。因此,花时间研究`apache-tomcat-8.5.35-src`是一个对Java Web开发者非常有价值的学习过程。

    tomcat 源码分析系列文档

    4. "Tomcat源码分析(4)容器处理链接之责任链模式.doc":分析了Tomcat如何利用责任链模式来处理请求,使得请求可以被多个处理器(如过滤器)有序处理。 5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体...

    tomcat源码学习之环境搭建

    在深入探讨Tomcat源码学习之前,我们首先要理解Tomcat是什么。Tomcat是一款开源的、免费的Web服务器和Servlet容器,由Apache软件基金会维护。它实现了Java Servlet和JavaServer Pages(JSP)规范,是Java EE应用...

    tomcat源码导入myeclipse

    7. **理解文档**:阅读提供的导入说明,理解如何配置和使用Tomcat源码,以及可能遇到的问题和解决方案。 8. **编译和运行**:在MyEclipse中编译源码,并可以尝试运行Tomcat服务器,验证导入是否成功。 通过这个过程...

    编译tomcat源码所需jar包

    在IT行业中,Tomcat是一款广泛使用的开源Web服务器和...对于开发者来说,理解这些jar包的作用以及如何正确配置和使用它们,对于成功编译Tomcat源码至关重要。同时,这也是一种提升对Tomcat内部工作原理理解的好方法。

    「Tomcat源码剖析」.pdf

    Tomcat源码剖析 : 整体架构 层层分析 源码解析 架构分析 (Http服务器功能:Socket通信(TCP/IP)、解析Http报文 Servlet容器功能:有很多Servlet(自带系统级Servlet+自定义Servlet),Servlet处理具体的业务逻辑...

    Tomcat源码开发环境搭建

    手把手教你搭建Tomcat7源码开发环境,如果有了如下说明还搭建不成功,建议考虑下自己的理解能力,能不能走编码这条路。附近包括Tomcat源码、Tomcat源码开发环境依赖的包、Tomcat的环境编译工具ant 1、建立如下...

    tomcat源码依赖包

    《深入理解Tomcat源码:必备依赖包解析》 Tomcat作为一款广泛应用的开源Java Servlet容器,其源码的编译与理解对于开发者来说具有重要的价值。为了能够顺利地编译Tomcat源码,了解并掌握相关的依赖包是至关重要的。...

    eclipse运行tomcat源码:修改源码:重新编译:重新打包

    1.tomcat源码文件 2.tomcat程序文件 3.Ant程序文件 4.tomcat源码在eclipse运行,重新编译,重新打包步骤文件 5.一个tomcat源码在eclipse上运行的java工程 作用: 1.用于学习tomcat源码和了解tomcat运行机制 2.学习...

    tomcat7源码

    源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的学习能够帮助我们更深入地理解Web应用的部署、运行以及性能优化。 首先,我们要了解Tomcat的架构。Tomcat7基于...

    IDEA版tomcat源码搭建.docx

    IDEA 版 Tomcat 源码搭建 Tomcat 是一个开源的 Web 服务器软件,由 Apache 软件基金会开发和维护。它支持众多的 Java 库和框架,能够提供高性能和高可扩展性的 Web 应用程序。IDEA 是一款功能强大的集成开发环境...

    tomcat源码编译所需jar包

    Tomcat作为一款广泛应用的开源Web服务器和Servlet容器,其源码的编译与理解对于开发者来说是提升技术水平的重要途径。源码编译过程中,jar包的正确配置至关重要。本文将详细探讨在编译Tomcat源码时,需要用到的关键...

    Tomcat源码研究.pdf

    根据所提供的文件信息,我们将从以下几个方面详细探讨Tomcat源码的相关知识点: 1. Catalina脚本解析:Catalina是Tomcat的主引擎,负责整个容器的初始化和处理。在Tomcat源码中,Catalina的脚本解析是了解其启动...

    Tomcat源码学习:一个最简单的“Tomcat”

    【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...

    tomcat8源码

    深入理解Tomcat的源码有助于我们更好地掌握其工作原理,从而优化应用性能,解决潜在问题。 1. **Tomcat架构概述** Tomcat的核心架构主要分为几个部分:Catalina(核心处理引擎)、Jasper(JSP编译器)、 Coyote...

    tomcat源码及相关依赖包

    《深入理解Tomcat源码与依赖包》 Tomcat,作为Apache软件基金会的顶级项目,是广泛应用的开源Java Servlet容器,它实现了Java EE中的Servlet和JavaServer Pages(JSP)规范。本文将深入探讨Tomcat的源码以及相关...

Global site tag (gtag.js) - Google Analytics