Schalal

Java基础

参考资源

概述

Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言,可运行于多个平台,如Windows, MacOS,及UNIX等版本的系统。

其主要特性有:

主要特性

基本语法

Java修饰符

Java的对象和类

类中的类型变量:(与C++一致)

构造方法:与类名一致,可以声明多个,如:

public class Puppy{
   int puppyAge;
   public Puppy(String name){
      // 这个构造器仅有一个参数:name
      System.out.println("Passed Name is :" + name ); 
   }

   public void setAge( int age ){
       puppyAge = age;
   }

   public int getAge( ){
       System.out.println("Puppy's age is :" + puppyAge ); 
       return puppyAge;
   }

   public static void main(String []args){
      /* 创建对象 */
      Puppy myPuppy = new Puppy( "tommy" );
      /* 通过方法来设定age */
      myPuppy.setAge( 2 );
      /* 调用另一个方法获取age */
      myPuppy.getAge( );
      /*你也可以像下面这样访问成员变量 */
      System.out.println("Variable Value :" + myPuppy.puppyAge ); 
   }
}

继承:extends关键字,Java 只支持单继承,也就是说,一个类不能继承多个类,e.g.

// A.java
public class A {
    private int i;
    protected int j;
    public void func() {
    }
}
// B.java
public class B extends A {
    public int z;
    public void fund(){
    }
}

Java中的重写(Override)和重载(Overload)是两个不同的概念。

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变,其好处在于子类可以根据需要,定义特定于自己的行为。当需要在子类中调用父类的被重写方法时,要使用 super 关键字。

重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。

Java中同样有抽象类和抽象方法的概念,与C++中抽象类和纯虚函数的概念一致,即:抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。声明抽象方法会造成以下两个结果:如果一个类包含抽象方法,那么该类必须是抽象类。任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

源文件命名规则: 当在一个源文件中定义多个类,并且还有​import​语句和​package​ 语句时,要特别注意这些规则。


```Java
//文件一,Employee.java
import java.io.*;
public class Employee{
   String name;
   int age;
   String designation;
   double salary;
   // Employee 类的构造器
   public Employee(String name){
      this.name = name;
   }
   // 设置age的值
   public void empAge(int empAge){
      age =  empAge;
   }
   /* 设置designation的值*/
   public void empDesignation(String empDesig){
      designation = empDesig;
   }
   /* 设置salary的值*/
   public void empSalary(double empSalary){
      salary = empSalary;
   }
   /* 打印信息 */
   public void printEmployee(){
      System.out.println("Name:"+ name );
      System.out.println("Age:" + age );
      System.out.println("Designation:" + designation );
      System.out.println("Salary:" + salary);
   }
}
//文件二,EmployeeTest.java
//程序都是从 ​main​方法开始执行。为了能运行这个程序,必须包含 ​main​ 方法并且创建一个实例对象。
import java.io.*;
public class EmployeeTest{

   public static void main(String args[]){
      /* 使用构造器创建两个对象 */
      Employee empOne = new Employee("James Smith");
      Employee empTwo = new Employee("Mary Anne");

      // 调用这两个对象的成员方法
      empOne.empAge(26);
      empOne.empDesignation("Senior Software Engineer");
      empOne.empSalary(1000);
      empOne.printEmployee();

      empTwo.empAge(21);
      empTwo.empDesignation("Software Engineer");
      empTwo.empSalary(500);
      empTwo.printEmployee();
   }
}

数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型(byte, short, long, int),两个浮点型(float, double)),一种字符类型(char),还有布尔型(boolean)。

引用类型变量由类的构造函数创建,可以使用它们访问所引用的对象。这些变量在声明时被指定为一个特定的类型,比如Employee、Pubby等。变量一旦声明后,类型就不能被改变了。对象、数组都是引用数据类型。所有引用类型的默认值都是null。

常量:以final关键字标识,如final double PI=3.1415926

数据运算

(只挑需要注意的)

(假设A=60(00111100),B=13(00001101)) |操作符|描述|例子| |:—-:|:—-:|:—-:| |&|按位与操作符,当且仅当两个操作数的某一位都非0时候结果的该位才为1。|(A&B),得到12,即0000 1100| |||按位或操作符,只要两个操作数的某一位有一个非0时候结果的该位就为1。| (A|B)得到61,即 0011 1101| |^|按位异或操作符,两个操作数的某一位不相同时候结果的该位就为1。|(A^B)得到49,即 0011 0001| |~|按位补运算符翻转操作数的每一位。|(~A)得到-61,即1100 0011| |« |按位左移运算符。左操作数按位左移右操作数指定的位数。|A « 2得到240,即 1111 0000| |» |按位右移运算符。左操作数按位右移右操作数指定的位数。|A » 2得到15即 1111| |»> |按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。|A»>2得到15即0000 1111|

也支持三元运算符(?:)、+=这种赋值运算符,还有一个instanceof运算符(该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型),如boolean x=y instanceof z

循环与条件语句

除了一般的与C/C++完全一致的三种循环体(while、do…while和for)外,还有一种主要用于数组的循环体(称为for…each循环):

for(type element: array)
{
   //代码句子
}

if…else的语句用法与C/C++也是完全一致的,支持switch…case语句,也与C/C++也是完全一致。

基本类

IO基础

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。Java为I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。

控制台输入:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

java.util.Scanner是Java5的新特征,我们可以通过 Scanner 类来获取用户的输入。e.g.:

import java.util.Scanner; 

public class ScannerDemo {  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in); 
		// 从键盘接收数据  

		//next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        if(scan.hasNext()){   
        	String str1 = scan.next();
         //next()方法:以空格为终止字符;
         //nextLine()方法:以Enter为终止字符
        	System.out.println("输入的数据为:"+str1);  
        }  

    }  
} 

控制台的输出由 print() 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。 PrintStream 继承了 OutputStream 类,并且实现了方法 write()。这样,write() 也可以用来往控制台写操作。

文件流:InputStream f = new FileInputStream("C:/java/hello");OutputStream f = new FileOutputStream("C:/java/hello"),还有一些关于文件和 I/O 的类,我们也需要知道:File Class、FileReader Class、FileWriter Class。

异常

可以使用try...catch...finally语句来针对异常进行处理;使用throws/throw来抛出异常,e.g.

public class className
{
   public void deposit(double amount) throws RemoteException
   {
      // Method implementation
      throw new RemoteException();
   }
   //Remainder of class definition
}

接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。

接口与类相似点:

接口与类的区别:

接口的声明

可见度 interface 接口名称 [extends 其他的类名] {
        // 声明变量
        // 抽象方法
}

接口有以下特性:

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。一个接口可以继承多个接口,e.g.public interface Hockey extends Sports, Event

类使用implements关键字实现接口,一个类可以实现多个接口。在类声明中,Implements关键字放在class声明后面。... 类名 ... implements 接口名称[, 其他接口, 其他接口..., ...]{...}

标识接口:标识接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。标识接口作用:简建立一个公共的父接口;向一个类添加数据类型。

包(package)

为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。包的作用:

e.g. package pkg1[.pkg2[.pkg3…]];

导入包:import package1[.package2…].(classname|*);

类放在包中会有两种主要的结果:

泛型(类似于C++的模板)

序列化

【待理解】

多线程

【待理解】