****java语言支持四中类型:接口,类,数组,原语类型。
****一个类成员包括:域,方法,成员类,成员接口
****一个方法的原型:方法的名字和所有形参的类型,但不包括它的返回类型
****API:是指类,接口,构造函数,成员,和序列化形式
***对象本身已知的事物称为实例变量,它们代表对象的状态(数据),且该类型的每一个对象都会独立的拥有一份该类型的值。
***对象可以执行的动作称为方法。
***main()方法的两种用途:a。测试真正的类 b。启动java应用程序
***constant:常量
***类与对象两者都有状态与行为
***变量有两种:primitive主数据类型和引用
***变量必须有类型和名称
***除非小数后加f,否则java中的小数都默认被当作double处理
***变量命名必须以字母,下划线(_),或$符合开头
***对象引用变量保存的(即引用变量的值)是存取对象的方法
***同一java虚拟机中所有引用的值大小都一样
***不可以对引用变量进行运算
***数组也是对象,数组中的每个元素都是变量
***ArrayList只能携带对象而不是primitive主数据类型,但编译器能够自动地将primitive主数据类型包装成Object以存放在ArrayList中。
***运用import只是帮你省下每个类前面的包名称而以,程序不会因此而变大或变慢。
***private类型的成员不会被继承。
***IS-A:继承关系
HAS-A:实例变量
***继承下来的方法可以被覆盖掉,但实例变量不能被覆盖掉。
***子类不需要重新编译就能运用到新版本的父类。
***引用变量,参数,返回类型可以多态。
***三种方法可以防止某个类被作出子类:
存取控制:非公有(缺省)的类只能被同一个包的类作出子类。
使用final这个修饰符,表示它是继承树的末端不能被继承。
让类只拥有private的构造函数。
***重载与继承和多态毫无关系。
***覆盖:
参数一样;返回类型兼容(相同或其子类)。
不能降低方法的存取权限。
***重载:
返回类型可以不同。
不能只改变返回类型,还要参数不同。
可以任意更改存取权限。
***抽象类:
不能被“new”出来,即不能被初始化的类。但任然可以用这种抽象的类型作为引用类型。
抽象类除了被继承外,是没有用途,没有值,没有目的。
抽象类可以带有抽象和非抽象的方法,(并不一定非要有抽象方法,但有抽象方法的类一定要声明为抽象类)。
抽象类代表此类必须被extend过,抽象方法代表此方法一定要被覆盖过。
***编译器是根据引用类型来判断哪些method可以调用,而不是根据Object确实的类型,如
Object dog=new Dog();
dog。bark();(错)
dog。hashCode();(对)
***接口:
接口的方法本身有public和abstract的意义。但不必一定要打印出来。
接口的方法一定是抽象的。
***接口解决致命方块的方法很简单:把全部的方法设为抽象的,如此,子类就的实现此方法。
***不同继承树的类可以实现相同的接口。
***接口的作用:
使用接口可以继承超过一个以上的来源,并且使用接口取代具体子类或抽象的父类作为参数或返回类型,就可以传入任何有实现该接口的东西,从而更好地实现多态。
***堆:存放对象
栈:存放方法调用和局部变量
***变量:
实例变量--存在于所属的对象中--堆
局部变量--存在与方法中或方法的参数上,即只限于方法放在栈上的这段期间--栈
***声明对象和赋值有3个步骤:
声明引用变量
创建对象
连接对象和引用
***构造函数:
没有返回类型
与类的名称相同
***初始化对象的状态(给实例变量赋值):
使用构造函数
调用setter()方法
***构造函数不会被继承
***一定要有不需要参数的构造函数。
***编译器只会在完全没有设定构造函数时才自动构造无参数的构造函数。
***父类都有一个构造函数,且每个构造函数都会在子类对象创建时执行。
***抽象类也有构造函数,虽不能用new创建其对象,但它的构造函数会在具体子类创建出实例是执行。
***构造函数在执行的时候,第一件事就是去执行它的父类的构造函数,这会连锁反应到Object这个类为止。
***编译器两种涉如构造函数的方式:
a。你没有写构造函数时,编译器做public classname(){super();}
b。有写构造函数但没有调用super(),编译器会自动加super();
***super()、this()必须是构造函数的第一个语句。
***当最后一个引用消失时,对象就会变成可回收的
***3种方法可以释放对象:
a。void 乖哦(){life l=new life();}方法结束时对象释放。
b。life l=new life();
l=new life();引用被赋值到其他对象上
c。直接将引用设为null
life l=new life();
l=null;
***取得新对象的方法:
a。通过new
b。序列化
c。Java Reflection API
***静态变量只会在类第一次载入的时候被初始化,即静态变量会在该类的任何实例对象对象创建之前,在该类任何静态方法执行之前就初始化。
***静态变量的功能:同类的所以实例共享的变量。
***静态初始程序static{}是一段在加载类时会执行的程序代码,它会在其他程序使用该类之前就执行。
***标记为final的变量一旦被初始化之后就不会改动。
***常数变量的名称应该都是大写字母。
***final的method不能被覆盖
***final的class不能被继承,将类标记为final是为了安全
***如果类只有静态方法,可以将构造函数标记为private的以避免被初始化。
***要取得当前日期时间就用Date,其余功能可以在Calendar上面找。Calendar是抽象类,用Calendar cal=Calendar.getInstance();取得其具体子类实例。
***任何继承过RuntimeException(unchecked)的类都不会受编译器关于是否声明它会抛出RuntimeException的检查,同样,也不会管调用方是否认识到可能会在运行期遇到异常。
***try/catch是用来处理真正的异常,而不是程序的逻辑错误。
***RuntimeException类或子类的异常不需要声明异常或被包在try/catch块中(然而你是可以这么做的)。
***finally块是用来存放不管有没有异常都得执行的程序。
***try一定要有catch或finally
只带有finally的try必须要声明异常
***如果谋类是可以序列化的,则它的子类也自动地可以序列化
***Serializablle接口又被称为marker或tag类的标记用接口
***如果某实例变量不能或不应该被序列化,就把它标记为transient的。
***虽然java函数库中大部分的类可以被序列化,还是无法将网络联机之类的东西保存下来。
***静态变量不会被序列化。
***如果类(实现Serializablle)有可能会演化,就把版本识别ID(serialVersionUID)放在类中,以便解序列化是不会抛出异常。
***线程是独立的线程,它代表独立的执行空间。
***run()是新线程所执行的第一项方法。
***调用Tread对象的start()之后,会建立出新的执行空间,它处于可执行状态等待被挑出来执行。
***虽然synchronized这个修饰符加到方法的声明上,每个java对象都有一个锁,每个所锁只有一把钥匙,锁不是陪在方法上,而是配到对象上,如果对象有两个同步方法,就表示两个线程无法进入同一个方法,也表示两个线程无法进入不同的方法。
***同步化的规模可以小于方法,如
public void go()
{
a();
synchronized(this)
{
b();
c();
}
}
***Map事实上并没有继承Collection这个接口,但Map也应该被当作是Collection Framwork中的一分子。
***判断相等:引用相等性和对象相等性
***hashCode()默认会返回每个对象特有的序号(大部分java版本是依据内存(head上)位置计算此序号,所以不会有相同的hashCode)
***HashSet检查充分:
先判断hashCode是否相同
再调用equals()方法
***equals()的默认行为是执行==的比较(内存),一般要覆盖该方法来实现自定义类的比较。
***若equals()被覆盖个,hashCode()也必须被覆盖,并且a.equals(b)必须与a.hashCode()==b.hashCode()等值(如同为true或false);但a.hashcode()==b.hashcode()不一定要与a.equals(b)等值。
***hashCode是用来缩小寻找成本,但最好还是要用equals()才能认定是否真的找到相同的项目。
***Collection.sort()方法:
调用单一参数的sort(List o)方法代表由list元素(实现comparable接口)上的compareTo()方法来决定顺序。
调用sort(List o,Comprator c)方法代表不会调用list元素的compareTo()方法,而会使用Comprator的commpare()方法,这意味着list元素不需要实现Comparable接口。
***TreeSet
集合中的元素必须是实现Comparable接口的类型或使用重载,取得Comparetor参数的构造函数来创建TreeSet
***数组的类型是在运行期间检查的,但集合的类型检查只会发生在编译期间。
***程序可以在类文件保存在JAR的情况下执行。秘诀在与创建出manifest文件,它会带有JAR的信息,告诉java虚拟机哪个类包含main()方法。manifest.txt中:main-class:MyApp(没有。class,还要换行)
***执行JAR:java -jar app.jar
***在RMI中,客户端的辅助设施称为stub,而服务端的辅助设施称为skeleton。
***远程方法的参数和返回值必须是primitive或serializable的。
***目前常用的J2EE技术混合了Servlet和EJB,前者是后者的用户。此时,servlet是通过RMI来与EJB通信的。
***J2EE服务器包括了Web服务器和EJB服务器
***Jini也是使用RMI,但多了几个关键的功能:
adaptive discovery(自适应探索)
self-healing networks(自恢复网络)