整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

作为一名程序猿,你不可不知的Java基础知识的三十个

作为一名程序猿,你不可不知的Java基础知识的三十个经典问答


. 面向对象的特点

抽象

抽象是或略一个主题中与当前目标的无关的因素,一边充分考虑有关的内容。抽象并不能解决目标中所有的问题,只能选择其中的一部分,忽略其他的部分。抽象包含两个方面:一是过程抽象;一是数据抽象。

继承

继承是一种联接类的层次模型,允许和鼓励类的重用,提供了一种明确的共性的方法。对象的一个新类可以从现有的类中派生,这叫做类的继承。心累继承了原始类的特性,新类称为原始类的派生类或者是子类,原始类称为新类的基类或者父类。子类可以从父类那里继承父类的方法和实现变量,并却允许新类增加和修改新的方法使之满足需求。

封装

封装就是把过程和数据包围起来。对数据的访问只是允许通过已经定义好的界面。面向对象就是基于这个概念,即现实世界可以描述为一系列完全自治,封装的对象,这些对象通过固定受保护的接口访问其他对象。

多态

多态性是指不同类的对象对同一个请求作出相应。多态性包括参数多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享的优势。很好的解决了应用程序中同名的问题。

2. int 和 Integer 有什么区别

java提供了两种类型:引用类型和原始类型(内置类型)。int是java的原始数据类型,Integer是java为int提供的封装类。

java为每一种数据类型提供了自己的封装类:

引用类型和原始类型的行为完全不同,并且他们具有不同的语义,引用类型和原始类型具有不同的特征和用法,他们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型有用作某个类的实例数据时制定的缺省值。对象应用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。

3. final、finally、finalize的区别

  • final是一种声明属性,作用与类、方法和变量;final修饰的变量的值不能够再改变,final修饰的方面不能被覆盖,final修饰的类不能被继承。
  • finally是异常处理语句的一部分,表示总是执行。
  • finalize是object类的一个子方法,在垃圾回收器执行是调用回收对象的此方法,此方法可以被覆盖提供资源回收时的其他资源回收。如文件关闭等。

4. heap和stack的区别

栈是一种现行结构,其添加和删除元素应在同一段完成,栈按照先进后出的方式进行处理。

堆是栈的一个组成元素。

5. 基本的数据类型

byte,int,long,double,char,boolean,float,short

String不是基本数据类型,java.util.String是final类,因此不能修改这个类,不能继承这个类。

为了节省空间,提高效率我们应该用StringBuffer。

6. assert什么时候使用?

assertion(断言)在软件开发中使用中常见的调试方式,很多编程语言中都支持这种机制,在实现中,assertion就是在程序中的一条语句,他对一个boolean表达式进行检查,一个正确的程序必须保证这个boolean表达式的值是true。如果该值为false,说迷宫程序已经处于不正确的状态了,系统将给出警告或者退出。一般来说assertion用来保证程序最基本、关键的正确性,assertion检查通常在开发和测试时启动,为了提高效率,在软件发布后,assertion检查通常是关闭的。

7. GC是什么?为什么要有GC?

GC是垃圾回收的意思(gabage collection),内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收导致程序或者系统的不稳定甚至崩溃,java的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的俄显示操作方法。

8. 启动线程使用run()还是start()?

启动一个线程用start()方法,使线程所代表的虚拟处理机处于可运行的状态,这意味着它可以有JVM(java虚拟机)来调度和执行,这并不意味着线程就会立即执行。run()方法可以产生必须退出的标志来停止一个线程。

9. 构造器Constructor是否可以被override?

构造器(override)不能被继承,因此不能重写overriding,但是可以被重载overloading。

10. 当一个对象作为参数传递给一个方法后,此方法可以给便这个对象的属性,并可以返回变化后的结果,那么这里到底是值的传递还是引用传递?

是值得传递。java语言中只有值传递参数,对一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用,对象的内容可以在被调用的方法中改变,但对象的引用是永远改变不了的。

11. 垃圾回收机制的优点,并考虑2种回收机制。

java语言中一个显著的特点就是引入了垃圾回收机制,使C++程序员最头痛的内存管理问题迎刃而解,他使得java程序员在编写承学的哦时候不用再考虑内润管理问题了,由于有了垃圾回收机制,java中的对象不再有“作用域”的概念,只是在对象引用的时候才有“作用域”,垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。

