面向接口编程,而非面向实现编程 — 读《Head first Design Patterns》
《Head first Design Patterns》中提到的第二个编程法则:
Design Principle
Program to an interface, not an implementation
这样做的目的是有利于替换接口的具体实现
Categorized in: Design Patterns, Java · Tagged with: DesignPatterns, Java
对静态方法不可访问非静态方法或者变量的思考—以前写的,移到这里
大家都知道,静态方法是依附于类存在的,调用方式是class.method ()方式,而非静态的变量或方法是依附于该类的对象而存在的,因此,如果用一个静态方法访问该类的非静态变量,因为调用这个静态方法不必先生成其对象,所 以这个依附于对象的非静态变量可能由于没有初始化而在静态方法体内造成空指针错误,因此java明确指出静态方法不能访问这个类的非静态变量,非静态方法 的道理大抵也是如此。
以上是本人的浅见,各位浏览于此并对此问题有独到见解,欢迎赐教,或讨论。
以上解释仔细想来不合情理,我起初想到的是由static关键字定义的变量必须要在声明时就初始化,但其实是不必的。这些静态变量完全可以由调用方法来初始化,所以以上解释不能作为本文标题的合理答案。
今早想了想,觉得又似乎是这样的:既然静态变量是依附于类而非该类对象,所以当一个非静态方法即对象方法使用这个静态变量时,会引起同步性问题,即 一个对象方法初始化了这个静态变量,而其它的对象方法又初始化或重新设置了这个静态变量,导致前者方法计算出的结果并非预期结果。
嗯,看来这个解释说的过去。
—————–
也许应该这样解释:对象的成员变量在对象不存在时是没有分配空间的,而静态方法和变量则有自己的内存空间,所以如果用静态方法访问非静态的成员变量或者非静态方法,必然不允许的,因为这些非静态的东西是否有存储空间不确定。所以干脆就禁止访问了
Categorized in: Java · Tagged with: Java
Java对象中的变量与方法中的变量的初始化
If a member varible of a object has a primary type, it will be inited with default value if u didnt init it. This is not effective for a variable in a method.
类变量如果在声明时没有初始化,那么在生成对象后将会给这个类变量一个默认值,比如对象是null,int是0等。而对于局部变量则不是这样,局部变量要求在使用前必须进行初始化
Categorized in: Java · Tagged with: Java
Java SE的一些基础
1.
public interface Inf { }
public class Parent { }
public class Child extends Parent implements Inf { }Inf i = new Child();
Parent p = new Child();
2.
public class Sample {}
public abstract class SampleA extends Sample {}
3.静态内部类可以出现在一个接口中
4.初始化顺序:从基类开始的所有类层次中的静态域(按顺序全部初始化)->从基类开始,按层次顺序初始化每个类的变量域和构造函数。
Categorized in: Java · Tagged with: Java
求自然数n以内的质数
今天遇到这样一道题目:求自然数n以内的质数
经过观察以后,我觉得可以以下方式来求解:
将已求解的质数放入结果数组,判断下一个数是否是质数,只要将它除以质数结果数组,如果都不能被整除,那么这个数也是一个质数,放入结果数组中。
/*
* PrimeNumber.java
*
* Created on 2006年8月12日, 下午6:05
*
* This class is under Gnu GPL.
*/
package primenumber;
import java.io.IOException;
/**
* Get prime numbers.
*
* @author <a href=”guangquanzhang@gmail.com“>guangquanzhang</a>
*/
public class PrimeNumber {
/** Creates a new instance of PrimeNumber */
public PrimeNumber() {
}
/**
* @param n natural number, 1-n
* @return all prime numbers between 1 and n.
*/
public static void getPrime(int n) {
int[] primes = new int[n];
int primesSize = 0;
// its apparent that 1, 2 is prime numbers
primes[0] = 1;
primes[1] = 2;
primesSize = 2;
for(int i=3; i<n; i++) {
int j = 1;
for (; j < primesSize; j++) {
if(i%primes[j] == 0) {
break;
}
}
if(j == primesSize) {
primes[primesSize] = i;
primesSize++;
}
}
// print all prime numbers
for(int k = 0; k < primesSize; k++) {
System.out.println(k + “ : “ + primes[k]);
}
}
public static void main(String[] args) {
PrimeNumber.getPrime(24);
}
}
Categorized in: Data Structure, Java · Tagged with: Algorithms, Java
关于Java栈与堆的思考 – 作者:zdmilan 来自:CSDN
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。
3. Java中的数据类型有两种。
一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出 后,字段值就消失了),出于追求速度的原因,就存在于栈中。
另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义
Categorized in: Java · Tagged with: Java
关于URL writting的问题
今天在看文章的时候,突然想到如果用户的浏览器禁止cookie,那么服务器可能使用url-write的方式实现会话,而这种会话的机制是在url后面 追加一个jsessionid=xxxxx的东西,所以怀疑是不是当把这个链接放到别的机器上,服务器是不是也会认为是合法的用户,结果一经测试,果然是 这样.
Categorized in: Java · Tagged with: Java
十年之前
今天晚上下班坐公交车时,闲来无事,就收听电台点歌节目。其中有一个人点到了陈奕迅的《十年》,主持人问到了点歌的人,十年之前在做什么,这不禁勾起了我对以往的回忆:10年之前,那是农历1996年冬天,正上高一。
记得刚上高中的时候,由于第一次离开家一个人在外面生活,所以非常想家,那段时间,我的体重下降了有20多斤,可想而知当时有多么想家。
老实说,高中三年真是挺累的,尤其是高三那段时间。不过话说回来,那时侯过的也很充实。

(
(4.00 out of 5)