《core java2 volume i: fundamentals》(原书第5版)
机械工业出版社
以前看过的关于java的东西都很零碎,感觉有必要重新学习一下java的一些基础知识,特记。
第1章 java 简介
1、我们认为java的种种优势在它应用于新型设备或新应用领域中才能体现,而不是用它来重写那些已存在的应用程序。
///所谓各领风骚十来年,大致就是这个意思;同时,泛泛地比较语言之间的优劣是没有意义的
2、简单的说,面向对象的程序设计是把重点放在数据(等于对象)以及对象接口上的一个编程技术。以木匠为例,一个
“面向对象”的木匠首先会关心他要制造的椅子,然后才是制造这椅子的工具;而一个“非面向对象”的木匠会首先考虑他的工具。
///只有思想提上去,才可以改善做事的方式。可怕的是:往往在使用着面向对象的工具,却使用着面向过程的思想
第2章 java 编程环境
1、一个简单而有趣的界面程序,显示.gif 图像
///imageviewer.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
public class imageviewer{
public static void main(string[] args){
jframe frame = new imageviewerframe();
frame.settitle("imageviewer");
int w = 320, h =400 ;
dimension screensize = toolkit.getdefaulttoolkit().getscreensize();
frame.setbounds((int)((screensize.width-w)/2),(int)((screensize.height-h)/2),w,h);
frame.setsize(w,h);
frame.setdefaultcloseoperation(jframe.exit_on_close);
frame.show();
}
}
class imageviewerframe extends jframe{
public imageviewerframe(){
//set menu
jmenubar menubar =new jmenubar();
setjmenubar(menubar);
jmenu menu = new jmenu("file");
menubar.add(menu);
jmenuitem openitem = new jmenuitem("open");
menu.add(openitem);
openitem.addactionlistener(new fileopenlistener());
jmenuitem exititem = new jmenuitem("exit");
menu.add(exititem);
exititem.addactionlistener(new actionlistener(){
public void actionperformed(actionevent event){system.exit(0);}
});
//use a label to display the iamges
label = new jlabel();
container contentpane = getcontentpane();
contentpane.add(label,"center");
}
private class fileopenlistener implements actionlistener{
public void actionperformed(actionevent evt){
//set up file chooser
jfilechooser chooser = new jfilechooser();
chooser.setcurrentdirectory(new file(".")) ;
//accept all files ending with .gif
chooser.setfilefilter(new javax.swing.filechooser.filefilter(){
public boolean accept(file f){
return f.getname().tolowercase().endswith(".gif") || f.isdirectory();
}
public string getdescription(){
return "gif images";
}
});
//show file chooser dialog
int r = chooser.showopendialog(imageviewerframe.this);
//if image file accepted,set it as icon of the label
//只有到此时,才要实现我们的目的:显示图片,前面全是一些准备工作!
if(r== jfilechooser.approve_option){
string name = chooser.getselectedfile().getpath();
label.seticon(new imageicon(name));
}
}
}
private jlabel label;
}
第3章 java 基本编程结构
///略
第4章 对象和类
1、oop中的对象有三个主要特性:
a)对象的行为
b)对象的状态
c)对象的标识符
///比较好理解
2、类之间的关系
a)依赖 uses-a
b)聚合 has-a
c)继承 is-a
3、注意:我们采用的风格是类的方法在前,字段在后,这样做可能会在某种程度上鼓励首先关心类的接口,儿不是关心其
实现。
///一直比较纳闷为什么字段定义在后,原来如此!
4、静态字段和方法 ///此处的字段是指类内部的属性
a)如果把一个字段定义为 static ,那么,一个类中只有一个这类字段。
///我的理解:如果用static 定义一个类的字段,那么这个字段属于类,而不是属于对象。所有的对象将操作一个地址。
b)静态变量很少见,静态常量却是很普遍的
如:public class math{
//…
public static final double pi = 3.14159265358979323846;
//…
}
public class system{
//…
public static final printstream out = …;
}
c)静态方法
我们可以把静态方法看作是没有this参数的方法
我们可以在以下两种情况下使用静态方法:
(1)当一个方法不需要访问对象状态时;
(2)当一个方法只需要访问类中的静态方法时
静态方法还有另一种常见的用途:
如: numberformat.getnumberinstance()
这种方法被称作工厂方法 factory method
5、java程序设计语言总是使用传值调用。这意味着方法得到是所有参数值的一个拷贝。尤其是,方法不能修改传递给它的
任何参数变量内容。
///第一次主要到这点,但是,随后,作者确实这样写的:
一个方法不可能改变基本类型的参数,而对于对象参数来说则不同。我们可以很容易地——实际上是非常普遍——实现改变一个
对象参数状态的方法。原因很简单。方法得到对对象引用的一个拷贝,而原对象变量和此拷贝都指向同一个对象。
///employee.java
public class employee {
string name ;
double salary ;
public employee(string name){
this.name = name ;
this.salary = 1000.0;
}
public double getsalary(){
return salary;
}
public static void triple(employee emp){
emp.salary *= 3;
}
public static void main(string[] args) {
employee feng = new employee("feng");
employee yu = new employee("yu");
triple(feng); // work correctly!
system.out.println("fengs salary:"+feng.getsalary());
system.out.println("yus salary:"+yu.getsalary());
}
}
///但是,随后作者又说:
有些程序员声称java程序设计语言对对象使用引用调用。然而这种理解是错误的。通过一个例子来说明:
///注意:例子中的那个 swap() 并没有如预期的那样起作用
public class employee {
string name ;
public employee(string name){
this.name = name ;
}
public string getname(){
return name;
}
public static void swap(employee x,employee y){
employee t = x;
x = y;
y = t;
}
public static void main(string[] args) {
employee feng = new employee("feng");
employee yu = new employee("yu");
swap(feng,yu); //cannot work
system.out.println(feng.getname());
system.out.println(yu.getname());
}
}
///对于方法参数,作者归纳如下:
a)方法不能修改基本类型的参数
b)方法可以改变对象参数的状态
c)方法不能使一个对象参数指向一个新的对象
6、构造函数
当类被第一次加载的时候,进行静态初始化。静态字段被初始化为0,false 或 null ,除非显式的赋值。所有静态
字段初始化语句或初始化块按照在类声明中出现的次序依次被执行。
下面是一个没有使用 main 方法的程序
///hello.java
public class hello {
static {
system.out.println("hello world!");
system.exit(0);
}
}
7、文档注释
注释以/** 开头,*/结束,包含标签(@author, @param, @see 等)和自由文本(可包含html标记)
类注释:一般放到放到import语句之后,在类定义之前
8、类设计的技巧
1)永远保持数据的私有 ///这需要从实用出发,而不是从实现方式出发
2)永远初始化数据 ///不要依靠默认值
3)不要在一个类中使用太多基本类型
///比较好理解,用address 类来代替 employee 类中的下面字段:
private string province ;
private string city ;
private string street ;
private int zip ;
4)不是所有的字段都需要自己的字段访问器和调节器setp() getp()
5) 用标准形式对类定义:public ,protected, private ;每一部分: 实例方法,静态方法,实例字段,静态字段
6)把有太多职责的类分解
7)使类和方法的名字反映它们的职责
第5章 继承
1、写了一个继承实例:
employee的薪水只是基本工资;manager的薪水为基本工资+奖金
//managert.java
class employee{
public employee(string name){
this.name = name ;
}
public double getsalary(){
return basicsalary ;
}
public void showinfo(){
system.out.println("name:" + name );
system.out.println("salary:" + getsalary() );
}
private string name = "";
private double basicsalary = 1000.0;
}
class manager extends employee{
public manager(string name){
super(name);//使用super可以调用父类
}
public void setbonus(double b){
bonus = b ;
}
public double getsalary(){
setbonus(126.0);
return super.getsalary() + bonus ;
}
private double bonus ;
}
public class managert {
public static void main(string[] args) {
employee emp = new employee("feng");
emp.showinfo();
manager man1 = new manager("wu");
man1.showinfo();
employee man2 = new manager("song");
man2.showinfo();
}
}
2、
final 一个类:不可继承;
final 一个方法:该方法不可被重载
设置为final 有两个原因:a)效率。动态绑定比静态绑定开销要大。b)安全。
3、抽象类,abstract 定义
为了更明确,规定具有一个或多个抽象方法的类本身必须定义为abstract
在java语言中,抽象方法是非常重要的概念,在“接口”里,会大量的遇到。
///java访问的控制符号小结:
private:只对本类可见;
public :对一切可见;
protected:对本包和子类可见;
[缺省]:对本包可见 ///个人感觉最好不要用缺省
to be continued
