JAVA基础学习笔记(一)入门知识

发布于 / 程序猿 / 8 条评论

熟悉JAVA IDE(Eclipse/IDEA)的使用,编写一些简单的小程序。熟悉C++/C语言的话,上手JAVA基础部分还是很快的,多注意一下不同之处。文中若有错误请及时指出,感谢阅读


零、Helloworld

public class Main
{
    public static void main(String[] args)
    {
        System.out.println("Hello, world!");
    }
}

一、常用变量的输入与输出

import java.util.Scanner;

public class Main 
{
    public static void main(String []args){
        Scanner cin = new Scanner(System.in);
        int a = cin.nextInt(); // 整型
        double d = cin.nextDouble(); // 浮点型
        char ch = cin.next().charAt(0); // 字符型
        String s = cin.next(); // 字符串
        System.out.println(a);
        System.out.println(d);
        System.out.println(ch);
        System.out.println(s);
    }
}


二、输出常用格式

public class Main
{
    public static void main(String[] args)
    {
        int i = 100;
        char ch = 'A';
        double d = 9.99999;
        String s = "I LOVE java";
        System.out.printf("Result = %d %c %f %s\n", i, ch, d, s);
    }
}

注意:区别System.out.printlnSystem.out.printSystem.out.printf三种输出。


三、JAVA小程序

说真的,JAVA的小应用程序不好玩。

import java.awt.Graphics;
import java.applet.Applet;

public class SayHello extends Applet 
{
    public void paint(Graphics g)
    {
        g.drawString("Hello, JAVA", 35, 30);
    }
}

我是在Main.class中写这个的,所以编译的时候报了错误:Error:(6, 8) java: 类SayHello是公共的, 应在名为 SayHello.java 的文件中声明。当我把SayHello改成Main的时候它就没有报错了,编译运行后弹出了一个小窗口,也就是java小程序。但是还是有一句警告:警告: 无法读取 AppletViewer 属性文件: /home/taifu/.hotjava/properties。请使用默认值。


四、整型和字符型变量的最值

JAVA字符型变量采用了Unicode编码,数据长度为16位(两个字节),这和C、C++不同(C、C++中char是一个字节占8位)。

public class Main
{
    public static void main(String [] args)
    {
        System.out.println("byte 最大值 = " + Byte.MAX_VALUE); // 8位
        System.out.println("byte 最小值 = " + Byte.MIN_VALUE); 
        System.out.println("short 最大值 = " + Short.MAX_VALUE); // 16位
        System.out.println("short 最小值 = " + Short.MIN_VALUE);
        System.out.println("int 最大值 = " + Integer.MAX_VALUE); // 32位
        System.out.println("int 最小值 = " + Integer.MIN_VALUE);
        System.out.println("long 最大值 = " + Long.MAX_VALUE); // 64位
        System.out.println("long 最小值 = " + Long.MIN_VALUE);
        System.out.println("char 最大值 = " + (int)Character.MAX_VALUE); // 16位
        System.out.println("char 最小值 = " + (int)Character.MIN_VALUE);
    }
}
/*
byte 最大值 = 127
byte 最小值 = -128
short 最大值 = 32767
short 最小值 = -32768
int 最大值 = 2147483647
int 最小值 = -2147483648
long 最大值 = 9223372036854775807
long 最小值 = -9223372036854775808
char 最大值 = 65535
char 最小值 = 0
*/

五、浮点型变量的最值

public class Main
{
    public static void main(String [] args)
    {
//      float f = 3.14; // 错误,值3.14属于double类型,其与变量f不相容
        double d = 3.14; // 正确
        float f = 3.14f; // 正确
        System.out.println("float 最大值 = " + Float.MAX_VALUE);
        System.out.println("float 最小值 = " + Float.MIN_VALUE);
        System.out.println("double 最大值 = " + Double.MAX_VALUE);
        System.out.println("double 最小值 = " + Double.MIN_VALUE);
        System.out.println("float 无限大值 = " + Float.POSITIVE_INFINITY);
        System.out.println("float 无限小值 = " + Float.NEGATIVE_INFINITY);
        System.out.println("double 无限大值 = " + Double.POSITIVE_INFINITY);
        System.out.println("double 无限小值 = " + Double.NEGATIVE_INFINITY);
    }
}
/*
float 最大值 = 3.4028235E38
float 最小值 = 1.4E-45
double 最大值 = 1.7976931348623157E308
double 最小值 = 4.9E-324
float 无限大值 = Infinity
float 无限小值 = -Infinity
double 无限大值 = Infinity
double 无限小值 = -Infinity
*/

六、JAVA原子类型变量生存空间,区别于C、C++

{
    int x = 1;
    {
        int x = 0; // 错误
    }
}

JAVA编译器认为,变量x已经定义过,而C、C++具有”小范围变量屏蔽大范围变量“的能力,但JAVA不提供这种功能。


