C C++基础的Java教程

之前学过C和C++,现在需要学java,感觉零基础的java教程太长太简单了,很想找一个C基础的java教程,但是没有找到特别好的…自己学菜鸟教程的时候就顺便总结了一下。贴上来当个记录吧。

基本语法

类名每个单词首字母大写,MyFirstJavaClass。方法名以小写字母开头,后面的每个单词首字母大写,myFirstJavaFunction。源文件名必须和类名相同。

所有的标识符都应该以字母(A-Z 或者 a-z), $、或者下划线(_)开始,首字符之后可以是字母(A-Z 或者 a-z), $、下划线(_)或数字的任何字符组合。

所有的 Java 程序由 public static void main(String[] args) 方法开始执行。所以一个java文件里可以有很多个类,但是只能有一个 public 类。类的缺省修饰符是default,java文件名是public类类名。

对象,类,包

java包主要用来对类和接口进行分类,同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。

接口interface可以看成是一种抽象类,类似于C++的纯虚类。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。接口之间的继承也用extends关键字,和类的继承相似。

数据类型

byte 数据类型是8位、有符号的,以二进制补码表示的整数;short 数据类型是 16 位、有符号的以二进制补码表示的整数,主要是节省空间。boolean数据类型表示一位的信息,只有两个取值:true 和 false,默认值是false。

所有的数据类型都有对应的包装类,且都是Number类的派生,可以用C.size查看位数,C.minValue查看最小值之类的。Number和Math类,Character,String类有一些很方便的内置方法。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder的方法不是线程安全的(不能同步访问),但是速度快。

Java Number & Math 类 | 菜鸟教程 (runoob)

修饰符

default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

private在同一类内可见。protected对同一包内的类和所有子类可见。他们都不能修饰外部类。

接口里的方法默认情况下访问权限为public。

final 修饰符,用来修饰类、方法和变量,修饰的变量为常量,是不可修改的,修饰的方法不能被继承类重新定义。基本和const一样,除了final修饰的类不能够被继承。

synchronized 和 volatile 修饰符,主要用于线程的编程。synchronized 关键字声明的方法同一时间只能被一个线程访问。volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

运算符

基本和C一样,多一个instanceof,用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)或者被比较的对象是否兼容于右侧类型。boolean result = name instanceof String;

循环

Java5 引入了一种主要用于数组的增强型 for 循环。for(int x : numbers )

for(声明语句 : 表达式):括号内声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。表达式是要访问的数组名,或者是返回值为数组的方法。

数组

建议使用这样的方法声明:double[] myList;。创建用new和枚举方法都可以。java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。

正则表达式

我认为,非常巧妙。正则表达式之于java就像指针之于C。

Java 正则表达式 | 菜鸟教程 (runoob)

finalize()方法

清除回收对象,在这个方法中指定在对象销毁时候要执行的操作。当然,Java 的内存回收可以由 JVM 来自动完成。

public class FinalizationDemo {  
  public static void main(String[] args) {  
    Cake c1 = new Cake(1);  
    Cake c2 = new Cake(2);  
    Cake c3 = new Cake(3);  
      
    c2 = c3 = null;  
    System.gc(); //调用Java垃圾收集器
  }  
}  
 
class Cake extends Object {  
  private int id;  
  public Cake(int id) {  
    this.id = id;  
    System.out.println("Cake Object " + id + "is created");  
  }  
    
  protected void finalize() throws java.lang.Throwable {  
    super.finalize();  
    System.out.println("Cake Object " + id + "is disposed");  
  }  
}
/*output:
Cake Object 1is created
Cake Object 2is created
Cake Object 3is created
Cake Object 3is disposed
Cake Object 2is disposed
*/

IO

Java 的控制台输入由 System.in 完成。

为了获得一个绑定到控制台的字符流,可以把 System.in 包装在一个 BufferedReader 对象中来创建一个字符流。

BufferedReader br = new BufferedReader(new 
                      InputStreamReader(System.in));

BufferedReader 对象创建后,可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。

也可以使用Scanner 类来获取用户的输入。

控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。

PrintStream 继承了 OutputStream类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

int variable = 10;
System.out.write(variable);
System.out.println("this is a string:" + variable +"!");

读写文件:

//用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f = new FileInputStream("C:/java/hello"); 

//先使用 File() 方法来创建一个文件对象 然后读取文件:
File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);

//写文件类似:
OutputStream f = new FileOutputStream("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);
//InputStream对象和OutputStream对象包含一些流操作方法

继承

可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object。

public class A extends B

public interface A{...}
public interface B{...}
public class C implements A,B{...}

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

更多推荐

C C++基础的Java教程