Java编程思想(五)
初始化与清理
在构造器中调用构造器
package com.summer0705;
public class Flower{
int petalCount = 0;
String s = "initial value";
Flower(int petals){
petalCount = petals;
System.out.println("Constructor w/ String arg only,petalCount="+petalCount);
}
Flower(String ss){
System.out.println("Constructor w/ String arg only,s="+ss);
s = ss;
}
Flower(String s,int petals){
this(petals);
this.s = s;
System.out.println("String&int args");
}
Flower(){
this("hi",47);
System.out.println("default constructor(no args)");
}
void printPetalCount(){
System.out.println("petalCount="+petalCount+" s="+s);
}
public static void main(String[] args) {
Flower x = new Flower();
x.printPetalCount();
}
}
Static关键字
static方法就是没有this的方法,在static方法的内部不能调用非静态方法。
Java中禁止使用全局方法,但是在类中置入static方法就可以访问其他static方法与static域
清理:终结处理和垃圾回收
在C++中,对象一定会被销毁,而Java里的对象却不一定总是被垃圾回收
- 对象可能不被垃圾回收
- 垃圾回收并不等于“析构”
- 垃圾回收只与内存有关
构造器初始化顺序
class Window{
Window(int marker){
System.out.println("Window("+marker+")");
}
}
class House{
Window w1 = new Window(1);
House(){
System.out.println("House");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f(){
System.out.println("f()");
}
Window w3 = new Window(3);
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h =new House();
h.f();
}
}
静态数据的初始化
class Bowl{
Bowl(int marker){
System.out.println("Bowl("+marker+")");
}
void f1(int marker){
System.out.println("f1("+marker+")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1);
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2("+marker+")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard(){
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3("+marker+")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitalization {
public static void main(String[] args) {
System.out.println("Creating new Cupboard()");
new Cupboard();
System.out.println("Creating new Cupboard()");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
显示的静态初始化
class Cup{
Cup(int marker){
System.out.println("Cup("+marker+")");
}
void f(int marker){
System.out.println("f("+marker+")");
}
}
class Cups{
static Cup cup1;
static Cup cup2;
static {
cup1 = new Cup(1);
cup2 = new Cup(2);
}
Cups(){
System.out.println("Cups()");
}
}
public class ExplicitStatic {
public static void main(String[] args) {
System.out.println("mian");
Cups.cup1.f(99);
}
static Cups cups1 = new Cups();
static Cups cups2 = new Cups();
}
可变参数列表
class A{}
public class VarArgs {
static void printArray(Object[] args){
for(Object obj:args)
System.out.println(obj+" ");
System.out.println();
}
public static void main(String[] args) {
printArray(new Object[]{
new Integer(47),new Float(3.14),new Double(11.11)
});
printArray(new Object[]{"one","two","three"});
printArray(new Object[]{new A(),new A(),new A()});
}
}
枚举类型简介
简单实例:
enum Spiciness{
NOT,MILD,MEDIUM,HOT,FLAMMING
}
public class SimpleEnumUse {
public static void main(String[] args) {
Spiciness howHot = Spiciness.MEDIUM;
System.out.println(howHot);
}
}
枚举类型创建时还会加入一些有用的特性。
比如toString()方法,以及ordinal()方法用于表示某个特定enum常量的声明顺序,static values()方法,用来按照enum常量声明顺序产生这些常量构成的数组。
最好理解enum的方法是将其理解为一个类
switch与enum的结合
public class Burrito {
Spiciness degree;
public Burrito(Spiciness degree){this.degree = degree;}
public void describe(){
System.out.print("This burrito is ");
switch (degree){
case NOT:
System.out.println("not spicy at all");
break;
case MILD:
case MEDIUM:
System.out.println("a little hot");
break;
case HOT:
case FLAMMING:
default:
System.out.println("maybe too hot");
}
}
public static void main(String[] args) {
Burrito plain = new Burrito(Spiciness.NOT),
greenChile = new Burrito(Spiciness.MEDIUM),
jalapeno = new Burrito(Spiciness.HOT);
plain.describe();
greenChile.describe();
jalapeno.describe();
}
}