七、变量初始值问题

未赋初值的变量具有默认值,byte = 0, short = 0, long = 0, int = 0, char = '\u0', float = 0.0f, double = 0.0d, boolean = false但是在方法(函数)内定义的局部变量,应当对其赋值,否则无法通过编译,区别于C++。

注意JAVA中浮点类型(即小数)默认为double类型,要申明为float类型的话要在数后加f。所以float = 3.14是错的,float = 3.14f是对的,double d = 3.14是对的。

class Test
{
    int Value; // 类中的变量未赋初值,默认就是0
}

public class TestVal
{
    public static void main(String [] args)
    {
        int x = 100; // 此处的x必须赋值,否则无法通过编译
    }
}

八、数组

感觉JAVA中int [] a;这种[]放在数组名前以及[]和数组名之间有空格的写法很奇怪,不习惯,还是使用int a[];比较好。

public class Main
{
    public static void main(String [] args)
    {
        // JAVA不允许在定义数组时指定数组的大小。
//        int a[]; // 定义一个数组,a仅仅是一个引用,代表一个数组名,但没有对应的存储空间
//        int[] a; // 同上
//        int a[] = {1, 2, 3}; // 在定义时直接赋值
//        int a[] = new int[10]; // 通过new运算符分配空间
        int a[] = {1, 2, 3}, b[];
        b = a;
        for (int i = 0; i < 3; ++i)
            b[i]++;
        for (int i = 0; i < 3; ++i)
            System.out.print(a[i] + "\t");
    }
}
/*
2   3   4
*/

注意:程序将b数组元素的值分别加1,结果数组a的元素值也发生相应的变化,b=a,实际上是给对象a另起了一个别名b,也就是c++中的引用,当通过b修改元素时,a中的值就变了。

数组长度,使用数组名.length。

public static void test()
    {
        int a[] = new int[6];
        System.out.println("the length of the array =" + a.length);
        for (int i = 0; i < a.length; ++i)
            System.out.print(a[i] + " ");
        System.out.println();
    }
// the length of the array =6
// 0 0 0 0 0 0

二维数组

即由一位数组构成的一维数组。JAVA保证数组一定会被初始化,并对数组提供了下标越界检查机制,即所有下标必须大于等于0且小于等于数组长度减1。如果越界,会报异常信息。JAVA中的数组实际上是对象。

public static void arrays()
{
    int a[][]; // 定义一个引用a
    a = new int[2][]; // 产生a[0]和a[1]两个引用
    a[0] = new int[2]; // 给引用a[0]产生2个对象
    a[1] = new int[3]; // 给引用a[1]产生3个对象
    System.out.println("the length of a =" + a.length);
    System.out.println("the length of a[0] =" + a[0].length);
    System.out.println("the length of a[1] =" + a[1].length);
}
/*
the length of a =2
the length of a[0] =2
the length of a[1] =3
*/
a[0][3] = 100; // Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException

数组初始化

即在为数组的元素分配空间的同时,为每个数组元素赋初始值。JAVA数组必须先初始化,然后才能使用。

  • 静态初始化(只指定数组元素的初始值,不指定数组长度,由系统决定数组的大小)
int a[] = new int[] {10, 20, 30, 40};
int []a = {10, 20, 30, 40};
int a[] = {10, 20, 30, 40}; // good
  • 动态初始化(程序员只指定数组长度,由系统为数组分配初始值)
int a[] = new int[5]; // 数组a中的5个元素的值均为0

注意:不要静态初始化和动态化同时使用,在进行数组初始化时不要既指定长度又赋值。

int a[] = new int[3]{10, 20, 30}; // error
int a[];
a = new int[]{10, 20, 30}; // right
int a[];
a = new int[3]{10, 20, 30}; // error

九、JAVA中的参数传递方式

C++中可以传值和传引用,可以随意选择,JAVA中参数的传递方式也有两种,但是不允许随意选择。

注意JAVA规定基本类型按值传递,对象类型按引用传递。通过return语句从方法中返回时,基本类型总是以值的方式返回,而对象总是以引用方式返回。

class test
{
    int x;
}

public class Main
{
    static test fun(test o, int y) // 对象按引用传递,基本类型按值传递
    {
        o.x = 20; // 修改了对象的数据成员
        y = 1; // 修改了变量y的值
        return o;
    }

    public static void main(String[] args)
    {
        test obj1, obj2;
        int Val = 3;
        obj1 = new test( ); // 产生一个对象
        System.out.println(obj1.x); // 0
        obj1.x = 100;
        System.out.println(obj1.x); // 100
        obj2 = fun(obj1, Val); 
        System.out.println(obj1.x + " " + obj2.x + " " + Val); // 20 20 3
    }
}

