Java基础第五节

继承、抽象类、接口

5.1 什么是继承?如何完成一个继承关系?

  1. 面向对象的特征之一。[封装,继承,多态]
  2. 继承是一种通过现有的类,创建出新类的机制。
  3. 继承实际上一种类与类之间关系。

代码说明:

首先有一个基类 Thing

public class Thing {

    public Thing() {
        System.out.println("Everything begins here!");
    }
}

然后有个子类命名为Shape(形状)继承Thing

public class Shape extends Thing {
    public String name = "Shape";
    private static String sname = "S-Shape";

    public Shape() {
        System.out.println("Here is constructor of Shape!");
    }

    public void getName() {
        System.out.println("This is getName of Shape! ");
    }

    public static void getSname() {
        System.out.println("Here is static getName of Shape");
    }
}

然后有个子类命名为Circle(圆)继承Shape

public class Circle extends Shape {

    public String name = "Circle";

    public Circle() {
        System.out.println("This is constructor of Circle!");
    }

    @Override
    public void getName() {
        System.out.println("This is getName of Circle! ");
    }

    public void getSuperName() {
        System.out.println(super.name);
    }

    public static void getSname() {
        System.out.println("Here is static getName of Circle");
    }

}

然后有一个测试类:

public class Test {

    public static void main(String[] args) {
        Shape shape = new Circle();
        System.out.println(shape.name);
        shape.getName();
        Shape.getSname();
        Circle.getSname();
        Circle circle = new Circle();
        circle.getSuperName();
        System.out.println(circle.name);
    }
}

结果:

Everything begins here!
Here is constructor of Shape!
This is constructor of Circle!
Shape
This is getName of Circle! 
Here is static getName of Shape
Here is static getName of Circle
Everything begins here!
Here is constructor of Shape!
This is constructor of Circle!
Shape
Circle

第一句语句

Shape shape = new Circle();

得到的结果是:

Everything begins here!
Here is constructor of Shape!
This is constructor of Circle!

继承的实现:

子类继承父类,在子类构造器生成的时候,会调用父类的构造器,如果没有显示的写出supper(),编译器会默认的给加上supper()无参构造器。如果想调用父类的有参构造器,就必须的显示的调用,编译器不会默认加上的。子类创建的时候,从子类开始一层一层的调用构造方法。

5.2子类对象创建过程?

  1. 子类对象在创建的时候,默认要调用父类无参数的构造方法。
package com.click369.test1;
/**
 * Person类充当了父类
 * @author Administrator
 *
 */
public class Person {

	public  Person(){
		System.out.println("Person类的无参数构造方法");
	}
	
	public  Person(String value){
		System.out.println("Person类的有参数构造方法");
	}
}
package com.click369.test1;
/**
 * Student类就是子类
 * @author Administrator
 *
 */
public class Student extends Person{

	public Student(){
		System.out.println("Student子类的无参数构造方法");
	}
}
Student  stu1=new Student();

  1. 我们可以在子类的构造方法中用过super关键字,调用父类中的任意一个构造方法执行。

    package com.click369.test1;
    /**
     * Person类充当了父类
     * @author Administrator
     *
     */
    public class Person {
    
    	public  Person(){
    		System.out.println("Person类的无参数构造方法");
    	}
    	
    	public  Person(String value){
    		System.out.println("Person类的有参数构造方法,参数是value=="+value);
    	}
    	
    	public  Person(int value){
    		System.out.println("Person类的有参数构造方法,参数是value=="+value);
    	}
    }
    
    package com.click369.test1;
    /**
     * Student类就是子类
     * @author Administrator
     *
     */
    public class Student extends Person{
    
    	public Student(){
    		//super(); //调用父类无参数构造方法
    		super("Student");
    		System.out.println("Student子类的无参数构造方法");
    	}
    }
    Student  stu1=new Student();
    

    总结:子类对象在创建的时候,总是会先调用父类的构造方法创建出父类对象,然后在执行子类的构造方法,创建出子类对象。可以使用super关键字让子类调用指定的父类的构造方法创建父类对象。

5.3Java中子类的继承性?

  1. 子类的继承性是指子类可以从父类中继承那些变量和方法
  2. 子类的继承性与访问限制修饰符有关。

5.4java中的访问限制修饰符

1.访问限制修饰符就是用来限定java元素【类,变量,方法,接口…】,在哪些情况下可以访问,哪些情况不能访问。【保护隐私】

访问限制修饰符分别有:

public【公共的】 private【私有的】 protected【受保护的】 缺省的【友好的】

  1. public【公共的】任何元素都可以访问 [类,变量,方法,接口]
  2. private【私有的】创建者自己可以访问,其他的元素不能访问 [变量,方法]
  3. protected【受保护的】与创建者有关系【继承】的可以访问,没有关系的其他元素不能访问[变量,方法]
  4. 缺省的【友好的】 什么都不写 同一个包中可以访问,不同包就不能访问[类,变量,方法,接口].

2.类上面可以使用public【公共的】和缺省的 访问修饰符。

  1. 被public修饰的类,可以在任何地方被访问。
  2. 被缺省的修饰符修饰的类,只能被同一个包中其他类访问,跨出包就不能访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lw8CxZry-1595577130230)(C:\Users\18373\Desktop\Java基础\Java基础5节\img\访问限制修饰符.png)]

5.5java中的包

  1. 为了方便管理java类。我们在开发应用程序的时候,会编写很多类,而类多了以后不利于管理,所以可以将功能相似的类统一放在一个程序包中,方便管理。
  2. 为了区分名称相同的类。通过隶属于不同的包,来区分名称相同的类。
  3. 包创建的语句所出现的位置,类的首行。
  4. 格式:package 包名;

包名的名称规则:

  1. 合法的标识符
  2. 由多个合法标识符组成,中间通过【.】分割
  3. 不能有大写和空格 Com.Baidu–错误
  4. 公司域名倒置+项目名称【简写】+功能名称

例如: com.baidu.map.test 、 com.baidu.image.service 、com.github.wxpay.sdk

  • com.baidu.map.test—百度公司的地图项目的测试包
  • com.baidu—公司域名倒置
  • map—项目名称【简写】
  • test—功能名称

5.在使用某个包中的类的时候,需要通过import引入类所在的包

  • 类中创建包的语句与定义类的语句之间,通过import引入类所在的包的语句

  • Java.lang包系统会自动引入,我们就不需要手动通过import关键字引入,除过Java.lang包其他的包都是需要import关键字引入。

  • 通过情况下是import 包名+类名; 【只引入这个包中的这个类】

    ​ 例如:import com.click369.test1.TestClass1;

  • 通过情况下是import 包名.*; 【将指定包中的所有类全部引入】

例如:import com.click369.test1.*;

6.在Exlipse开发工具中通过【Ctrl+Shift+o】自动导包。

5.6成员变量的隐藏和方法重写

  1. 在同一个类中,局部变量的名称与成员变量的名称相同。可以通过this.成员变量名称,强制调用,被隐藏的成员变量值。
  2. 在子类中,自己定义的成员变量与继承自父类中的某一个成员变量名称相同。可以通过super.成员变量名称,强制调用,被隐藏的成员变量值。
package com.click369.test1;
public class TestClass {
	public String pub_str="TestClass公共的";
}
package com.click369.test1;

public class TestSonClass extends TestClass{
	//在子类中,自己定义的成员变量与继承自父类中的某一个成员变量名称相同
	public  String  pub_str="zhangsan";
	
	public  void  test1(){
		System.out.println("pub_str=="+pub_str);
		System.out.println("pub_str=="+super.pub_str);
	}
}

5.7上转型对象的含义和特征?

1.定义

子类对象赋值给父类变量---上转型对象

2.例子

package com.click369.test3;
public  class TestClass {
	public  String  getInfo(){
		return "父类的实例方法";
	}
}

package com.click369.test3;
public class SonClass extends TestClass{
	public  String  info(){
		return "子类的实例方法";
	}
}

package com.click369.test3;
public class TestMain {

	public static void main(String[] args) {
		//t1里面保存了父类的对象
		TestClass  t1=new TestClass();
		//父类的对象只能调用父类的方法
		System.out.println(t1.getInfo());
		//s1里面保存了子类的对象
		SonClass  s1=new SonClass();
		//子类的对象可以调用子类自己定义的方法
		System.out.println(s1.info());
		//子类的对象也可以调用从父类继承的方法
		System.out.println(s1.getInfo());
		//上转型对象--子类对象赋值给父类变量
		TestClass  t2=new SonClass();
		//上转型对象,只能调用被子类继承的方法,子类自己的方法就无法调用
		//如果需要上转型对象调用子类自己的方法,将上转型对象强制转换成子类对象
		SonClass s2=(SonClass)t2;
		System.out.println(s2.info());
		System.out.println(t2.getInfo());	
	}
}
  1. 方法参数为父类类型
package com.click369.test3;
public  class TestClass {
	public  String  getInfo(){
		return "父类的实例方法";
	}
}

package com.click369.test3;
public class SonClass extends TestClass{
	public  String  info(){
		return "子类的实例方法";
	}
}

package com.click369.test3;
public class TestMain {
	public  static void testMethod(TestClass tc){
		
	}
	public static void main(String[] args) {
		//1、传递父类的对象
		TestClass  t1=new TestClass();
		testMethod(t1);
		//2、传递子类的对象
		SonClass  s1=new SonClass();
		testMethod(s1);
		//3、传递上转型对象
		TestClass  t2=new SonClass();
		testMethod(t2);
	}
}

特征:

上转型对象不能操作子类新增的成员变量;不能使用子类新增的方法。上转型对象可以操作子类继承或者隐藏的成员变量,也可以使用子类继承的或者重写的方法。上转型对象操作子类继承或重写的方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个方法,则当对象的上转型对象调用这个方法时一定是调用了这个重写的方法

5.8 什么是抽象类?为什么使用抽象类?抽象类中的元素?抽象类的使用?

  1. 什么是抽象类?

    抽象类也是一个类class,使用abstract关键字修饰的类

  2. 格式:访问限制修饰符 abstract class 类名{}

