《Java 2实用教程》读书笔记
1.Java可以在计算机的操作系统之上再提供一个Java运行环境(Java Runtime Environment,JRE)。
2.JRE由Java虚拟机(Java Virtual Machine,JVM)、类库、以及一些核心文件组成。
3.Java虚拟机的核心是所谓的字节码指令,即可以被Java虚拟机直接识别、执行的一种由0、1组成的序列代码。字节码并不是机器指令,因为它不和特定的平台相关,不能被任何平台直接识别、执行。
4.Java针对不同平台提供的Java虚拟机的字节码指令都是相同的,Java提供的编译器不针对特定的操作系统和CPU芯片进行编译,而是针对Java虚拟机把Java源程序编译成称为字节码的“中间代码”。字节码是可以被Java虚拟机识别、执行的代码。
5.Java虚拟机负责解释运行字节码,其原理是:Java虚拟机负责将字节码翻译成虚拟机所在平台的机器码,并让当前平台(本地的操作系统)运行机器码。
6.名称:
7.保存Java源文件时,如果源文件有多个类,那么只能由一个类是public类,如果有一个类是public类,那么源文件的名字必须和这个类的名字完全相同,扩展名是.java,如果源文件没有public类,那么源文件的名字可任意(建议和某个类的名字相同),并且扩展名是.java。
8.一个Java应用程序必须有一个类含有一个public static void main(String[] args)方法,称这个类为此应用程序的主类
9.命令
10.当使用Java解释器运行应用程序时,Java虚拟机首先将程序需要的字节码文件加载到内存,然后解释执行字节码文件。当虚拟机将主类的字节码文件加载到内存时,就为主类中的main方法分配了入口地址,以便Java解释器调用main方法开始运行程序。
11.注意main方法不要写错,例如漏掉static、错写为mian等错误。
12.一个Java程序需经历的三个步骤:编写源文件、编译源文件生成字节码和加载运行字节码。
1.标识符:
2.Java语言使用Unicode标准字符集,最多可以识别65536个字符,Unicode字符集的前128个字符刚好是ASCII码。
3.基本数据类型:
逻辑类型:
(1)boolean型:常量:true,false
整数类型:
(1)byte型:Java中不存在byte型常量的表示法,但可以把一定范围内的int型常量赋值给byte型变量。
(2)short型:和byte型类似,Java中也不存在short型常量的表示法,但可以把一定范围内的int型常量赋值给short变量。
(3)int型:常量:123(十进制),077(八进制),0x3ABC(十六进制)
(4)long型:常量:用后缀L来表示,123L(十进制),077L(八进制),0x3ABCL(十六进制)
字符类型:
(1)char型:常量:‘A’, ‘\t’,如char x = ‘a’;内存x中存储的是97,即字符a在Unicode表中的排序位置,因此也可以写成char x = 97;。
浮点类型:
(1)float型:常量后面必须要有后缀f或F。
(2)double型:常量后缀可以有d或D,但允许省略。
4.基本数据类型精度从低到高排序:
byte short char int long float double
注:所占字节数分别为1,2,2,4,8,4,8
5.位运算:
6.for遍历:for(int i : array){}
1.编程语言的几个发展阶段:
2.面向对象编程的三个特性:封装、继承和多态。
3.对象:类声明的变量被称为对象变量,简称对象。
4.类的结构:
5.UML图:
6.对象的内存模型:声明对象后,如Point p,p的内存中还没有任何数据,称这时的p是一个空对象,空对象不能使用,因为它还没有任何“实体”,必须再进行为对象分配变量的操作,即为对象分配实体,如p = new Point(),为各变量(实例变量和局部变量)分配内存,为类中的实例方法分配入口地址(当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有该类创建对象后,类中的实例方法才被分配入口地址,需要注意的是,当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,从而实例方法可以被类创建的任何对象调用执行,也就是说实例方法的入口地址被所有对象共享,当所有的对象都不再存在时,方法的入口地址才被取消; 而类中的类方法,在该类被加载到内存时,就分配了入口地址,从而类方法可以被类创建的任何对象调用执行,也可以直接通过类型调用,类方法的入口地址直到程序退出时才被取消),并计算出一个称作引用的值(该值包括代表这些变量和方法的内存地址及相关重要信息。
7.对象的引用存在栈中,对象的实体存在堆中。Java自动管理堆和栈,程序员不能直接设置堆和栈。栈的优势是,存取速度比堆快,缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性;堆的优势是,可以动态地分配内存大小,生成期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据(两个对象如果引用相同,则二者具有完全相同的实体,所谓的“垃圾收集”机制,就是周期性的简称某个实体是否已不再被任何对象所拥有,如果发现这样的实体,就释放实体占有的内存),但缺点是,由于要在运行时动态分配内存,存取速度较慢。
8.分配给对象的变量被习惯性的称作对象的实体,没有实体的对象称作空对象,空对象不能使用,加入程序中使用了空对象,程序在运行时会出现异常NullPointerException,由于对象可以动态地被分配实体,所有Java编译器对空对象不做检查,因此,在编写程序时要避免使用空对象。
9.可变参数:
public void f(double a, int … x),可变参数列表x可看作数组对待。
10.重写与重载:
首先需要清楚方法头和方法体的概念,其概念如下:
方法头: 修饰符+返回类型 +方法名(形参列表) 例如:public static void main(String []args)
方法体: { }的内容(包括这两个大括号和内部所有语法)
重写:与其父类方法方法名、形参列表完全相同;修饰符可以相同,可以不同(但不能降低访问权限);返回类型可以相同,也可以是父类方法的子类型;方法体的内容不一样;所以可以理解成外壳相似,内部不一样。
例如:假设A类有如下方法:
public void speak(int a){
System.out.println(“A”);
}
B继承于A,如果B中定义一个方法如下:
public void speak(int b){//(也可以(public void speak(int a))
System.out.println(“B”);
}
则对此个例子来说,称B类的speak方法重写了A类中的speak方法
重载:两个或多个方法的方法头中除方法名相同外,其他都可以不相同,方法体也不相同。
例如:有一个方法定义为float add(float a, float b),然后,再定义一个方法long add(long a, long b)
11.包:
例如package tome.jiafei;
编译:
(1)进入tom\jiafei的上一层目录1000编译,字节码默认保存在C:\1000\tom\jiafei中。
C:\1000> javac tom\jiafei\Student.java
C:\1000> javac tom\jiafei\Example.java
(2)使用通配符*,编译全部源文件
C:\1000\tom\jiafei> javac *.java
运行:
必须到tom\jiafei的上一层目录1000中来运行
C:\1000> java tom.jiafei.Example
1.如果子类与父类在同一包中,子类则继承了父类中不是private的:成员变量、方法,继承的成员变量和方法的访问权限不变。如果子类与父类不在同一包中,则父类的private和友好访问权限的:成员变量、方法,不会被子类继承。
2.java中子类会不会继承父类的static变量和static方法:无论是static修饰的变量,还是static修饰的方法,我们都知道他们是属于类本身的,不是属于某一个对象的,当声明一个对象时,并不产生static变量和方法的拷贝。也就是说,用static修饰的变量和方法在类加载的时候,只分配一块存储空间,所有此类的对象都可以操控此块存储空间。注:这里要说明的是,当子类没有与之同名的static变量(或方法时),子类的对象也可以操控这块内存空间。但是子类并没有继承父类中static修饰的变量和方法。因为static修饰的变量和方法是属于父类本身的。
3.当用子类的构造方法创建一个子类的对象时,不仅子类中声明的成员变量被分配了内存,而且父类的成员变量也都分配了内存空间,但只将其中一部分,即子类继承的那部分成员变量,作为分配给子类对象的变量。也就是说,如果在同一包中,父类的private成员变量尽管分配了内存空间,也不作为子类对象的变量,同样,如果不在同一包中,那么子类也不继承父类的友好成员变量。但是不是可以说子类创建对象时似乎浪费了一些内存呢,因为当子类创建对象时,父类的成员变量也都分配了内存空间,但只将其中一部分作为分配给子类对象的变量。答案是否定的,因为子类中还有一部分方法是从父类继承的,这部分方法却可以操作这部分未继承的变量。
4.当用子类的构造方法创建一个子类对象时,子类的构造方法总时先调用父类的某个构造方法,也就是说,如果子类的构造方法没有明显地指名使用父类的哪个构造方法,子类就调用父类中不带参数的构造方法。由于子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法的头一条语句,即如果在子类的构造方法中没有明显地写出super关键字来调用父类的某个构造方法,那么默认也有super();因此,在父类中定义多个构造方法时,应当包含一个不带参数的构造方方法,以防子类省略super时出现错误。
5.final关键字:
6.java上转型对象的理解,性质,优点:
理解:
若A类是B类的父类,当用子类(B类)创建一个对象b,并把此对象的引用赋值给父类(A类)的对象a中时,称对象a是对象b的上转型对象。
例如: A a = new A(); a = new B();
性质:
●上转型对象可以访问子类继承的成员变量或成员方法也可以访问子类重写的成员方法,但不能操纵子类新增的成员变量或成员方法。
●可以将上转型对象强制转回为子类对象。
优点:
方便面向接口的编程思想和面向抽象的编程思想,(上转型对象可理解为树的主干,其每个子类可理解为树枝)。
7.多态性:指父类的某个方法被其多个子类重写时,这多个子类可以按自己的需求,重写此方法产生各自的功能行为。
8.java抽象类的例子,性质,优点:
public abstract class A {
abstract int add(int x,int y);
int sub(int x,int y) {
return x-y;
}
}
性质:
●抽象类的类名前加修饰符abstract,可以包含抽象方法(用abstract修饰,只有方法原型,没有方法的实现),也可以包含非抽象方法,可包含常规类能包含的任何成员;
●抽象类是没有具体实例对象的类,不能使用new方法进行实例化,只能用作超类,只有当子类实现了抽象超类中的所有抽象方法,子类才不是抽象类,才能产生实例,如果子类中仍有抽象方法未实现,则子类也只能是抽象类;
●只有抽象类才可以包含抽象方法。
抽象方法的优点:
1.隐藏具体细节信息,所有的子类使用的都是相同的方法原型,其中包含了调用该方法时需要了解的全部信息;
2.强迫子类完成指定的行为,规定所有子类的标准行为。
9.java接口的介绍,性质,例子,优点:
interface Shape2D {
public static final double pi = 3.14;//public static final可省略
public abstract double area();//public abstract可省略
}
性质:
●接口可理解为纯抽象类;
●接口没有构造方法;
●常量(final),方法(public abstract,注意实现类中方法的访问权限为public);
●类实现某一接口要实现此接口的所有方法;
●接口的拓展:接口可继承(extends)多个超接口。
优点:
●建立类和类之间的“协议”口将类根据其实现的功能分组用接口代表,而不必顾虑它所在的类继承层次;
这样可以最大限度地利用动态绑定,隐藏实现细节;
●实现多继承的思想。
10.java接口回调及接口多个性质的例子:
interface Shape {
public static final double pi = 3.14;//public static final可省略
public abstract double area();//public abstract可省略
}
interface another{
//只用来做多继承思想的说明
}
class Circle implements Shape,another{
//为多继承思想的体现
double radius;//新增变量
public Circle(double r) {
//新增方法
radius = r;
}
public double area() {
//实现接口的方法
return (pi*radius*radius);
//调用接口中的pi常量(可理解为继承过来的)
}
}
public class Exampleke9 {
public static void main(String[] args) {
Circle cir = new Circle(2.0);
System.out.println("Area of cir = "+cir.area());
Shape shape;//声明接口变量
shape = new Circle(2.0);//接口变量中存放对象的引用
System.out.println("Area of cir = "+shape.area());
//shape.area()为接口回调,若多个类implements一个接口,接口回调可以体现多态性
}
}
11.abstract类与接口的比较:
abstract类除了提供重要的需要子类重写的abstract方法外,也提供了子类可以继承的变量和非abstract方法。
如果某个问题需要使用继承才能更好地解决,例如,子类除了需要重写父类的abstract方法外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑abstract类。
如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
12.自定义异常类:
一个方法在声明时可以使用throws关键字声明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并用throw关键字抛出该异常对象,导致该方法结束执行,程序必须在try-catch块语句中调用可能发生异常的方法,try部分中发生异常时,try部分立刻结束执行,执行跳转到catch部分,其中catch的作用就是捕获throw关键字抛出的异常对象。
13.断言:
断言语句可以在某个错误发生时,要求程序必须立即停止执行。在调试代码阶段非常有用,当程序正式运行时,就可以关闭断言语句。使用assert关键字声明。
1.String类常用方法:
2.StringTokenizer类:是String对象的分析器,可以分解String对象的字符序列,StringTokenizer对象称为字符串分析器。
3.StringBuffer类:可变字符串对象。
5.Date类、Calendar类与日期的格式化
6.Math类、BigInteger类和Random类
7.数字格式化:String.format()
8.Class类:该类的实例可以帮助程序创建其他类的实例,创建对象最常用的方式就是使用new运算符和类的构造方法,实际上也可以使用Class对象得到某个类的实例。
(1)public static Class forName(String className) throws ClassNot FoundException,该方法返回一个和参数className指定的类相关的Class对象,如果该类在某个包中,className必须带有包名。
(2)public Object newInstance() throws InstantiationException, IllegalAccessException,该方法使用Class对象调用newInstance()实例化一个className类的对象时,className类必须有无参数的构造方法。
9.Console类:在键盘上输入一行文本时,不让该文本回显,即不再命令行显示。
10.Pattern类与Matcher类
1.Java Swing概述:
2.常用容器:
3.常用布局:
4.常用组件:
JTextField(文本框)
JTextArea(文本区)
JButton(按钮)
JLabel(标签)
JCheckBox(复选框)
JRadioButton(单选按钮)
JComboBox(下拉列表)
JPasswordField(密码框)
5.事件:
未完待续…