垃圾回收器通常作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚的哦回收,承诺过许愿程序员不能实时的调用来几回收器对某个对象或所有对象进行垃圾回收,回收机制有分带复制来几回收和标记垃圾回收,增量垃圾回收。

12. char型变量中能不能存储一个中文汉字?为什么?

能够存储一个汉字。

因为java中以unicode编码,一个char占16个字节,多亿放一个中文是没有问题的。

13. jsp中的内置对象

  • request——表示HttpServletRequest对象,它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,header和session数据的游泳的方法。
  • response——表示HttpServletResponse对象,提供了几个用于设置送回浏览器响应的方法(如cookie头信息等)。
  • out——对象是java.jsp.JspWriter的一个实例,提供了几种方法使你能用于想浏览器返回输出结果。
  • pageContext——表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关的功能的方法。
  • session——表示一个请求的javax.servlet.http.HttpSession对象,session可以村相互用户的状态信息。
  • application——表示一个javax.servlet.ServletContext对象,这有助于查找有关servlet引擎和servlet环境的信息。
  • config——表示一个javax.servlet.ServletConfig对象,该对象用于存取servlet实例的初始化数据。
  • page——表示从该页面产生的一个servlet实例。

14. jsp和servlet有奶俄相同点和不同点?他们之间的联系是什么?

jsp是servlet技术的扩展,本质上是servlet的简易方式,强调应用的表现和表达,jsp编译后是“类servlet”,servlet和jsp最主要的不同点在于,servlet的应用逻辑是在java文件中,并且完全从表示层中的html里分离出来,而jsp的情况但是java和html可以组合成一个扩展名为.jsp的文件,jsp侧重于视图,servlet主要用于控制逻辑。

15. 匿名内部类(Anonymous Inner Class)是否可继承其他类,是否可以实现接口?

可以继承其他类或完成其他接口,在swing编程中常用此方式。

16. HashMap和HashTable的区别

HashMap是HashTable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空键值(key),郁郁非线程安全,效率上可能高于HashTable。

17. String s=new String("abc");创建了几个对象?

创建了两个 一个是“abc” 一个是指向“abc”对象的 S 对象。

18. Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

Math.round(11.5)==12,Math.round(-11.5)==-11,

return方法返回与参数最接近的长整数,参数加1/2后求其floor。

19. sleep()和wait()的区别?

sleep是线程类(thread)的方法。导致此线程暂停执行之地昂时间,给执行的机会给其他线程,但是监控状态依然保持,到时候后自动回复,调用sleep不会释放对象锁。

wait是object类的方法,对此对象发出wait方法导致本线程放弃对象锁,进入等待此对象的的呢古代锁定池,只有针对此对象发出notify方法(或者notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

20. 数组有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法,有length方法。

String有length()方法。

21. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写OVerriding和重载Overloading是Java多态的不同表现,

重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现,

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Voerriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被屏蔽了,如果在一个类中定义了多个同名的方法,他们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overriding),Overriding的方法是可以改变返回值的类型。

22. Set里的元素是不是能够重复的,那么用什么方法来区分重复与否呢?使用==还是用equals()?他们有什么区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()方法是判断两个Set是否相等。

equals()和==方法决定引用值是否指向同一个对象,equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

23. error和exception 的区别

  • error表示恢复不是不可能但是很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理之中情况。
  • exception表示一种设计或实现问题。也就是说,他表示如果程序运行正常,从不会发生的情况。

24. abstract class和interface有什么区别?(抽象类与接口的区别)