public  abstract  class  TestClass{

}
  1. 为什么使用抽象类?
  • 具体详情请查看: https://www.cnblogs.com/heyonggang/p/3142338.html

  • 提供可由子类实现的公共形式,子类根据自身的特点,按照自己的意图重写构造这个公共形式。

    4.抽象类中的元素

    1、抽象类也是一个类,它可以有实例变量,类变量,构造方法,实例方法,类方法,【抽象方法】

    2、抽象方法–用abstract关键字修饰,没有方法体,能出现在抽象类中。抽象是不能用final修饰的。

package com.click369.test1;
public abstract class TestClass {
	public  int testid=1001;
	public static String  testname="抽象类";
	
	public TestClass(){
		System.out.println("抽象类TestClass的构造方法");
	} 
	
	public  void   testMethod(){
		System.out.println("抽象类中的实例方法");
	}
	
	public static  void   testStaticMethod(){
		System.out.println("抽象类中的类方法");
	}
	//抽象方法
	public  abstract  void  test11();
}

抽象类的特点:

  1. 抽象类不能new,可以通过上转型对象构造出抽象类的对象。
  2. 当一个普通的java类继承一个抽象类以后,要重写抽象类中的抽象方法,否则将这个普通的java类该成抽象类
  3. 抽象类可以继承抽象类。
  4. 抽象类中可以有抽象方法,也可以一个抽象方法都没有。
  5. 抽象类对象调用抽象方法,实际上实在调用被子类重写以后的方法。
package com.click369.test1;
public abstract  class TestClass {
	public  int testid=1001;
	public static String  testname="抽象类";
	
	public TestClass(){
		System.out.println("抽象类TestClass的构造方法");
	} 
	public  void   testMethod(){
		System.out.println("抽象类中的实例方法");
	}
	public static  void   testStaticMethod(){
		System.out.println("抽象类中的类方法");
	}
	//抽象方法
	public  abstract  void  test11();	
}

package com.click369.test1;
public class SonClass extends TestClass{
	public void test11() {
		
	}
}
/*
public  abstract  class SonClass extends TestClass{

}
*/
package com.click369.test1;

public class TestMain {

	public static void main(String[] args) {
		//1.抽象类不能创建对象。
		//TestClass  t1=new TestClass();
		//2.通过上转型对象构造出抽象类的对象
		TestClass  t2=new SonClass();
	}
}

抽象类的意义:

提供可由子类实现的公共形式,子类根据自身的特点,按照自己的意图重写构造这个公共形式。

优点:可以结构化我们的程序,达到代码重用的效果。

5.9 什么是接口?为什么使用接口?接口中的元素?接口的使用?

1. 接口

  • 接口本质与抽象类相似,都是提供可由子类实现的一般形式[公共形式],实现接口的子类可以根据自身的特点来扩展一般形式[公共形式]。

  • 既然接口与抽象类可以实现相同的目的,那么我们已经学习过了抽象类,为什么还要有接口?

  • 因为在java中所有的继承关系都是单继承关系。也就是说一个类只能有一个父类,不能一个类同时继承多个类。为了克服这种单继承关系,所以才用接口。那么也就是说接口是可以被同一个类去实现多个。

  • 接口本质与抽象类的意义相似:

  • 提供去由子类实现的公共形式,子类通过继承/实现抽象类/接口,根据自身的特点重新构造这个公共形式。

为什么有了抽象类还要学习接口?
  • 类与类的继承关系是单继承关系,一个类无法继承多个类,接口的存在就是为了克服类的单继承问题而产生的。因此上一个类是可以实现多个接口的。
接口的使用

​ 通过让类使用implments关键字去实现这个接口,或者多个接口。如果有多个接口中间使用“,”分割。

public   interface   MyInter{
}
public   interface   TestInter{
}
public   class   TestClass   implments   MyInter{ //实现一个接口
}
public   class   TestClass   implments   MyInter,TestInter{//实现多个接口
}

接口中的元素

  1. 接口中所有的变量都是public static final修饰的类变量,可以省略public static final修饰符
  2. 接口中可以有类方法【jdk8.0开始接口被增强可以有静态方法、接口默认方法】
  3. 接口中可以有抽象方法,所有的抽象方法都是public abstract,可以省略public abstract
  4. 接口中的所有的元素都是public修饰符修饰的,除过接口默认方法。
package com.click369.test3;

public interface MyInterface {
	//1.接口中所有的变量都是public static  final修饰的类变量,可以省略public static  final修饰符
	int  num=100;
	public  String  name="zhangsan";
	public static String  address="xian";
	//2.接口是没有构造方法
	//public MyInterface(){}
	//3.接口中没有是实例方法
	//public  void  testMethod(){}
	//4.接口中可以有类方法【jdk8.0开始接口被增强可以有静态方法、接口默认方法】
	public static void  testMethod(){}
	//5.接口中可以有抽象方法,所有的抽象方法都是public  abstract,可以省略public  abstract
	public  abstract void  abstractMethod();
	void  abstractMethod1();
}
//接口中的元素
final修饰的类变量
Static修饰的类方法
public  abstract抽象方法
因为接口中的所有的元素都是public修饰符修饰的,因此上接口继承接口以后,会将父接口中的所有元素全部继承【全继承】
//接口可以继承接口,并且是全继承【接口中中的元素都是public】
public interface TestInterface extends MyInterface{
}

类实现接口

一个普通的类通过implments关键字实现一个或多个接口。需要重写接口中的抽象方法,否则将这个普通的类变成抽象类。
package com.click369.test1;
public interface MyInterface {
 //接口中的所有变量都是public  static  final修饰的静态常量.
 //所以在接口中定义变量的时候,实际上是省略了public  static  final修饰符的。	
 int interid=1001;
 String intername="zhangsan";
 //jdk8.0中接口增强:接口静态方法、接口默认方法。
 public  static void  test2(){
    System.out.println("接口中的静态方法");	 
 }
 public abstract void test3();
}
public class TestClass implements MyInterface{
	public void test3() {	
	}
}
public abstract class TestClass implements MyInterface{
}
//不光是普通的类可以实现接口,抽象类也是可以实现接口。
//接口可以继承接口,继承关系是全继承【子接口会继承父接口中的所有元素】
public interface TestInterface extends MyInterface{
 public abstract void test3();
}

接口回调对象

  • 接口是不能new,通过实现了这个接口的子类去创建接口对象。
  • 接口回调对象与上转型对象相似
  • 上转型对象:子类的对象赋值给父类的变量
  • 接口回调对象:将实现该接口的子类对象赋值给该接口变量。

5.9抽象类与接口的区别?

  1. 抽象类要被子类继承,接口要被类实现。
  2. 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
  3. 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
  4. 接口是设计的结果,抽象类是重构的结果。
  5. 抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
  6. 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
  7. 抽象类主要用来抽象类别,接口主要用来抽象功能。

5.10接口回调对象的含义和特征?

  1. 接口回调对象和实现该接口的子类对象还有接口名称,可以调用接口中的类变量
  2. 接口回调对象和实现该接口的子类对象,都不能调用接口的类方法,只能接口名称去调用接口中的类方法
  3. 接口回调对象和实现该接口的子类对象,可以调用接口中的抽象方法,只不过调用的是被子类重写以后的抽象方法
  4. 接口回调对象是不能调用子类自己定义的变量和方法,子类对象可以调用子类自己定义的变量和方法。

5.11 static \ this \ super \ final关键字?

this关键字
this表示的是当前对象本身,更准确地说,this代表当前对象的一个引用,可以调用该类的属性,方法,构造器。

当在方法内需要用到调用该方法的对象时就可以使用this。

使用this调用成员变量
当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量时类成员
public Persion(String name, int age) {
	this.name = name;
	this.age = age;
}
使用this调用方法。

调用当前对象的其他方法(可以省略)
位置:任意

public void getInfo(){	
	System.out.println("姓名:" + name) ;
	this.speak();
}
public void speak(){
	System.out.println(“年龄:” + this.age);	
}
构造方法中使用this来调用其它构造方法。

位置:必须是第一条语句

public Persion(String name, int age) {
	this.name = name;
	this.age = age;
}
public Persion(String name, int age,double salary) {
	this(name,age);
	this.salary = salary;
}
super关键字
super代表父类的内存空间的标识,这个父类不仅仅指的是子类的直接父类。

使用场景:

  • super可用于访问父类中定义的属性
  • super可用于调用父类中定义的成员方法
  • super可用于在子类构造方法中调用父类的构造器,必须在构造器中的第一句,且不能同时出现this调用本类中其他的构造方法
  • 当子父类出现同名成员时,可以用super进行区分

this和super的区别

区别点thissupper
1访问属性访问本类中的属性,如果本类没有此属性则从父类中继续查找访问父类中的属性
2调用方法访问本类中的方法直接访问父类中的方法
3调用构造器调用本类构造器,必须放在构造器的首行调用父类构造器,必须放在子类构造器的首行
4特殊表示当前对象无此概念
static关键字

static修饰成员变量

  • static修饰的成员变量为静态成员变量 ,或者叫做: 类属性,类变量.注意:static不能修饰局部变量。
  • 它为该类的公用变量,属于类,对于该类的所有对象来说,static成员变量只有一份,被该类的所有对象共享,如果一个对象修改了类变量都将影响其他对象对这个类变量的调用
  • 可以使用”对象.类属性”来调用。不过,一般都是用“类名.类属性”
  • static变量存放在静态域中
static修饰方法
  • static修饰的方法叫静态方法
  • 不需要对象,就可以调用(类名.方法名)
  • 静态方法不能以任何方式引用this和super关键字,因为this,super都是对象的引用,它在内存中是在静态方法加载后出现的,所以无法访问
  • 静态方法中不可以访问非静态变量,非静态方法,只能访问静态变量和静态方法
  • 理解:加载类的时候就加载静态变量和静态方法,此时可能还没有创建对象,所以非静态变量和非静态的方法还没有分配空间,无法访问非静态方法中可以访问静态方法或者静态变量
  • 理解:加载类的时候就已经加载静态变量和静态方法,创建对象后,非静态变量和非静态的方法才分配空间,此时静态变量和静态方法已经存在,可以访问
  • 重载的方法需要同时为static的或者非static的