JAVA中的关键字NULL代表一个没有分配空间的引用,比如int a[];,a是一个引用,没有空间,值为NULL,同上面程序中处于15行时的对象obj1和obj2。


十、JAVA的运算符

JAVA中的运算符大部分和C、C++一样,用法也相似,我们求同存异

算术运算符

JAVA中的算术运算符:+、-、*、/、%、++和–,与C/C++基本相同。只有%运算符进化了,%运算符不但可以对整形数据运算,而且可以对浮点型数据运算

public class Main
{
    public static void main(String[] args)
    {
        double a = 3.14;
        double b = 0.56;
        double c = a % b;
        System.out.println(c);
//      0.33999999999999986  
    }
}

关系运算符

JAVA关系运算符有>、<、>=、<=、==和!=,它们的运算结果是一个boolean类型的值,要么是true,要么是false,不能同其它类型的变量一同参与运算。

逻辑运算符

JAVA逻辑运算符有&&、|| 和!,分别是与、或和非,运算结果也是一个boolean类型的值,true或false。注意,逻辑运算有求值“短路”现象,具体不解释了,看代码。

public class Main
{
    public static void main(String[] args)
    {
        int a = 1;
        int b = 0;
        boolean f = ((++a > 0) || (++b > 0));
        System.out.println(f);
        System.out.println(a + " " +b);
    }
}
// true
// 2 0

位运算符

JAVA位运算符有&、|、^、~、<<、>>,分别称为位与、或、异或、左移、右移,注意JAVA引入一个专门用于逻辑右移运算符>>>,它采用了所谓的零扩展技术,不论原值是正或负,一律在高位补0。

public class Main
{
    public static void main(String[] args)
    {
        int a = 1;
        int b = 2;
        System.out.println(a | b);
        System.out.println(a & b);
        System.out.println(a ^ b);
        System.out.println(~a);
        System.out.println(a << b);
        System.out.println(a >> b);
        System.out.println(-8 >>> 2);
        System.out.println(8 >>> 2);
    }
}
// 3
// 0
// 3
// -2
// 4
// 0
// 1073741822
// 2

三元条件运算符

就是C、C++中的三目运算符吧,(statement1) ? (statement2) : (statement3)等价于一个if else语句。

public class Main
{
    public static void main(String[] args)
    {
        int a = 1;
        int b = 2;
        int c, d;
        c = a > b ? a + b : a - b;
        if (a > b)
            d = a + b;
        else
            d = a - b;
        System.out.println(c + " " + d);
    }
}
// -1 -1

+运算符

JAVA不允许程序员实现自定义的运算符重载,但JAVA对“+”进行了重载,可以将任何类型的对象(包含原子类型)转化为String类型。

public class Main
{
    public static void main(String[] args)
    {
        int a = 1;
        double d = 9.9;
        char c  = 'A';
        // 编译器会将a、d和c自动转化为各自String临时表示,而不是加在一起
        System.out.println("The result:" + a + d + c); 
        // The result:19.9A
        // 若要实现对a、d和c的求和操作,可以将这三项括起来
        System.out.println("The result:" + (a + d + c));
        // The result:75.9
    }
}

然而,注意一下下面的结果。

public class Main
{
    public static void main(String[] args)
    {
        int a = 1;
        int b = 2;
        System.out.println(a+b); // 3
        System.out.println((a+b)); // 3
        System.out.println(a+""+b); // 12
    }
}

小程序:三角形

import java.awt.*;
import java.applet.Applet;

public class Main extends Applet
{
    public void paint(Graphics g)
    {
        int n = 4;
        int xpos = 0, ypos = 20; // why...
        for (int row = 1; row <= n; ++row)
        {
            xpos = 0;
            for (int cal = 1; cal <= n - row; ++cal)
            {
                g.drawString(" ", xpos, ypos);
                xpos += 20;
            }
            // System.out.println(xpos);
            for (int cal = 1; cal <= 2*row - 1; ++cal)
            {
                g.drawString("*", xpos, ypos);
                xpos += 20;
            }
            System.out.println(xpos);
            ypos += 30;
        }
    }
}


To be continued.
2018-03-19 星期一

转载原创文章请注明,转载自: 太傅 » JAVA基础学习笔记(一)入门知识
  1. TaiFu_S

    吐槽一下JAVA小程序,不好玩 二哈

  2. RYAN0UP

    用Java做界面开发真的很操蛋。

    1. TaiFu_S
      @RYAN0UP

      doge1 话说JAVA入门阶段有没有什么好玩的东西呀

      1. RYAN0UP
        @TaiFu_S

        贪吃蛇,2048 绿帽

  3. zzzzzyyyyzzz

    棒棒棒

    1. TaiFu_S
      @zzzzzyyyyzzz

      谢谢!笑眼

  4. 哈哈

    |´・ω・)ノ,优秀

    1. TaiFu_S
      @哈哈

      巨巨太强了!