最近在Web安全中的代码审计方面决定转行做Java Web了,因为自己实在是不喜欢PHP这门语言,不喜欢那种混乱的风格和到处出漏洞的感觉,也不想深入学习它,正好最近也听说国内的网站后台绝大部分除了PHP就是Java,再加上自己对Java又非常感兴趣,于是开始学习Java,从Java SE入手了。
学了几天,只想说:Java真香!
Java中与C、C++、JavaScript相同的部分就不在笔记中记录了,学习的主要还是Java与这些语言不同的部分。
Java代码的组成
Java源文件即.java文件,经过javac命令编译后变为.class字节码文件,打包后变为.jar包。
一个Java文件如下(来自“Java300集”中的一个例子,稍微改动了一点):
/**
* 版本2 实现小球沿着任意角度飞行
* @Author N0_NullPointerException
*/
package com.N0.BallGame2;
import java.awt.*;
import javax.swing.*;
public class BallGame2 extends /*extends表示继承某个类*/ JFrame {
//导入小球和球桌的图片
Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.jpg");
double x = 100; //小球初始位置的横坐标
double y = 100; //小球初始位置的纵坐标
double degree = 3.14 / 3; //初始角度:60度
//绘制窗口和小球
public void paint(Graphics g) {
g.drawImage(desk, 0, 0, null);
g.drawImage(ball, (int)x, (int)y, null);
//计算小球的位置
x = x + 10 * Math.cos(degree);
y = y + 10 * Math.sin(degree);
//判断碰到上下边界
if (y > 500 - 40 - 30 || y < 40 + 40) {
degree = -degree;
}
//判断碰到左右边界
if (x < 40 || x > 856 - 40 - 30) {
degree = 3.14 - degree;
}
}
//加载窗口
private void launchFrame() {
setSize(856, 500);
setLocation(50, 50);
setVisible(true);
//重复绘制窗口,大约25次/秒
while (true) {
repaint();
try {
Thread.sleep(40); //40ms画一次
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
System.out.println("running...");
BallGame2 game = new BallGame2();
game.launchFrame();
}
}
package:表示包。Java中包的概念有点类似于文件夹和其它语言中的namespace,采用包是为了方便对源码的管理。包的命名一般是自己域名或者公司名等倒着写,即以com开头。在这个程序段里这条语句的作用是声明这个.java文件从属于com.N0.BallGame2包,package为包的关键字。这条语句必须是整个Java源文件中非注释性语句的第一句。
import:导入一个包。可以通过import关键字导入相关的类。比如import java.awt.*;
就表示导入java.awt包中所有的类。
public class BallGame2:Java是面向对象的语言,一个Java程序是由若干个类组成的,在一个.java文件中只能有一个public的类,其名称与文件名相同,例如这个类所在的文件就应命名为BallGame2.java。类的命名规则是每一个单词的首字母大写。
main方法:main()方法是程序的入口点,也称为“主方法”。String[] args是main方法的参数。
注释:Java有三种注释,分别是文档注释、单行注释和多行注释。
文档注释:以/**
开头,以*/
结束,其中包含与这个.java文件相关的信息和Javadoc的信息。
多行注释:以/*
开头,以*/
结束,可以跨多行,也可以放在一行内做行内注释(比如第十行的行内注释)。多行注释不能嵌套使用。
单行注释:以//
开头到行尾结束,//符号后面的全部都是注释的内容。
Java的基本数据类型
整数类型
Java与C的整数类型差别不大,但是多了以下几种类型:
数据类型 | 占用内存空间 | 取值范围 |
---|---|---|
byte | 8位 | -127~128 |
short | 16位 | -32767~32768 |
long | 64位 | -264~264-1 |
在声明long类型的整数时,需要在后面加上“L”,表示这是一个长整数。
注意:写l或者L都可以,但建议写L,这样便于区分L与大写的i。
浮点类型
与C和C++相同,Java的浮点类型也有float型和double型,在默认情况下小数会被视为double型,如果声明float类型的小数,需要在小数后面加上F(大写或者小写都可以)来说明这是一个float类型的小数。
字符类型
与C和C++相同,Java使用char关键字声明单个字符,声明方法、用法和存储原理与C相同。
布尔类型
使用关键字boolean来定义布尔类型,和C++的bool类型变量一样,boolean类型只有true和false两个可能的取值。
Java循环语句
Java除foreach语句、带标签的break和continue语句之外的选择、循环语句几乎和C++完全相同,就不做记录了。
以下部分来自《Java从入门到精通》
foreach语句
foreach语句是for语句的简化版本,它不能完全代替for语句,但是任何foreach语句都可以改写成for语句。
foreach并不是一个关键字,而是一种特殊的for语句的称呼方法,通常用foreach语句来遍历数组。
语法如下:
for (元素变量x : 遍历对象obj) {
引用了x的java语句;
}
如:
public class Repetition {
public static void main(String[] args) {
int arr[] = { 7, 10, 1 };
System.out.println("一维数组中的元素分别为:");
for (int x : arr) {
System.out.println(x);
}
}
}
带标签的break语句和continue语句
break和continue语句提供了标签功能,类似于C和C++中的goto语句,语法如下:
标签名: 循环体 {
break 标签名;
}
例如:
public class BreakOutNested {
public static void main(String[] args) {
Loop: for (int i = 0; i < 3; i++) {
for (int j = 0; j < 6; j++) {
if (j == 4) {
break Loop;
}
System.out.println("i = " + i + " j = " + j);
}
}
}
}
带标签的continue语句与带标签的break语句用法相同。