static修饰代码块

  • 如果希望加载后,对整个类进行某些初始化操作,可以使用static静态代码块。
  • 类第一次被载入时先执行static代码块;类多次载入时,static代码块只执行一次;Static经常用来进行static变量的初始化。
  • 是在类初始化时执行,不是在创建对象时执行
  • 静态初始化块中不能访问非static成员。

static修饰内部类
使用场景:单例模式的实现

public class Singleton {
	private Singleton() {
 
	}
 
	private static class SingletonHolder {
		private final static Singleton instance = new Singleton();
	}
 
	public static Singleton getInstance() {
		return SingletonHolder.instance;
	}
	
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1 == s2);
	}
}
final关键字

1.final修饰变量,成为常量,值不能再变化

--final修饰基本数据类型,值只能赋值一次,后续不能再赋值
--final修饰引用数据类型,不能变化的引用变量的值,可以变化的是对象的属性

2.final修饰方法,不能被子类重写
3.final修饰类,不能再有子类,如String类、StringBuffer、System
4.final不能修饰构造方法

5.static final 修饰的变量是全局静态常量
化块中不能访问非static成员。

static修饰内部类
使用场景:单例模式的实现

public class Singleton {
	private Singleton() {
 
	}
 
	private static class SingletonHolder {
		private final static Singleton instance = new Singleton();
	}
 
	public static Singleton getInstance() {
		return SingletonHolder.instance;
	}
	
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		System.out.println(s1 == s2);
	}
}
final关键字

1.final修饰变量,成为常量,值不能再变化

--final修饰基本数据类型,值只能赋值一次,后续不能再赋值
--final修饰引用数据类型,不能变化的引用变量的值,可以变化的是对象的属性

