天天看点

java se基础复习1

Java两种核心机制:java虚拟机垃圾收集机制

源程序(*.java)---java编译器---字节码(*.class)—操作系统平台

Java虚拟机可以理解成一个字节码为机器指令的cpu

对于不同的运行平台,有不同的虚拟机

Java虚拟机制屏蔽了底层运行平台的差别,实现了”一次编译,随处运行”

Java是解释型语言

J2SDK(软件开发包) JRE(java运行环境) 开发需要JDK 用户需要JRE

Bin二进制

Dos中输入java –version现在用的jdk版本

Path:window系统执行命令时要搜寻的路径

Classpath:java在编译和运行时要找的class所在的路径

1.Helloworld.java

Public class HelloWorld{

 Public static void main(String[] args){

System.out.println(“HelloWorld”);

}

d:

cd java//切换到java目录

javac HelloWorld.java

java HelloWorld

详细信息 工具 文件夹 应用到所有文件夹

显示所有文件和文件夹

不隐藏已知文件类型拓展名

在地址栏显示完整路径

类体 方法体

一个原文件中最多有一个public类 每个类对应一个class

源文件的名必须和public类名相同

Java语言注释三种注释方式:

// 

/* */

 /**

*

*/

Java.lang.NoclassDefound

IDE集成开发环境

J2se基础语法

<b>标识符</b>:凡是自己可以起名字的 由字母 下划线 美元符 或数字组成

应以字母,数字,美元符

见名知意

关键字:专门用途,小写英文

<b>Java</b><b>常量</b>:用字符串表示,区分为不同的类型

Eg 整型常量123

   实型常量3.14

   字符常量’a’

   逻辑常量true false

   字符串常量”helloworld”

“常量”这个名词还会用在另外其它语境中表示值不可变的变量参见Final关键字

<b>Java</b><b>变量</b>是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域

Java程序中每一个变量都属于特定的数据类型,在使用前必须对其声明.

从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前<b>必须要先申请</b><b>(</b><b>声明),</b><b>然后必须进行赋值(</b><b>填充内容),</b><b>才能使用</b>.

程序执行过程 load到内存 找到main方法开始执行

执行过程管理<b>:code segment</b><b>存放代码 data segment </b><b>静态变量字符串常量</b>

<b>            Stack</b><b>局部变量 heap new</b><b>出来的东西(</b><b>内存分的四部分)</b>

Java变量的分类

<b>按被声明的位置划分:</b>

局部变量:方法或语句块内部定义的变量(包含方法参数)

成员变量:方法外部,类的内部定义的变量

类外面不能有变量的声明

大括号里声明的变量,出了大括号就没人认识大括号里声明的变量

<b>按所属的数据类型划分:</b>

基本数据类型变量4类8种

逻辑型boolen true false 不可以以0或非0的整数替代

文本型 字符型char \u后边的数是十六进制的编码 \n换行符 \r回车符

整数型 byte1 short1 int4 long8 八进制0开头 十六进制 0x 或0X开头×××默认为int型,声明long型常量可以后加l或L

浮点数型 两种表示形式 十进制 科学记数

Float4 double8 默认double声明float型常量可以后加f或F

引用数据类型变量

基本数据类型转换:boolean不可以转换为其他数据类型

×××,字符型,浮点型在混合运算中相互转换

<b>Infinity</b>无小的转换成大的自动转化 大的转换成小的强制转换

Byte short char 转换成int处理

程序应该主义的问题

1.       大括号对其

2.       遇到{缩进,Tab/shift+Tab

3.       程序块之间加空格

4.       并排语句之间加空格

5.       运算符两侧加空格

6.       {前面有空格

7.       成对编程

运算符

算术运算符 逻辑运算符 赋值运算符 字符串连接符

<b>“+”</b><b>运算符两侧的操作数中只要有一个是字符串类型,</b><b>系统会自动将另一个操作数转换为字符串然后在进行连接</b>

<b>当进行打印的时候,</b><b>无论任何类型都自动转换为字符串进行打印</b>

Print不换行 println换行

<b>表达式</b>

表达式的类型和值 表达式的运算顺序

三目条件运算符 x?y:z x 为boolean类型 为true结果为y 否则为z

<b>语句</b>

条件语句

If

If..else..

If..else if..else..

<b>For</b>循环语句

<b>1+3+5+…+99</b>

public class OddSum{

   long result = 0;

   for(int i=1; i&lt;=99; i+=2){

    result +=i;

System.out.println(“result=”+restult);

}  

Int result=0;

For(int i=1;i&lt;=99;i+=2)

{result+=i}

Tab shift+tab

While do while

Break continue

<b>1 100</b><b>内前5</b><b>个可以被3</b><b>整除的数</b>

<b>输出101 200</b><b>内的质数</b>

应该由哪些类对象

应该具有的属性方法

类和类之间的关系

<b>Static</b><b>关键字</b>

用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份.

可以通过对象引用或类名(不需要实例化)访问静态成员

用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员.静态方法不再是针对于某个对象调用,所以不能访问非静态成员

<b>Package </b><b>和import</b><b>语句</b>

class文件的最上层包的父目录位于classpath下

执行一个类需要写全包名

<b>J2SDK</b>

Java.lang 包含一些java语言的核心类,如string,math,integer,system和thread,提供常用功能

Java.awt 包含了构成抽象窗口工具集的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)

Java.applet包含applet运行所需的一些类

Java.net 包含执行与网络相关的操作的类

Java.io 包含能提供多种输入/输出功能的类

Java.util 包含一些实用工具类,如定义系统特性,使用与日期日历相关的函数

Java.lang不需引入

Dos中打jar包的命令 jar –cvf xx.jar *.*

<b>继承和权限控制</b>

Extends

通过继承,子类自动拥有了基类的所有成员(成员变量和方法)

Java只支持单继承,不允许多继承.一个子类只能有一个基类 一个基类可以派生多个子类

Private 类内部

Default 类内部同一个包

Protected 类内部同一个包子类

Public 类内部同一个包子类任何地方

<b>方法的重写</b>

在子类中可以根据需要从基类中继承来的方法进行重写

重写方法和被重写方法具有相同方法名称,参数列表和返回类型

重写方法不能使用比被重写方法更严格的访问权限

<b>Super</b><b>关键字</b>

在java类中使用super来引用基类的成分,eg 引用方法

<b>继承中的构造方法 </b>

子类的构造过程中必须调用其基类的构造方法

子类可以在自己的构造方法中使用super调用基类的构造方法

 使用this调用本类的另外的构造方法

 如果调用super,必须写在子类构造方法的第一行

如果子类的构造方法中没有显示的调用基类构造方法,则系统默认调用基类无参数的构造方法

如果子类构造方法中既没有显式调用基类构造方法,而基类中又没有无参的构造方法,则编译出错.

<b>Object</b><b>类</b>

<b>Object</b>类是所有java类的根基类

Clone()

equals(Object obj)

finalize()

getClass() 拿到编译好的class文件

hashCode()

notify()

toString() 返回代表这个对象的字符串

<b>toString</b><b>方法</b>

object 类中定义有<b>public String toString()</b>方法,其返回值是String类型,描述当前对象的有关信息.

在进行String与其它类型数据的连接操作是(如:System.out.println)(“info”+person),将自动调用该对象类的toString()方法.

可以根据需要在用户自定义类型中重写toString()方法.

Public class TestToString{

 Dog d = new Dog();

   System.out.println(“d:=”+d.toString);    //object类默认是哈希编码

       }

Class Dog{

       Public String toString(){

Return “I’m a cool Dog!”

哈希编码: 独一无二的代表一个对象.并且通过哈希编码可以独一无二的找到这个对象的位置.

在java虚拟机运行时需找到运行对象的地址,会用一张表记录每一个对象的位置,根据编码可以找到对象.

<b>equals()</b><b>方法</b>

<b>重写Public boolean equals(Object obj){}</b>

public class TestEquals{

 public static void main(String[] args){

Cat c1 = new Cat(1,2,3);

Cat c2 = new Cat(1,2,6);

System.out.println(c1 = c2);     //比较的是引用中的内容,不可能相同

System.out.println(c1.equals(c2));   

//上为object类

//下为string类 string类中的equals方法 序列一样就相等

String s1 = new String(“hello”);

String s2 = new String(“hello”);

System.out.println(s1 ==s2);

System.out.println(s1.equals(s2));

Class Cat{

       Int color;

       Int height,weight;

       public Cat(int color,int height,int weight){

       this.color = color;

this.height = height;

this.weight = weight;

Public boolean equals(Object obj){

       if(obj = = null) return false;

       else{

              if(obj instanceof Cat){

                     Cat c = (Cat) obj;

              If(c.color==this.color&amp;&amp;c.height==this.height&amp;&amp;c.weight ==this.weiget)

              Return true;

Return false;

Object 的equals方法定义为:x.equals(y) 当x和y是同一个对象的应用是返回true否则返回false.

<b>对象转型(casting)</b>

一个基类的引用类型变量可以”指向”其子类的对象.

一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)

可以使用引用变量instanceof 类名 来判断该引用型变量所指向的对象是否属于该类或该类的子类

子类对象可以当做基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting).

<b>动态绑定和多态</b>

动态绑定是指在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.

实际中new的谁就调用谁的方法,实际中的地址才会绑定到相应方法之中的地址上面

多态的条件:

1 有继承 2 有重写 3 父类引用指向子类对象

多态特性对于系统可扩充性有重要影响

<b>抽象类</b>

用abstract关键字来修饰一个类时,这个类叫做抽象类,用abstract来修饰一个方法时,该方法叫做抽象方法.

含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写.

抽象类不能被实例化

抽象方法只需声明,不需实现

Eg:public abstract void enjoy();

<b>Final</b><b>关键字</b>

Final的变量值不能够被改变

Final的成员变量

Final的局部变量(形参)

Final的类不能够被继承

Final的方法不能够被重写

Public class TestFianl{

Public static void main(String[] args){

       T t = new T();

       t.i = 9;

Final Class T{

       Final int t = 8;

       Public final void m(final int j){

Class TT extends T{

 Public void m(){

<b>接口interface</b>

多个无关的类可以实现同一个接口

一个类可以实现多个无关的接口

与继承关系类似,接口与实现类之间存在多态性

接口是抽象方法和常量值的定义的集合

从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现

<b>接口特性</b>

接口可以多重实现

接口中声明的属性默认为public static final 的;也只能是public static final 的;

接口中只能定义抽象方法,而且这些方法默认为public的,也只能是public的;

接口可以继承其它的接口,并添加新的属性和抽象方法.

<b>异常处理</b>

运行期出现的错误

Eg: int[] a = {1,2,3};

   Try{

   System.out..println(arr[4]);

Catch(ArrayIndexOutofBoundsException ar){

       System.out.println(“系统正在维护”);

       ar.printStackTrace();

<b>Java.lang.ArrayIndexOutofBoundsException </b><b>数组下标越界</b>

<b>printStackTrace();</b>

j2sdk中定义了很多异常类

Throwable (1)error 不可处理(2)exception / RuntimeException经常出现的错误,可以捕获也可以不捕获./另一类必须被catch

Try{}

Catch(someException1 e){}

Catch(someException2 e){}

Finally{}//通常在其中进行资源的清除工作

Void f() throws<b> FileNotFoundException,IOException</b>{}

Void f2(){

Try{

f(0);

}catch(FileNotFoundException e){

System.out.println{e.getMessage()}}

 Catch(IOException e){

e.printStackTrace();}

ArithmeticException

Try catch finally throws throw

使用自定义异常一般有如下步骤;

1 通过继承java.lang.Exception类声明自己的异常类

2 在方法适当的位置生成自定义异常的实例,并用throw语句抛出

3 在方法的声明部分用throws语句声明该方法可能抛出的异常

注意:重写方法需要抛出与原方法所抛出异常类型一致异常或不抛出异常

<b>数组</b>

一维数组的声明方式: type var[] 或type[] var

数组对象的创建:

       Java中使用关键字new创建数组对象,格式为:数组名 = new 数组元素的类型 [数组元素的个数]

Eg public class test{

 Public static void main(String args[]){

 Int[] s;

 S = new int[5];

 For(int i = 0; i &lt; 5; i++){

       S[i] = 2*i+1;

注意:数组元素为引用数据类型的数组中的每一个元素都需要实例化.

Public class Test{

 Date[] days;

 days=new Date[3];

 for(int i=0;i&lt;3;i++){

   days[i]=new Date(2004,4,i+1);

class Date{

 int year; int month; int day;

 Date(int y, int m, int d){

 Year = y;

 Moth = m;

 Day = d;

数组初始化

 动态初始化:数组定义与为数组元素分配空间和赋值的操作分开进行.

Eg public class Test{

       Public static void main(String args[]){

        Int a[];

     A = new int[3];

        A[0]=3,a[1]=9,a[2]=8;

     Date days[];

     Days = new Date[3];

     Days[0]=new Date(1,4,2004);

     Days[1]=new Date(2,4,2004);

     Days[2]=new Date(3,4,2004);

Class Date{

 Int year,month,day;

 Date(int y,int m,int d){

 year=y,month=m,day=d;

 静态初始化:在定义数组的同时就为数组元素分配空间并赋值.

Public class test{

 Int a[] = {3,9,8};

 Date days[] = {new Date(1,4,2004), new Date(2,4,2004),new Date(3,4,2004)}

数组元素的默认初始化

数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化.

 Int a[] = new int[5];

 Date[] days = new Date[3];

 System.out.println(a[3]);

 System.out.println(days[2]);

Class date{

 Year=y;

 Month=m;

 Day=d;

输出结果:0,null

数组元素的引用

定义并用运算符new为之分配空间后,才可以引用数组中的每个元素,数组元素的引用方式为:arrayName[index]

Index可以为数组元素下标,可以是×××常量或×××表达式.eg a[3] b[i] c[6*i]

数组元素下标从0开始;长度为n的数组的合法下标取值范围为0~n-1

每个数组都有一个属性length指明它的长度,例如

a.       length的值为数组a的长度(元素个数)

public class TestArray{

 public static void main(String[] args){}

 int[] a = {2,4,6,7,3,5,1,9,8};

 for(int i=0;i&lt;a. .length;i++){

   System.out.println(a[i] + “ ”);

For(int i=0;i&lt;args.length;i++){

 System.out..println(args[i]);

Public class TestArgs{

 If(args.length&lt;3){

 System.out.println(“usage:java Test \”n1\” \”op\” \” n2\””);

 System.exit(-1);     //非正常退出

double d1 = Double.parseDouble(args[0]);

double d2 = Double.parseDouble(args[2]);

double d = 0;

if(args[1].equals(“+”)) d = d1+d2;

else if(args[1].equals(“-”)) d = d1-d2;

else if(args[1].eauals(“×”)) d=d1*d2;

else if(args[1].equals(“/”)) d=d1/d2;

else{

 System.out.println(“Error operator!”);

 System.exit(-1);

System.out.println(d);

*******************

Public class NumSort{

int[] a = new int[args.length];

   //读进来

 for(int i=0;i&lt;args.length;i++){

   a[i] = Integer,parseInt(args[i]);

print(a);

selectionSort(a);

Private static void selectionSort(int[] a){

int k,temp;

 For(int i=0;i&lt;a.length;i++){

   k = i;

 for(int j=k+1;j&lt;a.length;j++){

 If(a[j]&lt;a[k]){

 k = j;

If(k!=i){

temp=a[i];

a[i]=a[k];

a[k]=temp;

Private static void print(int[] a){

 System.out.print(a[i] + “ “);

System.out.println();

 Date[] days = new Date[10];

 Date day = new Date(2004,4,6);

Int year,month,day;

Date(int y,m,d){}

<b>二维数组</b>

可以看成以数组为元素的数组

多维数组的声明和初始化应该按从高维到低维的顺序进行.

Eg int a[][] = new int[3][ ]

   A[0] = new int[2];

   A[1] =new int[4];

   A[2] = new int[3]

<b>数据的拷贝</b>

使用java.lang.System类的静态方法

Public static void arraycopy(object src,int srcPos,object dest,int destPos,int length)

可以用于数组src从第srcPos项元素开始的length个元素拷贝到目标数组从destPos项开始的length个位置.

如果源数据数目超过目标数组边界会抛出IndexOutOfBoundsException异常.

继续阅读