声明方法的存在不去实现他的类被叫做抽象类(abstrct class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在类终中实现该类的情况,不能创建abstract类的实例。然而可以创建一个变量,其类型就是一个抽象类,并让他指向具体的子类的一个实例。不能有抽象构造函数或抽象静态方法,abstract类的子类为他们的父类中的所有抽象方法提供实现,否则他们也是抽象类为,取而代之,在子类中是实现该方法。知道其行为的其他类可以在类中实现这些方法。

接口(interface)是抽象类的变体,在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体,接口只可以定义static final成员变量,接口的实现与子类相似,除了个实现类不能从从接口定义中继承行为,当类实现特殊的接口时,他定义(即将程序给予)多有这种接口的犯法,然后,它可以在实现了该接口的类的任何对象上调用接口的方法,由于抽象类,它允许使用接口名作为应用变量的类型。通常的动态联编将生效,引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是实现了接口。

25. abstract的method是否可同时是static,是否可以是同时是native,是否同时是synchronized?

都不可以

26. jsp页面中的跳转方式分别是什么?有什么区别?

有两种,分别是

< JSP:INCLUDE page="jjj.jsp" fresh="true">

< JSP:FORWARD page="nextpage.jsp">

区别:

前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面,执行完后就会回来,相当于函数调用,并且可以带有参数,后指完全转向新的页面,不会再回来。相当于个goto语句。

27. java servlet API中的forward()和redirect()的区别?

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向的地址,后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接,这样,从浏览器的地址栏中就可以看到跳转以后的链接地址,多亿,牵制更为高效。在前者可以满足需要的同时,尽量使用forward()方法,并且这样有助于隐藏实际的链接,在有些情况下,比如需要跳转到其他浏览器的资源,则必须用sendRedeirct()方法。

28. xml有哪些解析技术?区别是什么?

有DOM,SAX,STAX等

  • DOM:处理大型文件是其性能下降的非常厉害,这个问题是由DOM的树结构造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对xml的随机访问,sax:不现于,DOM,SAX是事件驱动型的xml解析方式,他顺序的读取xml文件,不需要自已全部装载正文件,当遇到文档开头,文档结束,或者标签开都与标签结束时,他会触发一个事件,用于通过在其回调事件中写入处理代码来处理xml文件,适合对xml的顺序访问。
  • Stax:Streaming API for xml(Stax)。

29. jsp中有哪些内置对象?他们的作用是什么?

jsp中共9中内置组件:

  • request:用户端请求,此请求会包含来自GET/Post请求的参数;
  • response:网页传回用户端的回应。
  • pageContext:页面的属性是在这里管理
  • session:与请求有关的回话期
  • application :Servlet正在执行的内容
  • out :用来传递回应的输出
  • config :servlet的构架部件
  • page jsp网页本身
  • exception :针对错误的网页。未捕捉的例外。

30. 编程用java解析xml的方式

用sax方式解析xml,xml如下:

< ? xml version=1.0 encoding=gb2312? >
小黑
信息学院
6210798
男,1965,博士,94年调入清华大学

事件回调类SAXHandler.java

import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase
{
    private Hashtable table=new Hashtable();
    private String currentElement=null;
    private String currentValue=null;
    public void setTable(Hashtable table)
        {
        this.table=table;
    }
    public Hashtable getTable()
        {
        return table;
    }
    public void startElement(String tag, AttributeList attrs)
        throws SAXException
        {
        currentElement=tag;
    }
    public void characters(char[] ch, int start, int length)
        throws SAXException
        {
        currentValue=new String(ch, start, length);
    }
    public void endElement(String name) throws SAXException
        {
        if (currentElement.equals(name))
                table.put(currentElement, currentValue);
    }
}

JSP内容显示源码,SaxXml.jsp:

< %@page errorPage=ErrPage.jsp contentType=text/html;
charset=GB2312 %> >
< %@page import=java.io.*%>
< %@page import=java.util.Hashtable %>
< %@page import=org.w3c.dom.*% >
< %@page import=org.xml.sax.* %>
< %@page import=javax.xml.parsers.SAXParserFactory %>
< %@page import=javax.xml.parsers.SAXParser %>
< %@page import=SAXHandler %>
< %@
File file=new File(c:people.xml);
FileReader reader=new FileReader(file);
Parser parser;
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser sp=spf.newSAXParser();
SAXHandler handler=new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable=handler.getTable();
out.println( );
out.println(
+ );
out.println(
+ );
out.println(
+ );
out.println(
+ );
out.println(
教师信息表 姓名    +
(String)hashTable.get(new String(name)) +
学院  +
(String)hashTable.get(new String(college))+
电话  +
(String)hashTable.get(new String(telephone)) +
备注  +
(String)hashTable.get(new String(notes)) +
);
>

31. EJB与JavaBean的区别

JavaBean是可重复用的组件,对JavaBean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean,但是通常情况下,由于JavaBean是被容器所建(如tomcat等)的。所以JavaBean应具有一个参数的构造器,另外通常JavaBean还要实现serializable接口用于实现Bean的持久性,JavaBean实际上相当于微软Com模型中的本地进程中com组件,踏实不能被夸进程访问的,enterorise JavaBean相当于DCOM,即分布式组件,踏实基于java的与阿成方法的调用(RMI)技术的,所以EJB可以被远程访问(跨进成,跨计算机)但是EJB必须被部署在诸如websoere、weblogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问,EJB容器是EJB组建的代理,EJB组件由容器创建和管理。客户通过容器访问真正的EJB组件。

Java程序员福利:金三银四,我把最近一年经历过的Java岗位面试,和一些刷过的面试题都做成了PDF,PDF都是可以免费分享给大家的,关注私信我:【101】,免费领取!

ython有三种方法解析XML,SAX,DOM,以及ElementTree。 ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少,下面看一段ElementTree解析xml代码:

接口返回xml如下:

ElementTree知识要点

插入节点 :

Element.insert(index, element)

Element(tag[, attrib][, **extra])

SubElement(parent, tag[, attrib[, **extra]])

Element.append(subelement)

删除一个节点:Element.remove(subelement)

删除该节点下所有子节点:Element.clear()

节点中插入属性 :Element.set(key, value)

查找节点Element.getiterator 、Element.getchildren 、 Element.find、Element.findall

督教文化继承了希腊人的信念,认为人由物质的肉体和精神的灵魂两部分组成,灵魂永恒及肉体再生是其来世观的主要原则。古埃及人则认为人是由几个元素组成的,失去任何一部分都意味着失去整体。这些要素中,某些部分是活着的时候就存在的,而有些则是在死后才显现出其重要性。

18王朝的书吏阿蒙涅姆赫特的墓室祠堂中的铭文非常具象地表达了古埃及人对人的本质的认识。根据墙上的文字说明,祠堂南墙上的供品都是死者生前必需的物品。旁边的铭文是:“为他的‘卡’,为他墓地的墓中所立之碑,为他的命运(SA),为他的生命时光(aHa),为他的Meskhenet,为他的Renenet,为他的赫努姆。愿神让他控制它们(供品),富有它们,战胜它们......”这些概念中,Meskhenet、Renenet、赫努姆是与他的出生和抚养有关的,另外两个是与他的生命和性格相关的(SA、aHa),是仪式的焦点。北墙上的铭文指的是死者死后最重要的方面:“为他的‘卡’,为他的碑,为他的‘巴’,为他的阿赫(Ax),为他的尸体(XAt),为他的影子swt,为他所有的显现xprw。愿这些神使得他富有这些(供品),使他加入他们,可以像他的先辈一样永远吃喝享用它们。”这些概念都以具体的形象出现在死者形象的上方,代表死者死后的存在形式:“卡”、“巴”、XAt、swt、xprw。关于人的物质的身体有几个表述的概念:当人活着时,它是Xt,指人体作为物质的存在,但它也可以被描述为irw——“形式,外在”,强调身体作为一个人的物质形式以及发挥作用的形体的一面;在人死后,常用的词是XAt——尸体,或者sax——木乃伊;影子swt也是活着的人的本质的组成部分,但是它更经常与死者联系在一起。它与木乃伊有密切关系,是死者在人间的影子,但它的颜色是黑的。

图坦卡蒙雕像的“巴”

在墓葬文献中还有两个重要的概念,一个是rn(名字),一个是ib或HAty(心)。前文提过,埃及人认为名字不仅是事物的音符,也是其本质的一部分,因此,一个人的名字被毁或者被遗忘就意味着此人整个被毁掉。心既是人的智力的基础也是人的道德的基础,人要作为富有道德和思想的存在就必须保证心的存活。心代表所有形式的能量,是意志之源。像“卡”一样,它是独立的存在,因此心与“卡”的关系是很接近的。心是理性、情感、意识、记忆等的源泉,也是自由意志的源泉,这种自由意志甚至可能反对神和神造的宇宙秩序。为此,在末日审判庭的天平上,一端是死者的心,另一端是象征正义的玛阿特。有时我们看到天平的一端是一个人而不是一颗心,说明在古埃及人心目中,心是可以代表整个人的。作为一个独立的个体,心有能力遗弃人,将他的意识和意志带走。《孟菲斯神论》说:“心与舌有超乎其他感官的能量——因为是它们创造了一切......是心使得知识发展,是舌重复着心所想的。”对于死者来说,心就成了最关键的器官。人们精心地把它包裹好,从不让它离开尸体。

像“卡”和心一样,“名字”也是独立的存在。所有的事物都有名字。《孟菲斯神论》中,创世主普塔是“能叫所有事物名字的嘴”,是普塔结束了“没有任何东西的名字被叫出来的”混沌的初始时期。婴儿一诞生就立即得到一个名字,因为没有名字的事物是不存在的事物。为了防止在来世没有名字,古埃及人千方百计地使自己的名字永久留存下去。最早的文字也是用来书写名字的。名字能证明一个人的身份(当死者进入神的世界时,要宣称“神是我的名字”),同时也能代表一个人,在许多建筑物上法老的形象是用他的王名来代表的。官员在国王雕像前祈祷,与在王名前祈祷是一样的。神的名字与国王的名字都能产生魔法般的能量。例如,人们遇到鳄鱼时,大呼阿蒙神的名字就能得救。用神和国王的名字做护身符更是普遍。同样的道理,如果抹去一个人的名字就是彻底毁掉他的存在,伤害一个人的名字就如伤害那个人本身一样。例如,埃赫那吞抹去了阿蒙的名字,后人又抹去埃赫那吞的名字,都是出于这样的目的。许多时候,法老们通过更改名字的办法把以前法老的神庙、陵墓、雕像据为己有,因此许多雕像与其所有者的身体外貌特征毫无关联,只能靠上面的名字来判断其身份。

在肉体与灵魂之间的是“卡”,该词的象形文字符号是两条高高举向天空的胳膊,有拥抱、保护人类的含义。“卡”既属于人类也具有神性:有史以来它就出现在人名中,同时又经常出现在为神而设的架子上。有的学者认为古埃及人把“卡”当作人类的另一存在形式,是与人类一起被神创造出来的,也代表着本原力量。在铭文中,我们发现古埃及人对“卡”的定义是“力量、财富、养料、繁盛、效力、永恒、创造性、神秘力量”,也有人称之为“身体之外的灵魂肉体”“物质与精神世界之间的桥梁”。

军官伊皮-哈-伊苏太夫(Ipi-ha-ishutef)木棺上的棺文,11王朝,芝加哥大学博物馆藏

“卡”是所有的生命体,它既是生命的活力,也是生命的欢乐,具体来说就是一切美好的事物。从“卡”身上散发出来的能量只在死亡时有短暂的中断。不仅肉体有“卡”,雕像也可以承载“卡”。如果没有了“卡”,就意味着生命的消失。“卡”需要物质供给,需要吸取营养;同时所有的养分中都有“卡”,古埃及人互相敬酒时会说“为你的‘卡’”。为确保来世和现世的结合,古埃及人为死者献祭的同时,也供奉死者的“卡”。亡者死后必须重建与他们的“卡”之间的联系。

“巴”的写法有一个变化的过程,开始时埃及人把“巴”写成一个凹嘴白鹳的样子,逐渐地,白鹳嘴下部分的肉赘演变成乳状羽毛,到新王国时期则成为一个人头鸟身的形象。这种变化显示出“巴”作为人体一个独立的部分的作用,有时为强调这一点又加上人的胳膊。因为“巴”作为一个词也有“羊”的含义,所以有时又用羊来作为代表“巴”的符号。需要注意的是,太阳神的“巴”以羊头形象出现,而降临到冥世的太阳神则是羊头鸟身的样子。为确保复活,“巴”必须每天夜里在冥世深处与肉体结合。《亡灵书》第89节中死者宣称:“我看见我的‘巴’向我走来......它再次看见了它的身体并栖落在它的木乃伊上!”该节的叙述中还表达了担心像鸟一样盘旋的“巴”不能找到“它昨天所在之处”,或者受到阻止而不能回到其身体上去的焦虑心情。这种焦虑并非没有道理,因为身体必须每夜都与灵魂结合,死者才能得到新的生命。上述《亡灵书》片段的插图部分表现了一个人头的“巴”时而停在木乃伊头上,时而在它上面盘旋,旁边的文字说明提示说:“巴”已被放入死者之胸,完成了与肉体的结合。21王朝的墓室壁画也有同样的主题,只不过通常“巴”直接出现在死者头部的后面,而在后期埃及,此类画面是在棺椁上的。大多数关于“巴”的文字都发现于墓葬作品中,而且通常很少提到活着的人的“巴”。在《辛努海的故事》中,当描绘他回到埃及会见国王并由于过分激动而昏了过去时,有这样一句话:辛努海的“巴”离他而去,他失去了知觉,看到了死亡,直到国王开始以非常友好的口吻和他说话。在这里和在更普遍的意义上,“巴”表示“意识”。相反地,“卡”则经常在无意识的深处活动。一个拉美西斯时期的书吏曾写到过量喝啤酒会导致失去“巴”。当面对法老的威力时,敌人的“巴”们会仓皇逃窜。关于活着的人的“巴”的最重要的文献是前文提及的《一个人与他的“巴”的争论》(见本书第五章第三节)。

“巴”依附于身体,因为它作为一种精神的个体没有其他存在方式,它有物质的、身体的需求——面包、啤酒等。“巴”也享受爱的欢乐,墓葬文献中提过“巴”的性行为。此外,男女的结合既是身体的,也包括他们的“巴”的结合。“巴”最本质的特点有两点:一是可以自由行动,一是可以变成它所希望的种种形状。肉体只能在地上活动,或与“巴”结合后在冥世游荡,而“巴”则可以自己行动,如鸟般自由地上天入地,或者在人间花园里漫步。古埃及人把候鸟看作是“巴”的化身,因为它们能离开熟悉的世界到远方去,又能定期回来。

中王国时期的墓碑,开罗埃及博物馆藏

“巴”还在所有种类的变形中起到一定的作用。在这些变形中,某些神或动物会被看作是其他神或动物的“巴”,例如荷鲁斯的4个儿子也代表他的4个“巴”。

“巴”和“卡”还有一种区别:“卡”是人的本原及保护力量的具体体现,而“巴”则标志着从另一事物中出现的一种事物。比如,儿子可以是他父亲的“巴”而不能是他的“卡”;同样地,父亲可以是儿子的“卡”,却不可能是他的“巴”。拉神称巫术女神荷卡是自己的“巴”,而自己则是更古老的原始之神努神的“巴”。现在我们明白为什么古典作家最初遇到这些概念时会误以为古埃及人相信灵魂的变形。在基督教时期的埃及,“巴”和“卡”的使用逐渐中断,而希腊语的“psyche”(始基)一词开始成为“灵魂”一词的代名词。“卡”经常以拟人化的形象出现并作为人的复制品,在古埃及人的认识中,“卡”是人的至关重要的组成部分,与生俱来,共存共生,且在人死后继续存在。最好将“巴”描述为“生命力”,它在人活着的时候存在,但在人死后其重要性才更加显现出来,其时它与人体虽然是可分离的却又紧密联系在一起。它鸟身人头的形象说明“行动自由”是它最显要的特点。

本质上,埃及人把他们对人的各个方面的看法和经验进行了特别具体的概念化,所有的一切方面都可以叫作xprw,意为存在、显现。总之,“卡”是生命力,“巴”是行动和效力的能力;Xt和rn代表物质的外观和个性,swt是个神秘的物质存在,它以不同的形式和大小来来去去;心则代表人的智力、情感、道德层面的个性。这些方面都有能力独立行动,但它们最终都是个人的复杂心理机制的有机构成部分。

阿赫(Ax)与上述的一切都不同,它不是人的某一个部分,而是代表人作为整体处于被祝福的状态,以及超越墓葬的力量。这与下面要论述的通过仪式而达成的转换相关。

本文节选自《金字塔的国度》(颜海英 著,商务印书馆,2024年6月版),澎湃新闻经商务印书馆授权刊发。