Java 基础(一) 开放的访问属性(见 Display 项目)
public 意味着任何人都可以自由地使用
如果一个函数前没有加 public 限定,意味着和他位于同一个包的类可以访问,称为 friendly
protected
public Class 意味着任何人都可以用这个类来定义变量要求:public Class 必须定义在同名源文件中一个 .java 文件为一个编译单元,一个编译单元只能有一个 public 的类
Java 基础(二) 类变量和类函数
1234567891011121314public class ClassA { private static int value; private int alpha; public static void f() { //alpha++ //ERROR value++; //OK } public static void main(String[] arg) { ClassA a = new ClassA(); ClassA b = new ClassA(); }}
在 ClassA 中有一个 static 类型的变量,它不属于 ClassA 创建的任何对象,而是属于 ClassA 本身。可以通过 ClassA.value 或者a.value来使用。a.value与b.value实际上是同一个变量。
f()就是一个类函数,可以直接调用,但f()内部只能访问静态成员。
ArrayList 可以实现一个可变的数组,与 C++ 中的 Vecto ...
Java 基础(三) 对象数组
对象数组与基础类型的数组如int []是不同的。对象数组的每个元素都是对象的管理者,而非对象的本身。
123String[] a = new String[10];System.out.println(a[0]);//显示为nullSystem.outprintfln(a[0].length());//抛出异常
当通过创建了一个String类型的数组时,这个数组的每一个“格子”里都是String类型的管理者。此时该数组每一个元素管理的都是空的,即null。
因此,需要给它每一个元素创建对象,如:
1234for(int i = 0; i < a.length; i++){ a[i] = "" + i;}
对象数组的 for-each 循环123456789101112131415161718192021222324class MyClass { private int value; public void set(int val) { value = val; } pub ...
Java 基础(四) 容器与泛型
常用容器
常用 Collections
1. ArrayList类似于 c++ 中 Vector 的存在12345678910111213141516171819202122232425262728293031323334353637383940414243444546package notebook;import java.util.ArrayList;public class NoteBook { private ArrayList<String> notes = new ArrayList<String>();//指定元素的类型 public void add(String s) { notes.add(s); } public void insert(int index, String s) { notes.add(index, s); } public int getSize() { return notes.s ...
Java 基础(五) 继承(以实现一个存放 CD 、DVD 的 Database 为例)
在 Database.java 文件中实现了一个 Database 的类,其中含有 ArrayList 类型的成员变量 list 来存放数据。此外还有对 list 进行增添和遍历的add(Item newItem)和list()方法。
12345678910111213141516171819202122//Database.javapackage database;import java.util.ArrayList;public class Database { private ArrayList<Item> list = new ArrayList<>(); public void add(Item newItem) { list.add(newItem); } public void list(){ for(Item item:list) item.print(); } public static void main(St ...
Java 基础(六) Object 类
几乎在所有的 oop 语言中,都有一个“根”的存在。在 Java 中,这个“根”就是 Object 类。Object 类中包含有:
toString()
equals()
两个方法,前者可以打印对象的信息(可以在子类中具体实现);后者判断是否管理着同一个对象 (默认实现为 ==) 。如果要实现判断内容是否一致,需要在子类中实现。比如,要实现只要 CD 类中 artist 成员相同,equals()就返回 true,需要这样写:
1234567@Overridepublic boolean equals(Object obj){ CD a = (CD)obj;//造型 return artist.equals(a.artist);//equals判断两者所指向的对象的内容(可以自己实现判断标准)而==判断的是两者的值是否相等(即是否指向同一个对象)}
equals 比较二者指向对象的内容
== 比较二者是否指向同一地址(管理同一个对象)
Java 基础(七) 以“城堡游戏”为例改良代码(详见源代码)
1. 消除代码复制在原来的代码中,至少两处用到了相同的提示信息,需要将提示信息放在一个函数 showPrompt() 中来减少重复代码。
2. 封装封装以降低耦合度。在原来的代码中,Game 类大量使用了 Room 类中的成员,比如得到 currentRoom 的出口,正确的做法是在 Room 类中的 getExits() 以 String 返回出口,而非返回 Room 类的对象;Game 类中 goRoom() 函数也不应该直接操作 Room 类的成员,而应让 Room 类自己返回输入所对应的房间。
3. 可拓展性在原来的代码中, Room 类中含有 4 个表示出口的 Room 类型对象, 这不是好的做法, 因为这样大大降低了代码的可拓展性, 如果要增加 “up” 或者 “down” 方向的出口, 就会变得十分复杂. 更好的方式是用容器来增加代码的灵活性. 改造后, 只需在 createRoom()中写outside().setExit("up", anotherRoom);便可以使 outside 这个房间的 up 方向是 anotherRoom.增加可扩展性: ...
Java 基础(八) 抽象
1. 概念
抽象函数—表达概念而无具体实现代码的函数
抽象类—表达概念而无法实例化对象的函数
2. 特点
带有 abstract 修饰符的函数
有抽象函数的类一定是抽象类
抽象类不能制造对象, 但是可以定义变量
任何继承了抽象类的非抽象类的对象可以赋给这个变量
实现抽象函数
继承自抽象类的子类必须实现基类的抽象函数, 否则他自己就成为抽象函数
123public abstract class AbstractClass{ public abstract int abstractMethod();}
与 C++ 相比
C++
Java
虚函数
普通函数
纯虚函数
抽象函数
抽象类
抽象类
虚基类
接口
C++ 和 Java 实现多态的方式不同, 在 Java 中, 普通的函数就相当于 C++ 中的 virtual function, 从向上造型时候的例子可以看出, 即使变量本身是父类的, 但实际管理的对象是子类的, 默认调用的都是子类的函数, 如:
1234567891011121314public class A & ...
Java 基础(九) 数据与表现分离( 以"细胞自动机"为例)
Field 维护了一个二维数组, 里面存放着 Cell,Field 可以往二维数组中存放、取出指定 Cell, 获得指定 Cell 的邻居; Cell 可以用 draw() 绘制自己; view 只做一件事: 从 Filed 获得数据, 根据数据来paint().
Java 基础(十) 接口( Interface )以狐狸和兔子为例子
1. 接口
接口是纯抽象类
所有的成员函数都是抽象函数
所有的成员变量都是public static final
final 变量意味着这个变量不可以改变值, final 类不可以被继承, final 的方法不可以被 override.
接口规定了长什么样, 但是不管里面有什么
12345//一个接口的例子public interface Cell { void draw(int x, int y, int size);}
2. 实现一个接口
继承用 extends, 接口用 implements
类可以实现多个接口( 实现类似多继承的效果 )
接口可以继承接口, 但不能继承类
接口不能实现接口
可以通过instanceof判断赋给接口变量的对象是不是某个类的
123456//一个实现接口的例子, Fox 继承了 Animal 类的同时实现了 Cell 的接口public Fox extends Animal implements Cell { void draw(int x, int y, int size) { ...