鉴于学校的Java基本上是把我们当asshole来教,我决定在作业上花点功夫弄点新花样顺便自学一下。总结一下已完成的进度,共有如下几个关于错误的反思:
1.无法在静态上下文中使用静态变量
这是最让我印象深刻的一个错误,目测是由于和C的差别略大所以我多思考了一些,有如下代码:
public class XX{
public static void main{
Scanner scanner = new Scanner(System.in);
int a = Scanner.nextInt();//这句有错误
}
}
然后出了错误提示,我很崩溃。。。。这不是Scanner下的nextInt方法么?不是输入一个int给a么?谁特么来告诉我哪里错了?????(╯‵□′)╯︵┻━┻
楞死不明白哪里错了,无奈用作业上的示例代码盖掉了错误行,即int a = scanner.nextInt();
然后编译过了。。。。。。。
过了。。。。。。。
我哭晕在厕所。。。。亏我还以为是前面的哪一句出了问题待到这句才反映出来。。。。
对比了一下,就是一个S的大小写问题,但错误的提示不是这么简单了,Scanner是Java类库中的一个非静态方法,即没有使用static定义,而main则是static型的方法,两者有一定区别。在C中,编译的优先级依次为预编译>static内容>顺序编译其他代码。Java中目测没有预编译的概念,所以static就有了最高的编译优先级,而在Java中,非static类在编译后只会成为一段字节码而不会自动加载进入main,所以尽管编译器检测到了外部非static类的使用,但却无法直接使用。Java的意图是:将非static类和方法视为一种规范,在程序运行中不能被更改,只能在main中新建一个指向其的对象(在内存中分配新的空间)来使用该类/方法。这样确实可以更好地保护源代码而且起到了C中类似于#ifdefine的作用,很好的减少了内存的使用。但这么弄总觉得有点*蛋。。。。每次使用一个方法都要新建一个对象,这个对象又是为另一个对象服务的。。。。。。不是很麻烦而且混乱么。。。。。
2.需要关键字(无法使用关键字)
这个问题总是出现在我使用private关键字修饰一个变量或者对象的时候,书上明明说使用该关键字可以更好的保护类和方法的中的数据(成为真·私有变量),为啥我一加连变量和对象都创建不了了?百思不得其解。(我是在类和方法的开头使用了private datatype name这样的形式定义的变量,然而并不能通过编译。。)
其他的都是一些小的语法错误了,没有什么好说的。
还有一个问题,我在写这个程序的时候很纠结,不知道类应该有多大,方法应该有多大,即“类究竟表示什么”和“方法究竟应该表示什么”。目测这是面向对象编程一个最最主要的问题,按理说应该只能靠经验来改善这个问题,然而我现在并没有这个经验所以我纠结了。。。。。题目要求“1.编写一个程序检测输入的数是奇数还是偶数 2.编写一个程序判断你的成绩等级”,按理说这应该是两个程序,然而我脑洞一开,开始作死,将两个题目分别视为两个类,每个类中分为输出方法和输出方法,public类中只有main,负责选择模式。尽管我成功的实现了题目和我脑洞的要求,但我总觉得我并没有跳出C面向过程的编程思想。在思考实现方法时并没有考虑整体的框架。希望能在以后的编程中找到真正面向对象编程的思想模式。
这里附上我写的代码:
import java.util.Scanner;
class Number{
private int Number = 0;
void GetInput (){
Scanner scanner = new Scanner(System.in);
System.out.print("Please enter the number:");
Number = scanner.nextInt();
}
void Result (){
int result = (Number%2);
if (result == 1)
System.out.print(Number+" is an odd number!");
else
System.out.print(Number+" is an even number!");
}
}
class Score{
private int Number = 0;
void GetInput (){
Scanner scanner = new Scanner(System.in);
System.out.print("Please enter the Score:");
Number = scanner.nextInt();
while (Number > 100 || Number < 0)
{
System.out.print("Error input.Please enter a number between 0 and 100!");
Number = scanner.nextInt();
}
}
void Result (){
if (Number >= 80)
System.out.print(Number+"!It's Excellent!Is this your scorce?");
else if (Number >= 60)
System.out.print(Number+".Hmm...just so so.");
else
System.out.print(Number+".......I hope this is not yours or you must be kicked ass by your Dad.");
}
}
public class TwoClass{
public static void main (String[] args){
int check1, check2;
String Choice;
Scanner scanner = new Scanner(System.in);
System.out.print("What do you want to do?\nJudege a number is odd or even?Or check a score?\nPlease enter \"Number\" or \"Score\":");
Choice = scanner.next();
check1 = Choice.compareTo("Number");
check2 = Choice.compareTo("Score");
while (check1 != 0 && check2 != 0)
{
System.out.print("Error input.Please enter \"Number\" or \"Score\"");
Choice = scanner.next();
check1 = Choice.compareTo("Number");
check2 = Choice.compareTo("Score");
}
if (check1 == 0){
Number number = new Number();
number.GetInput();
number.Result();
}
else {
Score score = new Score();
score.GetInput();
score.Result();
}
System.out.print("\nBye~");
}
}
正在写的题目是“打印九九乘法表”,一个弱智题目。所以我又作死的开了脑洞,程序运行时应该起到这样的效果:出现提示会出现一些不好的事情->提示按下某个键可以或暂停这个动作->提示按下开始键->疯狂打印乘法表(无限循环)->按下暂停或停止键出现提示问你爽不爽(笑&作死)。
大部分的问题都已经得到了解决(因为都是弱智。。。。),但是唯独“停止循环”这个控制的方法我没有想好,刚开始时我想在循环中添加一个类似于C中sleep()的方法,每打印一次暂停一下检测是否有输入。方法倒是找到了sleep和wait,然而我并没有看懂是怎么使用的。。。。。而且怎样才能在没有输入的情况下强行停止scanner.next方法并进行下一次循环也是个很大的问题。所以这个解决方案被我放弃了。又想了另一个解决方案:使用多线程,一个线程负责进行循环,另一个线程负责监视输入并强制将循环进程暂停。这里有个问题就是我完全没有接触过多线程的只是,而且也不知道两个线程能否互相影响,但感觉这个解决方案比上面那个要靠谱一点。。。。所以还是在有空的时候抽出时间来研究一下Java中的多线程知识吧(我还是在作死。。。。。。希望老师改作业的时候不要给我个零蛋。。。。。。)