2.final修饰方法,不能被子类重写
3.final修饰类,不能再有子类,如String类、StringBuffer、System
4.final不能修饰构造方法
5.static final 修饰的变量是全局静态常量

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第 一 章   Java概 述 § 1.1 Java语 言 出 现 的 背景 、 影 响 及 应 用 前 景 一 、 背 景 最 近 一 年 多 来 ,在 Internet上 出 现 的 特 别 吸 引 人 的 事 件 就是 Ja va语 言 和 用 Java编 写 的 浏 览 器 HotJava。 1991年 ,SUN MicroSystem 公 司 的 Jame Gosling、 Bill Joe等 人 , 为 在电视 、 控 制 烤 面 包箱 等 家 用 消 费 电 子 产 品 上 进 行 交 互 式操 作 而 开 发 了 一 个 名为 Oak的 软 件 (即一 种 橡 树 的 名 字 ), 但当 时 并 没 有 引 起 人 们 的 注 意 ,直 到 1994年下 半 年 ,Internet的 迅猛发 展 ,环 球 信 息 网 WWW的 快 速 增 长 ,促 进 了 Java 语 言 研 制 的 进展 ,使 得 它 逐 渐 成为 Int ernet上 受 欢 迎 的 开 发 与 编 程 语 言 ,一 些著 名 的 计 算 机 公司 纷 纷 购 买 了 Java 语言 的 使 用 权 , 如 Mi-croSoft、 IBM、 Netscape、 Novell、 Apple、 DEC、 SGI 等,因 此 ,Java 语言 被 美 国 的 著 名 杂 志 PC Magazine 评 为 1995年 十 大 优 秀科 技 产 品,(计 算 机 就 此 一项 入 选 ),随 之 大 量 出 现 了 用 Java编写 的 软 件 产 品 ,受 到 工 业 界的 重 视 与 好 评 ,认 为 "Java是八 十 年 代 以 来 计 算 机 界 的 一 件 大 事 ", 微 软 总 裁 比 尔 ·盖 茨 在 悄 悄 地 观 察了 一 段 时 间 后 ,不 无感 慨 地 说 :"Java是 长 时 间 以 来 最 卓 越 的 程序 设 计 语 言 ",并确 定 微软 整 个 软 件 开 发 的 战 略 从 PC 单 机 时 代 向 着 以 网 络为中 心 的 计 算 时 代 转 移 ,而 购 买 Java则 是 他 的 重 大 战 略 决 策的实施 部 署 。因 此 ,Java的 诞 生 必 将 对 整 个 计 算 机 产 业 发 生 深远的 影 响,对 传 统 的 计 算 模型 提 出 了 新 的 挑 战 。 SUN MicroSystem 公 司 的 总 裁 Scott McNealy认 为 Java为 Internet和WWW开辟 了 一 个崭 新 的 时 代 . 环 球 信 息 网 WWW的 创 始 人 Berners-Lee说 : "计 算 机 事 业 发展 的下 一 个 浪 潮 就是 Java,并 且 将 很 快 会 发 生 的 "。看 来 ,使 用 Java已 成 大 势 所 趋 ! MicroSoft 和 IBM 两 大 公 司 都 计 划 在 Internet上 销 售 用 Java 编写的 软 件 。 Apple、 HP、 IBM、 MicroSoft、 Novell、 SGI、 SCO、 Tandem 等 公 司均计 划 将 Java并入 各 自 开 发 的 操 作系 统 ,而 负 责 开 发 并 推 广 Java技 术 的 SunSoft公司 (这 是 SUN下 属的 一 个 子 公 司 ), 将 通 过 颁发 许 可 证 的 办 法 来 允 许 各 家 公 司 把Java虚 拟 机 和 Java的Applets库 嵌 入 他 们 开 发 的 操 作 系 统 ,这 样 各 开 发 人 员 就 能更 容易 地 选 择 多种 平 台 来 使 用 Java语 言 编 程 ,不 同 的 用 户 也 就 可以 脱 离 Web浏 览器 来 运 行 Java应 用程 序 ,这 无 疑 是 很 受 广 大 用户 欢 迎 的 ,也 为 Java语 言 的 应 用 开 拓了极为 广 阔 的 前景 。 (当然 ,各 JavaOS之 间 的 兼 容 性 必 须 得 到 重 视 ,好 在JavaSoft已 保证 将 监 督 这种 兼 容 性 )。 另 外 ,由 JavaSoft 推 出 的 完 全 用 Java编 写 的 Internet上 新 型 浏览器 HotJava,比 去 年alpha版 更 为 实 用 ,不 仅 能 编 制 动 态 的 应 用 软件 ,而 且 能 编 制 完整 的 成 套 桌 面 应 用软 件 ,将 来 还 会 提 供 更多 的 能 帮 助 编 制 动 态 应 用 软 件 的 模 块,显 然 ,这 也 是 为 J ava的应 用 提 供 了 有 力 的 例 证 。 今 年 6月 7日 ,由 SUN公 司 和 台 湾 经 济 事 务 部 信 息 发 展 局, 台湾信 息 技 术 研究 所 等 单 位 牵 头 ,成 立 了 一 个 "Java联 盟 ", 参 加 的 有 22个 在 台 湾相 当 著 名 的 计 算 机公 司 ,并 在 台 北 建 立一 个 "Java 开 发 中 心 ",在 新 竹 建 立 一 个 "Java语 言实 验 室 ", 以 掀起 台 湾 开 发 与 应 用 Java 语 言 的 热 潮 。 香 港 则 在 今 年 4月 就 举 行 了 全 岛 的 Java杯 比 赛 ,在 计 算 机界掀 起 了 学 习 Java的热 潮 (尤 其 是 在 大 学 生 们 中 ,出 现 了 一 批 Java迷 )。 有 人 预 言 :Java将 是 网 络 上 的 "世 界 语 ",今 后 所 有的 用 其 他语 言 编 写 的 软 件统 统 都 要 用 Java 语 言 来 改 写 。 二 、 Java 语 言 对 软 件 开 发 技 术 的 影 响 工 业 界 不 少 人 预 言 :"Java 语 言 的 出 现 ,将 会 引 起 一 场软 件革 命 ",这 是 因 为 传统 的 软 件 往 往 都 是 与 具 体 的 实现 环 境 有 关 ,换 了 一 个 环 境 就需 要 作 一 番 改 动 ,耗时 费 力 ,而 Java 语 言 能 在 执 行 码 (二 进 制 码 )上 兼 容 ,这 样 以 前 所开 发 的软 件 就 能 运行 在 不 同 的 机 器 上 ,只 要 所 用 的 机 器 能 提供 Java 语 言 解 释 器 即可 。 Java 语 言 将 对 未 来 软 件 的 开 发 产 生 影 响 , 可 从 如 下 几 个方面 考 虑 : 1 软 件 的 需 求 分 析 :可 将 用 户 的 需 求 进 行 动 态 的 、 可 视化描 述 ,以 提供设 计者 更 加 直 观 的 要 求 。 而 用 户 的 需 求 是 各色 各 样 的 ,不 受 地 区、 行 业 、 部 门 、 爱好 的 影 响 ,都 可 以 用 Java 语 言 描 述 清 楚 。 2 软 件 的 开 发 方 法 :由 于 Java 语 言 的 面 向 目 标 的 特 性 , 所以完 全 可 以 用 O-O的技 术 与 方 法 来 开 发 ,这 是 符 合 最 新 的 软件 开 发 规 范 要 求 的 。 3 Java 语 言 的 动 画 效 果 远 比 GUI技 术 更 加 逼 真 ,尤 其 是 利用WW W提 供 的 巨 大动 画 资 源 空 间 ,可 以 共 享 全 世 界 的 动 态 画面 的 资 源 。 4 软 件 最 终 产 品 :用 Java 语 言   开 发 的 软 件 可 以 具 有 可视化 、 可 听 化 、 可 操作 化 的 效 果 ,这 要 比 电 视 、 电 影 的 效果 更 为 理 想 ,因 为 它 可 以做 到 "即 时 、 交 互、 动 画 与 动作 ",要 它 停 就 停 ,要 它 继 续 就 继 续 ,而 这 是 在 电 影与 电视 播 过 程 中难 以 做 到 的 。 5 其 它 :使 用 Java 语 言 对 开 发 效 益 、 开 发 价 值 都 有 比 较明显 的 影 响 。 三 、 工 业 界 对 Java 语 言 的 评 价 1996年 5月 29 ~ 31日 ,在 美 国 旧 金 山 召 开 了 一 个 全 世 界 Java语言 开 发 者 大 会,(JavaOne Developer Confer-ence),出 席 会 议 的 多 达 6500多 人 ,来 自 工 业界 的 超 过 一 半 ,有人 评 价 说 :"这 是 近年 来 计 算 机 界 最 光 辉 的 一 次 盛 会 ",一 些 工 业 界 的 老 总们 相 当看 好 Java 语 言 ,认 为 它 的 使 用 将 会 引 起 一 场 软 件 革命 。 从 软 件的 设 计 风 格 、 设计 方 法 、 设 计 目 标 到 设 计 过 程 ,都 会 产 生 彻 底 的 变 革 ,"甚 至 会改 变 此 星 球 的 生活 方 式 "。 在 这 次 会 上 ,Java的 创 始 人 之 一 James Gosling 说 :"Java 不仅 仅只 是 applets, 它 能 做任 何 事 情 ",Dta 咨 询 公 司 的 高 级软 件 工 程 师 Rich Kadel说 :"Java 不仅 仅 是 一 种 程 序 设计 语言 ,更 是 现 代 化 软 件 再 实 现 的 基 础 ;Java 还 是 未 来 新 型 OS的核 心 ;将 会 出 现Java 芯 片 ;将 构 成 各 种 应 用 软 件 的 开 发 平 台与 实 现 环 境 ,是 人们 必 不 可 少 的 开 发工 具 "。 由 于 各 界 都 看 好 它 ,因 此 ,各 大 公 司 都 纷 纷 表 示 支 持 Java,Inte l、 Xerox公 司 声 言将 把 Java嵌 入 到 他 们 的 产 品 中 去 。 就 连 华尔 街 金 融 界 也 在 投入 资 金 人 力 用 Java开 发 电 子 贸 易 、 金 融软 件 。 所 以 有 人 说 :"现 在 第 三 方 的 开 发 商 都 团 结 在 Java大旗 周 围了 !",纷 纷 推 出 用Java 开 发 的 各 种 软 件 产 品 ,以 期尽 快 地 占 领 市 场 。 四 、 Java 语 言 的 应 用 前 景 Java 语 言 有 着 广 泛 的 应 用 前 景 ,大 体 上 可 以 从 以 下 几 个方面 来 考 虑 其 应 用 : 1 所 有 面 向 对 象 的 应 用 开 发 ,包 括 面 向 对 象 的 事 件 描 述、处 理 、 综 合 等 ; 2 计 算 过 程 的 可 视 化 、 可 操 作 化 的 软 件 的 开 发 ; 3 动 态 画 面 的 设 计 ,包 括 图 形 图 像 的 调 用 ; 4 交 互 操 作 的 设 计 (选 择 交 互 、 定 向 交 互 、 控 制 流 程 等 ); 5 Internet的 系 统 管 理 功 能 模 块 的 设 计 ,包 括 Web页 面 的 动 态设计 、 管 理 和 交互 操 作 设 计 等 ; 6 Intranet(企 业 内 部 网 )上 的 软 件 开 发 (直 接 面 向 企 业 内 部用户 的 软 件 ); 7 与 各 数 据 库 连 接 查 询 的 SQL 语 句 实 现 ; 8 其 它 应 用 型 的 程 序 。 § 1.2 Java的 特 点 Java是 一 个 广 泛 使 用 的 网 络 编 程 语 言 ,它 是 一 种 新 的 计算概 念 。 首 先 ,作 为 一 种 程 序 设 计 语 言 ,它 简 单 、 面向对象 、 不依 赖于 机 器 的 结 构 、具 有 可 移 植 性 、 鲁 棒 性 、 安 全 性 、 并 且提 供 了 并 发 的 机 制 、具 有 很 高 的 性 能。 其 次 ,它 最 大 限 度 地 利 用 了 网 络 ,Java的小应用程序(applet) 可在网 络 上 传 输 而 不受 CPU和 环 境 的 限 制 。 另 外 ,Java还 提 供 了 丰富 的 库 ,使 程 序 设计 者 可 以 很 方 便地 建 立 自 己 的 系 统 。 下 面 我 们 分 别 从 这 三 个 方 面 来 讨 论 Java的 特 点 ,然 后通 过把 Java与 C,C++相 比进 一 步 指 出 它 所 具 有 的 优 点 。 一 、 Java语 言 Java语 言 有 下 面 一 些 特 点 :简 单 、 面 向 对 象 、 分 布 式 、解释 执 行 、 鲁 棒 、安 全 、 体 系 结 构 中 立 、 可 移 植 、 高 性 能、 多 线 程 以 及 动 态 性。 1.简 单 性 Java语 言 是 一 种 面 向 对 象 的 语 言 ,它 通 过 提 供 最 基 本 的方法 来 完 成 指 定 的任 务 ,只 需 理 解 一 些 基 本 的 概 念 ,就 可 以用 它 编 写 出 适 合 于 各种 情 况 的 应 用 程 序。 Java略 去了 运 算 符重 载 、 多 重 继 承 等 模 糊 的 概 念 ,并 且 通 过实 现 自 动 垃 圾 收集大 大 简 化 了 程 序 设 计 者 的 内 存 管 理 工 作 。 另 外 ,Java也 适合于 在 小 型 机 上 运行 ,它 的 基 本 解 释 器 及 的 支 持 只 有 40KB左右 ,加 上 标 准 库 和线 程 的 支 持 也 只 有 215KB左 右 。 库 和 线程 的 支 持 也 只 有 2 15KB左 右 。 2.面 向 对 象 Java语 言 的 设 计 集 中 于 对 象 及 其 接 口 ,它 提 供 了 简 单 的机 制 以 及 动 态 的接 口 模 型 。 对 象 中 封 装 了 它 的 状 态 变 量以 及 相 应 的 方 法 ,实现 了 模 块 化 和 信 息隐 藏 ;而 则 提 供 了一 对 象 的 原 型 ,并 且 通 过 继 承 机 制 ,子 可 以 使 用 父 所提供 的 方 法 , 实 现 了 代 码 的 复 用 。 3.分 布 性 Java是 面 向 网 络 的 语 言 。 通 过 它 提 供 的 库 可 以 处 理TCP/IP协议 ,用 户 可 以通 过 URL地 址 在 网 络 上 很 方 便 地 访 问 其 它 对 象。 4.鲁 棒 性 Java在 编 译 和 运 行 程 序 时 ,都 要 对 可 能 出 现 的 问 题 进 行检查 ,以 消 除 错 误 的产 生 。 它 提 供 自 动 垃 圾 收 集 来 进 行 内存 管 理 ,防 止 程 序 员 在管 理 内 存 时 容 易 产生 的 错 误 。 通 过集 成 的 面 向 对 象 的 例 外 处 理 机 制 ,在 编 译 时,Java提 示 出 可能 出现 但 未 被 处 理 的 例 外 ,帮 助 程 序 员 正 确 地 进 行 选 择 以防 止 系统 的 崩 溃 。 另 外,Java在 编 译 时 还 可 捕 获 型 声 明 中的 许 多 常 见 错 误 ,防 止 动 态运 行 时 不 匹 配 问题 的 出 现 。 5.安 全 性 用 于 网 络 、 分 布 环 境 下 的 Java必 须 要 防 止 病 毒 的 入 侵 。Java 不 支 持 指 针 ,一切 对 内 存 的 访 问 都 必 须 通 过 对 象 的 实 例 变量 来 实 现 ,这 样 就防 止 程 序 员 使 用 "特洛 伊 " 木 马 等欺 骗 手 段 访 问 对 象 的 私 有 成 员 ,同 时 也 避 免 了指 针 操 作 中容 易 产 生的 错 误 。 6.体 系 结 构 中 立 Java解 释 器 生 成 与 体 系 结 构 无 关 的 字 节 码 指 令 ,只 要 安装了 Java运 行 时 系 统,Java程 序 就 可 在 任 意 的 处 理 器 上 运 行 。这 些 字 节 码 指 令 对 应于 Java虚 拟 机 中 的表 示 ,Java 解 释 器 得到 字 节 码 后 ,对 它 进 行 转 换 ,使 之 能 够 在 不同 的 平 台 运 行 。 7.可 移 植 性 与 平 台 无 关 的 特 性 使 Java程 序 可 以 方 便 地 被 移 植 到 网 络上的 不 同 机 器 。同 时 ,Java 库 中 也 实 现 了 与 不 同 平 台 的 接口 ,使 这 些 库 可以 移 植 。 另 外 ,Java编 译 器 是 由 Java语 言 实现 的 ,Java运 行 时 系 统 由 标 准 C实 现 ,这使 得 Java系 统 本 身 也具有 可 移 植 性 。 8.解 释 执 行 Java解 释 器 直 接 对 Java字 节 码 进 行 解 释 执 行 。 字 节 码 本身携 带 了 许 多 编 译时 信 息 ,使 得 连 接 过 程 更 加 简 单 。 9.高 性 能 和 其 它 解 释 执 行 的 语 言 如 BASIC、 TCL不 同 ,Java字 节 码 的 设计使 之 能 很 容 易地 直 接 转 换 成 对 应 于 特 定 CPU 的 机 器 码 ,从 而得 到 较 高 的 性 能。 10.多 线 程 多 线 程 机 制 使 应 用 程 序 能 够 并 行 执 行 ,而 且 同 步 机 制 保证了 对 共 享 数 据 的正 确 操 作 。 通 过 使 用 多 线 程 ,程 序 设 计 者可 以 分 别 用 不 同 的线 程 完 成 特 定 的 行为 ,而不 需 要 采 用 全 局的 事 件 循 环 机 制 ,这 样 就 很 容 易 地 实 现 网 络 上 的 实 时 交 互行为 。 11.动 态 性 Java的 设 计 使 它 适 合 于 一 个 不 断 发 展 的 环 境 。 在 库 中可以 自 由 地 加 入新 的 方 法 和 实 例 变 量 而 不 会 影 响 用 户 程 序的 执 行 。 并 且Java通 过 接 口 来 支 持 多重 继 承 ,使 之 比 严 格 的 继 承 具 有 更 灵 活 的 方 式 和 扩 展 性 。 二 、 Java Applet Java语 言 的 特 性 使 它 可 以 最 大 限 度 地 利 用 网 络 。 Applet是Jav a的 小 应 用 程序 ,它 是 动 态 、 安 全 、 跨 平 台 的 网 络 应 用 程 序。 Java Applet嵌 入HTML语 言 ,通 过 主页 发 布 到 Internet。 网 络 用 户访 问 服 务 器 的Applet时 ,这些Applet 从网 络 上 进 行 传 输 ,然 后 在支 持 Java 的 浏 览 器 中 运 行 。 由 于 Java语 言 的 安 全 机 制,用 户一 旦 载 入Applet,就 可 以 心 地 来 生 成 多 媒 体 的 用 户 界 面 或完 成 复 杂 的计 算 而 不 必 担 心 病毒 的 入 侵 。 虽 然 Applet可 以 和图 像 、 声 音 、 动 画 等 一 样 从 网 络上 下 载 ,但 它 并 不同 于 这些 多 媒 体 的 文 件 格 式 ,它 可 以 接 收 用 户 的 输 入 ,动 态 地进 行改 变 ,而 不 仅 仅是 动 画 的 显 示 和 声 音 的 播 。 三 、 丰 富 的 Java提 供 了 大 量 的 以 满 足 网 络 化 、 多 线 程 、 面 向 对 象系统 的 需 要 。 1.语 言 包 提 供 的 支 持 包 括 字 符 串 处 理 、 多 线 程 处 理 、例外 处 理 、 数 学 函数 处 理 等 ,可 以 用 它 简 单 地 实 现 Java 程 序的 运 行 平 台 。 2.实 用 程 序 包 提 供 的 支 持 包 括 哈 希 表 、 堆 栈 、 可 变 数组、 时 间 和 日 期 等。 3.输 入 输 出 包 用 统 一 的 "流 "模 型 来 实 现 所 有 格式 的 I/O,包括 文 件 系 统 、 网 络、 输 入 /出 设 备 等 。 4.低 级 网 络 包 用 于 实 现 Socket编 程 。 5.抽 象 图 形 用 户 接 口 包 实 现 了 不 同 平 台 的 计 算 机 的 图形用 户 接 口 部 件 ,包括 窗 口 、 菜 单 、 滚 动 条 、 对 话 框 等 ,使得 Java可 以 移 植 到 不 同平 台 的 机 器 。 6.网 络 包 支 持 Internet的 TCP/IP协 议 ,提 供 了 与 Internet的 接 口。它 支 持 URL连 接,WWW的 即 时 访 问 ,并 且 简 化 了 用 户 /服 务 器 模型 的 程 序 设 计 。 四 、 Java和 C、 C++ 对 于 变 量 声 明 、 参 数 传 递 、 操 作 符 、 流 控 制 等 ,Java 使用了 和 C、 C++相 同的 传 统 ,使 得 熟 悉 C、 C++的 程 序 员 能 很 方 便地 进 行 编 程 。 同 时,Java为 了 实 现 其简 单 、 鲁 棒 、 安 全 等 特性 ,也 摒 弃 了 C和 C++中 许 多 不 合 理 的 内容 。 1.全 局 变 量 Java程 序 中 ,不 能 在 所 有 之 外 定 义 全 局 变 量 ,只 能 通 过在一 个 中 定 义 公用 、 静 态 的 变 量 来 实 现 一 个 全 局 变 量 。例 如 : Class GlobalVar{ public static global_var; } 在 GlobalVar中 定 义 变 量 global_var为 public stat-ic,使 得 其 它可 以 访 问 和 修 改该 变 量 。 Java对 全 局 变 量 进 行 了 更 好 的 封 装 。 而 在 C和 C++中 , 依 赖于不 加 封 装 的 全局 变 量 常 常 造 成 系 统 的 崩 溃 。 2.Goto Java不 支 持 C、 C++中 的 goto语 句 ,而 是 通 过 例 外 处 理 语 句 try,Ca tch, final等 来 代替 C、 C++中 用 goto来 处 理 遇 到 错 误 时 跳 转 的情 况 ,使 程 序 更 可 读且 更 结 构 化 。 3.指 针 指 针 是 C、 C++中 最 灵 活 ,也 是 最 容 易 产 生 错 误 的 数 据 型。 由 指 针 所 进 行的 内 存 地 址 操 作 常 会 造 成 不 可 预 知 的 错误 ,同 时 通 过 指 针 对某 个 内 存 地 址 进 行显 式 型 转 换 后 ,可以 访 问 一 个 C++中 的 私 有 成 员 ,从 而 破 坏 安全 性 ,造 成 系 统 的崩 溃 。 而 Java 对 指 针 进 行 完 全 的 控 制 ,程 序 员 不 能 直 接进行 任 何 指 针 操 作 ,例 如把 整 数 转 化 为 指 针 ,或 者 通 过 指 针释 某 一 内 存 地 址 等 。 同时 ,数 组 作 为 Java中 实 现 ,良 好 地解 决 了 数 组 访 问 越 界 这 一 C、 C++中 不 作 检 查的 错 误 。 4.内 存 管 理 在 C中 ,程 序 员 通 过 库 函 数 malloc()和 free()来 分 配 和 释 内存 , C++中 则 通 过 运算 符 new和 delete来 分 配 和 释 内 存 。 再 次 释 已 释 的 内 存 块或 未 被 分 配 的 内存 块 ,会 造 成 系 统 的 崩溃 ;同 样 ,忘 记 释 不 再 使 用 的 内 存 块 也会 逐 渐 耗 尽 系 统资源 。 而 在 Java中 ,所 有 的 数 据 结 构 都 是 对 象 , 通 过 运 算 符 new为它们 分 配 内 存 堆。 通 过 new得 到 对 象 的 处 理 权 ,而 实 际 分 配 给对 象 的 内 存 可 能随 程 序 运 行 而 改变, Java对 此 自 动 地 进 行 管理 并 且 进 行 垃 圾 收 集 ,有 效 防 止 了 由 于程 序 员 的 误 操 作而导 致 的 错 误 ,并 且 更 好 地 利 用 了 系 统 资 源 。 5.数 据 型 的 支 持 在 C、 C++中 ,对 于 不 同 的 平 台 ,编 译 器 对 于 简 单 数 据 型如in t,float等 分 别 分配 不 同 长 度 的 字 节 数 ,例 如 :int在 IBM PC中为 16位 ,在 VAX-11中 为32位 ,这 导 致 了 代 码的 不 可 移 植 性 ,但 在 Java中 ,对 于 这 些 数 据 型 总 是 分 配 固 定 长 度 的 位 数 ,如 对 int型 ,它 总 占 32位 ,这 就 保 证 了 Java的 平 台 无 关 性 。 6. 型 转 换 在 C、 C++中 ,可 以 通 过 指 针 进 行 任 意 的 型 转 换 ,常 常 带来不 安 全 性 ,而 Java中 ,运 行 时 系 统 对 对 象 的 处 理 要 进 行 型 相 容 性 检 查 ,以 防 止不 安 全 的 转 换 。 7.头 文 件 C、 C++中 用 头 文 件 来 声 明 的 原 型 以 及 全 局 变 量 、 库 函数等 ,在 大 的 系 统中 ,维 护 这 些 头 文 件 是 很 困 难 的 。 而 Java不支 持 头 文 件 , 成 员的 型 和 访 问 权限 都 封 装 在 一 个 中 ,运 行 时 系 统 对 访 问 进 行 控 制 ,防 止 对 私有 成 员 的 操 作 。 同时 ,Java中 用 import语 句 来 与 其 它 进 行 通 讯 ,以 便 使 用它 们 的方法 。 8.结 构 和 联 合 C、 C++中 的 结 构 和 联 合 中 所 有 成 员 均 为 公 有 ,这 就 带 来了安 全 性 问 题 。Java中 不 包 含 结 构 和 联 合 ,所 有 的 内 容 都 封装 在 中 。 9.预 处 理 C、 C++中 用 宏 定 义 来 实 现 的 代 码 给 程 序 的 可 读 性 带 来 了困难 。 在 Java中 ,不 支 持 宏 ,它 通 过 关 键 字 final 来 声 明 一 个 常量 ,以 实 现 宏 定 义中 广 泛 使 用 的 常 量定 义 。 § 1.3 简 单 的 Java程 序 下 面 我 们 先 介 绍 两 个 简 单 的 Java程 序 ,并 对 其 进 行 分 析。 例 1.1. public class HelloWorldApp { //an application public static void main (String args[ ]){ System.out.println("Hello World!"); } } 本 程 序 的 作 用 是 输 出 下 面 一 行 信 息 : Hello World! 程 序 中 ,首 先 用 保 留 字 class来 声 明 一 个 新 的 ,其 名 为Hell oWorldApp,它 是 一 个公 共 (public)。 整 个 定 义 由 大 括 号 {}括起 来 。 在 该 中 定义 了 一 个 main ()方 法 ,其中 public表 示 访 问权 限 ,指 明 所 有 的 都 可 以 使 用 这 一 方 法 ;static指 明 该 方法 是 一 个 方 法 ,它 可 以 通 过 名 直 接 调 用 ;void则 指 明 main()方法 不 返 回 任何 值 。 对 于 一 个 应 用程 序 来 说 ,main()方 法 是 必需 的 ,而 且 必 须 按 照 如 上 的 格 式 来 定义 。 Jave解 释 器 在 没 有生成 任 何 实 例 的 情 况 下 ,以 main()作 为 入 口 来 执 行 程 序 。 Jave程序中 可 以 定 义 多 个 , 每 个 中 可 以 定 义 多 个 方 法 ,但 是 最多 只 能 有 一 个 公 共 ,main()方 法 也 只 能 有 一 个 ,作 为 程 序 的入 口 。 main()方 法 定 义 中 ,括 号 ()中 的 String args[ ]是传 递 给 main()方法 的 参 数 ,参 数 名 为 args,它 是 String的 一 个 实 例 ,参 数 可 以为 0个 或 多 个,每 个 参 数 用 " 名 参数 名 "来 指 定 , 多个 参 数 间 用 逗 号 分 隔 。 在 main()方 法 的 实 现(大 括 号 中 ),只有 一 条 语句 : System.out.println ("Hello World!"); 它 用 来 实 现 字 符串 的 输 出 ,这 条 语 句 实 现 与 C语 言 中 的printf 语 句 和 C++中 cout<<语句 相 同 的 功 能 。 另 外 ,//后 的 内 容 为 注 释 。 现 在 我 们 可 以 运 行 该 程 序 。 首 先 把 它 到 一 个 名 为HelloWor ldApp.java的 文 件 中 ,这 里 ,文 件 名 应 和 名 相 同 ,因 为 Java解释 器 要 求 公 共 必 须 在 与 其 同 名 的 文 件 中。 然 后 对 它 进行 编 译 : C:\>javac HelloWorldApp.java 编 译 的 结 果 是 生 成 字 节 码 文 件 HelloWorldApp.class。最 后 用java 解 释 器 来 运 行 该字 节 码 文 件 : C:\>java HelloWorldApp 结 果 在 屏 幕 上 显 示 Hello World! 我 们 再 来 看 下 面 的 一 个 例 子 : 例 1.2 import java.awr.*; import java.applet.*; public class HelloWorldApplet extends Applet { //an applet public void paint(Graphics g){ g.drawString ("Hello World!",20,20); } } 这 是 一 个 简 单 的 Applet(小 应 用 程 序 )。 程 序 中 ,首 先 用 import语句 输 入 java.awr和java.applet下 所 有 的 包 ,使 得 该 程 序 可 能 使 用这 些 包 中 所 定 义 的 , 它 似 于 C中 的#include 语 句 。 然 后 声明 一 个 公 共 HelloWorldApplet,用 extends指明 它 是 Applet的 子 。 在 中 ,我 们 重 写 父 Ap-plet的 paint()方 法 ,其 中 参 数 g为 Graphics,它表 明 当 前 作 画 的 上下 文 。 在 paint()方 法 中 ,调 用 g的 方 法 drawString(),在坐 标 (20,20)处输 出 字 符 串 ""Hello World!",其 中 坐 标是 用 象 素 点 来 表 示 的 。 这 个 程 序 中 没 有 实 现 main()方 法 ,这 是 Applet与 应 用 程序 Applica tion(如 例 1)的 区 别 之一 。 为 了 运 行 该 程 序 ,首 先 我们 也 要 把它 在 文 件HelloWorldAppl et.java中 ,然 后 对 它 进行 编 译 : C:\>javac HelloWorldApplet.java 得 到 字 节 码 文 件 HelloWorldApplet.class。 由 于 Applet中 没 有main()方法 作 为 Java解 释 器的 入 口 ,我 们 必 须 编 写 HTML文 件 ,把 该 Applet嵌入 其 中 ,然 后 用 appletviewer来 运 行 ,或 在支 持 Java的 浏 览 器 上运 行 。 它 的 <HTML>文 件 如 下 : <HTML> <HEAD> <TITLE> An Applet </TITLE> </HEAD> <BODY> <applet code="HelloWorldApplet.class" width=200 height=40> </applet> </BODY> </HTML> 其 中 用 <applet>标 记 来 启 动 HelloWorldApplet,code指 明字 节 码所在 的 文 件 ,width和height指 明 applet所 占 的 大 小 ,我 们 把 这 个 HTML文件 存 入Example.html,然 后 运 行 : C:\>appleviewer Example.html 这 时 屏 幕 上 弹 出 一 个 窗 口 ,其 中 显 示 Hello World!,显 示 结果如 图 : 从 上 述 例 子 中 可 以 看 出 ,Java程 序 是 由 构 成 的 ,对 于 一个应 用 程 序 来 说 ,必 须有 一 个 中 定 义 main()方 法 ,而 对 applet来说 ,它 必 须 作 为 Applet的一 个 子 。 在 的 定 义 中 ,应 包 含 变 量 的 声 明 和 中 方 法 的 实 现 。 Java在 基 本 数据 型 、 运算 符 、 表达 式 、 控 制 语 句 等 方 面 与 C、 C++基 本 上 是 相 同 的 ,但 它 同 时 也增 加 了 一 些 新 的 内 容 ,在 以 后 的 各 章 中 ,我 们会 详 细 介 绍 。 本 节 中 ,只 是 使 大 家 对Java程 序 有 一 个 初 步 的了解 。 第 二 章   数 据 型 § 2.1 数 据 型 数 据 型 指 明 了 变 量 或 表 达 式 的 状 态 和 行 为 。 Java 的数据 型 如 下 所 示 : Java不 支 持 C、 C++中 的 指 针 型 、 结 构 体 型 和 共 用 体型 。 本 章 我 们 主 要 介 绍 简 单 型 。 § 2.2 常 量 与 变 量 一 、 常 量 Java中 的 常 量 值 是 用 文 字 串 表 示 的 ,它 区 分 为 不 同的 型,如整 型 常 量 123,实 型常 量 1.23,字 符 常 量 ‘ a’ ,布 尔 常 量 true、 false以 及 字 符 串 常 量"This is a constant string."。 与 C、 C++不 同 ,Java中 不 能 通 过 #define命 令 把 一 个 标 识 符 定义为 常 量 ,而 是 用 关键 字 final来 实 现 ,如 final double PI=3.14159( 有 关 final的 用 法 见[6.2.3])。 二 、 变 量 变 量 是 Java程 序 中 的 基 本 存 储 单 元 ,它 的 定 义 包 括 变 量名、 变 量 型 和 作 用 域几 个 部 分 。 ① 变 量 名 是 一 个 合 法 的 标 识 符 ,它 是 字 母 、 数 字 、 下 划线或 美 元 符 "$ "的 序 列,Java对 变 量 名 区 分 大 小 写 ,变量 名 不 能 以 数 字 开 头 ,而 且 不 能为 保 留 字 。 合 法 的 变 量 名如 :myName、 value-1、 dollar$ 等 。 非 法 的 变 量 名 如 : 2mail、room#、 class (保 留 字 )等 ,变量 名 应 具 有 一 定 的 含 义 ,以 增 加 程 序 的可 读 性 。 ② 变 量 型 可 以 为 上 面 所 说 的 任 意 一 种 数 据 型 。 ③ 变 量 的 作 用 域 指 明 可 访 问 该 变 量 的 一 段 代 码 。 声 明一个 变 量 的 同 时 也 就指 明 了 变 量 的 作 用 域 。 按 作 用 域 来 分 ,变 量 可 以 有 下 面 几 种:局 部 变 量 、 变 量 、方 法 参 数 、 例外 处 理 参 数 。 局 部 变 量 在 方 法 或 方 法 的 一 块 码 中 声 明 ,它 的 作 用域 为它 所 在 的 代 码 块 (整 个 方 法 或 方 法 中 的 某 块 代 码 )。 变 量 在 中 声 明 ,而 不 是 在 的 某 个 方 法 中 声 明 , 它的作 用 域 是 整 个 。 方 法 参 数 传 递 给 方 法 ,它 的 作 用 域 就 是 这 个 方 法 。 例 外 处 理 参 数 传 递 给 例 外 处 理 代 码 ,它 的 作 用 域 就 是 例外处 理 部 分 。 在 一 个 确 定 的 域 中 ,变 量 名 应 该 是 唯 一 的 。 通 常 , 一 个域用 大 括 号 {}来 划 定 。 ④ 变 量 的 声 明 格 式 为 : type identifier[=value][,identifier[=value]… ]; 例 如 : int a, b, c; double d1, d2=0.0; 其 中 ,多 个 变 量 间 用 逗 号 隔 开 ,d2=0.0对 实 型 变 量 d2赋 初 值0.0, 只 有 局 部 变 量 和 变 量 是 可 以 这 样 赋 初 值 的 ,而 方 法 参 数和 例 外 处 理 参 数 的 变量 值 是 由 调 用 者 给 出的 。 § 2.3 整 型 数 据 一 、 整 型 常 量 : 与 C,C++相 同 ,Java的 整 常 数 有 三 种 形 式 : ① 十 进 制 整 数 ,如 123,-456,0 ② 八 进 制 整 数 ,以 0开 头 ,如 0123表 示 十 进 制 数 83,-011 表 示十进 制 数 -9。 ③ 十 六 进 制 整 数 ,以 0x或 0X开 头 ,如 0x123表 示 十 进 制 数291,-0X12 表 示 十 进 制 数 -18。 整 型 常 量 在 机 器 中 占 32位 ,具 有 int型 的 值 ,对 于 long 型 值 ,则要 在 数 字 后 加 L或 l,如123L表 示 一 个 长 整 数 ,它 在 机 器 中 占 64位 。 二 、 整 型 变 量 : 整 型 变 量 的 型 有 byte、 short、 int、 long四 种 。 下 表 列 出各 型 所 在 内 存 的 位数 和 其 表 示 范 围 。 int 型 是 最 常 使 用 的 一 种 整 数 型 。 它 所 表 示 的 数 据范围 足 够 大 ,而 且适 合 于 32位 、 64位 处 理 器 。 但 对 于 大 型 计算 ,常 会 遇 到 很 大 的整 数 ,超 出 int型 所 表 示 的 范 围 ,这 时 要使 用 long 型 。 由 于 不 同 的 机 器 对 于 多 字 节 数 据 的 存 储 方 式 不 同 ,可 能是从 低 字 节 向高 字 节 存 储 ,也 可 能 是 从 高 字 节 向 低 字 节 存 储 ,这 样 ,在 分 析 网络 协 议 或 文 件格 式 时 , 为 了 解 决 不 同 机 器上 的 字 节 存 储 顺 序 问 题 ,用 byte 型来 表 示 数 据 是合 适 的 。而 通 常 情 况 下 ,由 于 其 表 示 的 数 据 范 围 很 小 ,容 易 造成 溢 出 ,应 避 免使 用 。 short 型 则 很 少 使 用 ,它 限 制 数 据 的 存 储 为 先 高 字 节 ,后低字 节 ,这 样 在 某些 机 器 中 会 出 错 。 三 、 整 型 变 量 的 定 义 ,如 : byte b; //指定变量b为byte型 short s; //指定变量s为short型 int i; //指定变量i为int型 long l; //指定变量l为long型 § 2.4 浮 点 型 (实 型 )数 据 一 、 实 型 常 量 与 C,C++相 同 ,Java的 实 常 数 有 两 种 表 示 形 式 : ① 十 进 制 数 形 式 ,由 数 字 和 小 数 点 组 成 ,且 必 须 有 小 数点,如 0.123, .123,123.,123.0 ② 科 学 计 数 法 形 式 。 如 :123e3或 123E3,其 中 e或 E之 前 必 须有数 字 ,且 e或 E后面 的 指 数 必 须 为 整 数 。 实 常 数 在 机 器 中 占 64位 ,具 有 double型 的 值 。 对 于 float 型的值 ,则 要 在 数 字后 加 f或 F,如 12.3F,它 在 机 器 中 占 32位 , 且 表示 精 度 较 低 。 二 、 实 型 变 量 实 型 变 量 的 型 有 float和 double两 种 ,下 表 列 出 这 两 种 型所 占 内 存 的 位数 和 其 表 示 范 围 。 数据型 所占位数 数的范围 float 32 3.4e-038~3.4e+038 double 64 1.7e-308~1.7e+308 双 精 度 型 double比 单 精 度 型 float具 有 更 高 的 精 度 和更大 的 表 示 范 围 ,常 常 使 用 。 三 、 实 型 变 量 定 义 ,如 float f; //指 定 变 量 f为 float型 double d; //指 定 变 量 d为 double型 [注 ]与 C、 C++不 同 ,Java中 没 有 无 符 号 型 整 数 ,而 且 明 确 规定了 整 型 和 浮点 型 数 据 所 占 的 内 存 字 节 数 ,这 样 就 保 证 了安 全 性 、 鲁 棒 性和 平 台 无 关 性。 § 2.5 字 符 型 数 据 一 、 字 符 常 量 字 符 常 量 是 用 单 引 号 括 起 来 的 一 个 字 符 ,如 ‘ a’ , ‘ A’。另 外 ,与 C、C++相 同 ,Java也 提 供 转 义 字 符 ,以 反 斜 杠 (\)开 头 ,将其 后 的 字 符转 变 为 另 外 的 含义 ,下 表 列 出 了 Java中 的 转 义 字符 。 与 C、 C++不 同 ,Java中 的 字 符 型 数 据 是 16位 无 符 号 型 数 据 ,它表 示 Unicode集,而 不 仅 仅 是 ASCII集 ,例 如 \u0061表 示 ISO拉 丁 码的 ‘ a’ 。 转义字符 描述 \ddd 1到3位8进制数据所表示的字符(ddd) \uxxxx 1到4位16进制数所表示的字符(xxxx) \' 单引号字符 \\ 反斜杠字符 \r 回车 \n 换行 \f 走纸换页 \t 横向跳格 \b 退格 二 、 字 符 型 变 量 字 符 型 变 量 的 型 为 char,它 在 机 器 中 占 16位 ,其 范 围 为 0~65 535。 字 符 型变 量 的 定 义 如 : char c='a'; //指 定 变 量 c为 char型 ,且 赋 初 值 为 'a' 与 C、 C++不 同 ,Java中 的 字 符 型 数 据 不 能 用 作 整 数 , 因 为Java不提 供 无 符号 整 数 型 。 但 是 同 样 可 以 把 它 当 作 整 数 数 据来 操 作 。 例 如 : int three=3; char one='1'; char four=(char)(three+one);//four='4' 上 例 中 ,在 计 算 加 法 时 ,字 符 型 变 量 one被 转 化 为 整 数 , 进行相 加 ,最 后 把 结果 又 转 化 为 字 符 型 。 三 、 字 符 串 常 量 与 C、 C++相 同 ,Java的 字 符 串 常 量 是 用 双 引 号 ("")括起 来 的一 串 字 符 ,如"This is a string.\n"。 但 不 同 的 是 ,Java中 的 字 符 串 常 量 是 作 为String 的 一 个 对 象 来处 理 的 ,而不 是 一 个 数 据 。 有 关 String,我 们 将 在 第 七 章 讲 述。 § 2.6 布 尔 型 数 据 布 尔 型 数 据 只 有 两 个 值 ,true和 false,且 它 们 不 对 应 于 任何整 数 值 。 在 流 控制 中 常 用 到 它 。 布 尔 型 变 量 的 定 义 如 : boolean b=true; //定 义 b为 布 尔 型 变 量 ,且 初 值 为 true § 2.7 举 例 例 2.1.下 例 中 用 到 了 前 面 提 到 的 数 据 型 ,并 通 过 屏 幕显 示 它 们 的 值 。 public class SimpleTypes{ public static void main( String args[] ){ byte b=0x55; short s=0x55ff; int i=1000000; long l=0xfffL; char c='c'; float f=0.23F; double d=0.7E-3; boolean bool=true; System.out.println("b = "+b); System.out.println("s = "+s); System.out.println("i = "+i); System.out.println("c = "+c); System.out.println("f = "+f); System.out.println("d = "+d); System.out.println("bool = "+bool); } } 编译并运行该程序,输出结果为: C:\>java SimpleTypes b = 85 s = 22015 i = 1000000 l = 4095 c = c f = 0.23 d = 0.0007 bool = true § 2.8 各 数 值 型 数 据 间 的 混 合 运 算 一 、 自 动 型 转 换 整 型 、 实 型 、 字 符 型 数 据 可 以 混 合 运 算 。 运 算 中 , 不同 型 的 数 据 先转 化 为 同 一 型 ,然 后 进 行 运 算 。 转 换 从低 级 到 高 级 ,如 下 图: 转 换 规 则 为 : ① (byte或 short) op int→ int ② (byte或 short或 int) op long→ long ③ (byte或 short或 int或 long) op float→ float ④ (byte或 short或 int或 long或 float) op double→ double ⑤ char op int→ int 其 中 ,箭 头 左 边 表 示 参 与 运 算 的 数 据 型 ,op为 运 算 符 (如加、 减 、 乘 、除 等 ),右 边 表 示 转 换 成 的 进 行 运 算 的 数 据 型。 例2.2 public class Promotion{ public static void main( String args[ ] ){ byte b=10; char c='a'; int i=90; long l=555L; float f=3.5f; double d=1.234; float f1=f*b; // float * byte -> float int i1=c+i;    // char + int -> int long l1=l+i1; // long + int ->ling double d1=f1/i1-d; // float / int ->float, float - double -> double} } 二 、 强 制 型 转 换 高 级 数 据 要 转 换 成 低 级 数 据 ,需 用 到 强 制 型 转 换 ,如 : int i; byte b=(byte)i; //把 int型 变 量 i强 制 转 换 为 byte型 这 种 使 用 可 能 会 导 致 溢 出 或 精 度 的 下 降 ,最 好 不 要 使 用。 第 三 章   运 算 符 和 表 达式 运 算 符 指 明 对 操 作 数 所 进 行 的 运 算 。 按 操 作 数 的 数 目来分 ,可 以 有 一元 运 算 符 (如 ++、--),二 元 运 算 符 (如 +、 >)和 三元 运 算 符 (如?:),它 们 分 别 对 应 于一 个 、 两 个 和 三 个 操 作 数。 对 于 一 元 运 算 符 来 说 ,可 以 有 前缀 表 达 式 (如 ++i )和 后 缀表 达 式 (如 i++),对 于 二 元 运 算 符 来 说 则 采 用 中 缀 表 达 式 (如 a+b)。 按 照运 算 符 功 能 来 分 ,基 本 的 运 算 符 有 下 面 几 : 1.算 术 运 算 符 (+,-,*,/,%,++,--) 2.关 系 运 算 符 (>,<,>=,<=,==,!=) 3.布 尔 逻 辑 运 算 符 (!,&&,||) 4.位 运 算 符 (>>,<<,>>>,&,|,^,~ ) 5.赋 值 运 算 符 (=,及 其 扩 展 赋 值 运 算 符 如 +=) 6.条 件 运 算 符 ( ?:) 7.其 它 (包 括 分 量 运 算 符 · ,下 标 运 算 符 [],实 例 运 算 符 instanc eof,内 存 分 配运 算 符 new,强 制 型 转 换 运 算 符 ( 型 ), 方 法调 用 运 算 符 () 等 ) 本 章 中 我 们 主 要 讲 述 前 6 运 算 符 。 § 3.1 算 术 运 算 符 算 术 运 算 符 作 用 于 整 型 或 浮 点 型 数 据 ,完 成 算 术 运 算。 一 、 二 元 算 术 运 算 符 ,如 下 表 所 示 运算符 用法 描述 + op1+op2 加 - op1-op2 减 * op1*op2 乘 / op1/op2 除 % op1%op2 取模(求余) Java对 加 运 算 符 进 行 了 扩 展 ,使 它 能 够 进 行 字 符 串 的连 接,如 "abc"+"de",得到 串 "abcde"。 我 们 将 在第 七 章 中 讲 解 。 与 C、 C++不 同 ,对 取 模 运 算 符 %来 说 ,其 操 作 数 可 以为浮点 数 , 如37.2%10=7.2。 二 、 一 元 算 术 运 算 符 ,如 下 表 所 示 : 运算符 用法 描述 + +op 正值 - -op 负值 ++ ++op,op++ 加1 -- --op,op-- 减1 i++与 ++i的 区 别 i++在 使 用 i之 后 ,使 i的 值 加 1,因 此 执 行 完 i++后 ,整 个 表达式的 值 为 i,而 i的 值变 为 i+1。 ++i在 使 用 i之 前 ,使 i的 值 加 1,因 此 执 行 完 ++i后 ,整 个 表达式和 i的 值 均 为 i+1。 对 i--与 --i同 样 。 例 3.1.下 面 的 例 子 说 明 了 算 术 运 算 符 的 使 用 public class ArithmaticOp{ public static void main( String args[] ){ int a=5+4; //a=9 int b=a*2; //b=18 int c=b/4; //c=4 int d=b-c; //d=14 int e=-d; //e=-14 int f=e%4; //f=-2 double g=18.4; double h=g%4; //h=2.4 int i=3; int j=i++; //i=4,j=3 int k=++i; //i=5,k=5 System.out.println("a = "+a); System.out.println("b = "+b); System.out.println("c = "+c); System.out.println("d = "+d); System.out.println("e = "+e); System.out.println("f = "+f); System.out.println("g = "+g); System.out.println("h = "+h); System.out.println("i = "+i); System.out.println("j = "+j); System.out.println("k = "+k); } } 其结果为: C:\>java ArithmaticOp a = 9 b = 18 c = 4 d = 14 e = -14 f = -2 g = 18.4 h = 2.4 i = 5 j = 3 k = 5 § 3.2 关 系 运 算 符 关 系 运 算 符 用 来 比 较 两 个 值 ,返 回 布 尔 型 的值true或 false。关 系 运 算 符 都 是 二 元 运 算 符 ,如 下 表 所 示 : 运算符 用法 返回true的情况 > op1>op2 op1大于op2 >= op1>=op2 op1大于或等于op2 < op1<op2 op1小于op2 <= op1<=op2 op1小于或等于op2 == op1==op2 op1与op2相等 != op1!=op2 op1与op2不等 Java中 ,任 何 数 据 型 的 数 据 (包 括 基 本 型 和 组 合 型)都可 以 通 过 ==或!=来 比 较 是 否 相 等 (这 与 C、 C++不 同 )。 关 系 运 算 的 结 果 返 回 true或 false,而不是C、C++中 的 1或 0。 关 系 运 算 符 常 与 布 尔 逻 辑 运 算 符 一 起 使 用 ,作 为 流 控 制语句 的 判 断 条件 。 如 if( a>b && b==c) § 3.3 布 尔 逻 辑 运 算 符 布 尔 逻 辑 运 算 符 进 行 布 尔 逻 辑 运 算 ,如 下 表 所 示 : op1 op2 op1&&op2 op1||op2 !op1 false false false false true false true false true true true false false true false true true true true false } ·&&、‖ 为二元运算符,实现逻辑与、逻辑或。 ·! 为一元运算符,实现逻辑非。 ·对 于 布 尔 逻 辑 运 算 , 先 求 出 运 算 符 左 边 的 表 达 式 的 值 , 对 或 运 算 如 果 为 true, 则 整 个 表 达 式 的 结 果 为 true, 不 必对 运 算 符 右 边 的 表 达 式 再 进 行 运 算 ; 同 样 , 对 与 运 算 , 如果 左 边 表 达 式 的 值 为 false, 则 不 必 对 右 边的 表 达式 求 值 , 整个表 达 式 的 结果 为 false。 下面的例子说明了关系运算符和布尔逻辑运算符的使用。 public class RelationAndConditionOp{ public static void main( String args[] ){ int a=25,b=3; boolean d=a<b; //d=false System.out.println("a<b = "+d); int e=3; if(e!=0 && a/e>5) System.out.println("a/e = "+a/e); int f=0; if(f!=0 && a/f>5) System.out.println("a/f = "+a/f); else System.out.println("f = "+f); } } 其运行结果为: C:\>java RelationAndConditionOp a<b = false a/e = 8 f = 0 注 意 :上 例 中 ,第 二 个 if语 句 在 运 行 时 不 会 发 生 除 0溢 出的错 误 ,因 为 e!=0为false,所 以 就 不 需 要 对 a/e进 行 运 算 。 § 3.4 位 运 算 符 位 运 算 符 用 来 对 二 进 制 位 进 行 操 作 ,Java中 提 供 了 如 下表所 示 的 位 运 算符 : 位 运 算 符 中 ,除   ~   以 外 ,其 余 均 为 二 元 运 算 符 。 操 作 数 只 能 为 整 型 和 字 符 型 数 据 。 3.4.1 补 码 Java使 用 补 码 来 表 示 二 进 制 数 ,在 补 码 表 示 中 ,最 高 位 为符号 位 ,正 数 的 符 号 位 为 0,负 数 为 1。 补 码 的 规 定 如 下 : 对 正 数 来 说 ,最 高 位 为 0,其 余 各 位 代 表 数 值 本 身 (以 二 进制表 示 ),如 +42的补 码 为 00101010。 对 负 数 而 言 ,把 该 数 绝 对 值 的 补 码 按 位 取 反 ,然 后 对 整个数 加 1,即 得 该 数的 补 码 。 如 -42的 补 码 为 11010110 (00101010 按位 取 反 11010101 +1=11010110 ) 用 补 码 来 表 示 数 ,0的 补 码 是 唯 一 的 ,都 为 00000000。 (而 在原码 ,反 码 表 示中 ,+0和 -0的 表 示 是 不 唯 一 的 ,可 参 见 相 应 的书 籍 )。 而 且 可 以用 111111表 示 -1的 补 码 (这 也 是 补 码 与 原 码和 反 码 的 区 别 )。 3.4.2 按 位 取 反 运 算 符 ~ ~   是 一 元 运 算 法 ,对 数 据 的 每 个 二 进 制 位 取 反 ,即 把 1变为 0,把 0变 为 1。 例 如 : 0010101 ~ 1101010 注 意 ,~ 运 算 符 与 - 运 算 符 不 同 ,~ 21≠ -21。 3.4.3 按 位 与 运 算 符 & 参 与 运 算 的 两 个 值 ,如 果 两 个 相 应 位 都 为 1,则 该 位 的 结果为 1,否 则 为 0。即 : 0 & 0 = 0,0 &1 = 0,1 & 0 = 0,1 & 1 = 1
java初学者的学习笔记,很详细。 目录 0 第一节 7月15日 2 一、 IT行业相关介绍 2 二、C、C++和Java语言的比较 2 三、 JDK基础介绍 2 四、 面向对象与面向过程的比较 2 五、 Java相关介绍 2 六、 Path和Classpath执行过程 3 七、 注释方法 3 第二节 7月16日 4 一、 项目流程 4 二、数据型及分 4 三、 变量声明 5 四、 变量与常量的定义 5 五、常量默认型 5 六、 强制数据型转换 5 七、 基本运算符 6 八、 三目条件运算符 6 九、 常用函数归纳 6 第三节 7月20日 7 一、条件语句 7 二、循环语句 8 三、 几个循环的例子 9 第四节 7月21日 10 一、 方法的定义及声明 10 二、 方法的调用 10 三、 方法的重载 11 四、 基本数据型对应的封装 11 五、 几个常用的方法 12 六、 String创建对象的内存分配图 12 七、 字符串中的一些方法及正则表达式 12 第五节 7月22日 14 一、 面向对象 14 二、 14 三、 创建对象 14 四、 实例和静态 15 五、 构造器 15 六、构造器转发 16 七、 静态块 16 第六节 7月23日 16 一、 数组 16 二、冒泡排序 17 三、 二维数组 18 四、指针和引用 18 五、封装 19 六、数组的封装 20 七、Boolean型的封装 20 第七节 7月27日 21 一、 继承 21 二、 Super 21 三、 方法重写 22 四、 多态 23 第八节 7月28日 23 一、toString 23 二、 instanceof实例判断 23 三、final静态 24 四、 抽象 25 五、 面向功能编程 25 六、接口 26 7月29号 第九节 26 一、 设计模式及架构模式 26 二、简单工厂 26 三、单态 28 四、嵌套 29 五、无名内部 30 第十节 7月30日 31 一、 异常 31 二、 方法抛出异常 32 三、 throw 抛出 32 四、 自定异常 32 五、 包 33
Java基础教程课件 Java知识整理 1 把编写好的Java源文件保存起来,原文件的扩展名必须是_________ 用JDK编译Java源程序,使用的命令是_______,编译源¬¬¬¬文件得到字节码文件。 Java源程序编译后生成的字节码文件扩展名为________ 2 一个Java源程序是有若干个_____组成。_____是Java的关键字,用来定义。 3 Java应用程序中有多个Java命令后的名必须是包含了_____方法的那个的名字。 4 一个Java应用程序必须且只有一个含有_____方法 5 在一个Java应用程序中main方法必须被说明为_______________________ 6 Java 中所有程序都使用方法,应用程序以_______方法开始 7 Java源文件中有多个,但只能有一个是_________ 8 Java源程序编译后生成的字节码文件扩展名为___________ 9 用来标识名、变量名、方法名、型名、数组名、文件名的有效字符序列称为________ 10 Java语言规定标识符由字母、下划线、美元符号和数字组成,并且第一个字符不能是__________ 11 ________就是Java语言中已经被赋予特定意义的一些单词,不可以把这词作为名字来用 12 使用关键字_______来定义逻辑变量 13 ________就是Java语言中已经被赋予特定意义的一些单词 14 结构化程序设计的基本数据型包括_________、__________、____________、_____________。 15 Java中byte型数组在内存中的存储形式是________ 16 对于int变量,内存分配____个字节 17 对于byte变量,内存分配____个字节 18 对于long变量,内存分配____个字节 19 对于short变量,内存分配____个字节 20 结构化程序设计的基本数据型包括_______、逻辑型、字符型、浮点型 21 使用关键字________来定义字符变量 22 结构化程序设计的基本数据型包括_______、逻辑型、整数型、浮点型 23 Java中,浮点型变量的型有float和_________两种 24 对于float型变量,内存分配_______个字节 25 对于double型变量,内存分配_______个字节 26结构化程序设计的基本数据型包括_______、逻辑型、整数型、字符型 27 Java使用____________字符集 28 混合运算中不同型的数据先转化为同一型,然后运算,其中不包括__________和字符型 29 混合运算中不同型的数据先转化为同一型,然后运算,其中不包括__________、逻辑型 30 当把级别高的变量的值赋予级别低的变量时,必须使用______________转换 31 Java中关系运算符的运算结果是___________型 32 Java中逻辑运算符的操作元必须是________________型数据 33 整数型数据在内存中以_______________的方式表示 34 Java语言的控制语句有3种型,即________________、________________和转移语句 35 Java中有两种型的控制语句即if和_______________ 36 Java语言的控制语句有3种型,即________________、循环语句和转移语句 37 Java中的语句可分为方法______________、__________________、_________________、______________和package语句和______________语句 38 Java中的语句可分为方法调用语句、表达式语句、复合语句、控制语句、package语句和______________语句 39 在同一个switch语句中,case后的________必须互不相同. 40 do-while循环和while循环的区别是__________________________________________ 41 在循环体中,如果想结束本次循环可以用_______________语句 42 在循环体中,如果想跳出循环,结束整个循环

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值