记得在C++中,private部分主要是数据成员,public部分主要是函数成员,也就是类接口。如果没有特别声明public或者protect,private,也不会强调包访问权限这个概念。《thinking in JAVA》中的一些例子总是让人有眼前一亮的感觉。
现在想想,当时学的C++真是皮毛都算不上。囧rz
正题:
通过将构造函数声明为private,控制类外程序无法直接创建新类,而需要通过类接口来创建。书上说是可以通过特定函数(类接口)来实现特殊功能,比如控制数量。细心一想确实如此,要统计生成的对象数目,用一个计数器就可以了,但构造函数本身无法控制不生成对象,因为调用构造函数本身的同时就生成了一个对象。但是用函数成员的话只需要一个if就可以解决。
里面还提到一个设计模式的例子。private构造函数,类接口本身只提供一个类内生成对象的引用。称之为singleton(单例)。这种想法之前还真没接触过。。
example code:
/* Following the form of the example Lunch.java, create a class called
* ConnectionManager that manages a fixed array of Connection objects. The client
* programmer must not be able to explicitly create Connection objects, but can
* only get them via a static method in ConnectionManager. When ConnectionManager
* runs out of objects, it returns a null reference. Test the classes in main(). */
class connection{
private static int count = 0;
private connection(){System.out.println("connection created!");}
public static connection makecon(){
count ++;
return new connection();
}
public int howmany(){return count;}
}
public class CM{
private int num = 3;
connection[] con = new connection[3];
CM(){
for(connection x : con){
x = connection.makecon();
System.out.println(x.howmany());
}
}
public connection getcon(){
if(num != 0){
System.out.println("get " + (num - 1) + "th connection");
return con[--num];
}
else {
System.out.println("no connection left!");
return null;
}
}
public static void main(String[] args)
{
CM cm1 = new CM();
connection c1 = cm1.getcon();
connection c2 = cm1.getcon();
connection c3 = cm1.getcon();
connection c4 = cm1.getcon();
}
}
原书答案中,生成固定数组的foreach语句是用一个大括号包起来,而我将其放在构造函数中。之前还没出现过
{
for(...){}
}
这种用法,开始不明白,后来想起,类中只能存在数据成员和函数成员,不能出现这种函数语句的吧?。。。C++中反正我是没见过 = =
2012年2月21日星期二
2012年2月19日星期日
HDOJ 2035 人见人爱A ^ B
突然想起还有一份杭电ACM的PPT没看,翻出来看了下~发觉蛮有意思的,就是内容少了点。。。基本上是提纲,该总结的都自己来吧。╮( ̄▽ ̄")╭
题目很简单,但也蛮经典的算术题。
输入两个数A,B。输出A ^ B的最右三位数。
核心思路:求 A的B次方 模1000,只需要求 A%1000 的 B次方。B通过降幂二分加速。
比如:(1123)^ 6 = (1000 + 123) ^ 6
多项式展开后,决定结果最后三位的是123 ^ 6
然后123 ^ 6 = (123 ^ 3) ^ 2
version 1.0 纯暴力
#include<cstdio>
int main()
{
int a,b,sum;
while(scanf("%d%d",&a,&b) && a){
sum = a;
for(int i = 1;i < b;i ++){
sum *= a;
if(sum >= 1000)sum %= 1000;
}
printf("%d\n",sum);
}
return 0;
}
优化之后,通过二分加速,int范围内的大数都可以接受。
version 1.1 递归
题目很简单,但也蛮经典的算术题。
输入两个数A,B。输出A ^ B的最右三位数。
核心思路:求 A的B次方 模1000,只需要求 A%1000 的 B次方。B通过降幂二分加速。
比如:(1123)^ 6 = (1000 + 123) ^ 6
多项式展开后,决定结果最后三位的是123 ^ 6
然后123 ^ 6 = (123 ^ 3) ^ 2
version 1.0 纯暴力
#include<cstdio>
int main()
{
int a,b,sum;
while(scanf("%d%d",&a,&b) && a){
sum = a;
for(int i = 1;i < b;i ++){
sum *= a;
if(sum >= 1000)sum %= 1000;
}
printf("%d\n",sum);
}
return 0;
}
优化之后,通过二分加速,int范围内的大数都可以接受。
version 1.1 递归
2012年2月18日星期六
关于import & package的应用与疑问
在《thinking in JAVA》第六章 访问控制权限 中,说到了package的用法。对于解决像System.out.print这种冗长的输出格式,也不失为一种好的解决办法。但是建立自己的类库,代码的可移植性也就要差点了。当然这个package也是鼓捣了好一阵才弄明白怎么用,囧
首先涉及到classpath的设置。安装JDK的时候会有设置classpath这一步。比如,classpath中存在“%java_home%\lib;"
import access.test.*
就会在classpath下寻找access]test 这个目录中的java源文件和class文件(也就是%java_home%\lib\access\test\ 这个目录)
个人感觉,import 和C++中的 using namespace 比较类似,反而不是属于include那一类。简单的说就是命名空间的划分引用。
也就是说,一般在类库中的文件,源代码开头(除注释)都是package 语句,用以将该java文件和class文件划分在指定的命名空间中。调用的时候就通过import语句导出。也就是说类库中java源文件中的package路径就是文件本身的路径?
其实一开始让我疑惑的是,一般我们会
import java.util.*
但是在我的classpath
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
搜寻路径中,没有java这个目录,而java\util\ 这个目录实际上存在于%JAVA_HOME%\src.zip 这个文件中打包保存。这个怎么解释呢?应该是JAVA路径支持压缩包
比如:
CLASSPATH:也指定一个路径列表,是用于搜索 Java 编译或者运行时需要用到的类。在 CLASSPATH 列表中除了可以包含路径外,还可以包含 .jar 文件。Java 查找类时会把这个 .jar 文件当作一个目录来进行查找。通常,我们需要把 JDK 安装路径下的 jre/lib/rt.jar (Linux: jre/lib/rt.jar) 包含在 CLASSPATH 中。
首先涉及到classpath的设置。安装JDK的时候会有设置classpath这一步。比如,classpath中存在“%java_home%\lib;"
import access.test.*
就会在classpath下寻找access]test 这个目录中的java源文件和class文件(也就是%java_home%\lib\access\test\ 这个目录)
个人感觉,import 和C++中的 using namespace 比较类似,反而不是属于include那一类。简单的说就是命名空间的划分引用。
也就是说,一般在类库中的文件,源代码开头(除注释)都是package 语句,用以将该java文件和class文件划分在指定的命名空间中。调用的时候就通过import语句导出。也就是说类库中java源文件中的package路径就是文件本身的路径?
其实一开始让我疑惑的是,一般我们会
import java.util.*
但是在我的classpath
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
搜寻路径中,没有java这个目录,而java\util\ 这个目录实际上存在于%JAVA_HOME%\src.zip 这个文件中打包保存。这个怎么解释呢?应该是JAVA路径支持压缩包
比如:
CLASSPATH:也指定一个路径列表,是用于搜索 Java 编译或者运行时需要用到的类。在 CLASSPATH 列表中除了可以包含路径外,还可以包含 .jar 文件。Java 查找类时会把这个 .jar 文件当作一个目录来进行查找。通常,我们需要把 JDK 安装路径下的 jre/lib/rt.jar (Linux: jre/lib/rt.jar) 包含在 CLASSPATH 中。
订阅:
博文 (Atom)