视频地址:http://tech.163.com/special/00091T71/javashipin.html
包package:
包定义语句必须放在java源文件第一行,也就是在它之前除了空白和注释之外不能有任何其他语句。
包也直接对应着操作系统目录层次结构,所以定义了相应包就必须得定义相应层次的文件夹层次。例如有如下Test.java示例:
package mysite;
class Test
{
public static void main(String [] args)
{
System.out.println("package test successed!");
}
}
假如Test.java在E:/javaLession/Lession3下,这时dos进入到这个目录,执行 javac Test.java,会生成一个test.class编译文件,这时如果继续操作,运行该编译文件:java Test,就会出错,这时必须得手动在E:/javaLession/Lession3下新建一个mysite文件夹,然后把test.class拷贝在这个mysite文件夹下,然后在在E:/javaLession/Lession3下执行 java mysite.Test就运行成功了。
但是如果类比较多,这样手动建立相应文件夹很麻烦,我们可在编译源文件时用javac的-d命令直接生成相应文件夹层次:
在E:/javaLession/Lession3下执行 javac –d . Test.java,编译之后,java会自动生成一个mysite文件夹,并且编译结果生成的class文件Test.class就在这个mysite目录下。
注意:-d后面的点号.意思是在当前目录下生成相应文件目录。
当然我们也可以把编译生成的编译文件放置到其他目录下,例如放到d:盘根目录,可以这样,在E:/javaLession/Lession3下执行 javac –d d:/ Test.java 这时就在d盘生成了mysite目录结构。这时如果想执行d盘中的Test.java文件,则需要将d哦按根目录放进classpath路径中,步骤:
Cmd命令:set classpass=%classpass%;d:/ 就加载进去了。%%中的内容表示之前已经加载的路径。
可以再执行set classpass 查看已经加载的路径。
请注意:因为加了包名的类的全称就是包名+本身类名,所以如果这时进入到mysite目录,然后执行java Test 是行不通的。必须要退到Test.java文件的当前目录,然后执行
java mysite.Test才会成功。
import语句
有包就需要导入。
引入包中的类:import java.io.File;
引入整个包: import java.io.*;
在同一包中可以相互引用类,而无需import语句。
如果你不通过import导入你要使用的其他包中的类的话,那么你就必须使用该类的全称来访问这个类,你说用import是不是很方便呢???
类的说明符
类的访问说明符:
public 如果你想让其他包中的类访问你当前的类,那么就必须给类加上public
当然,当你访问其他包中的类时别忘了用import导入哦。
default 默认情况下,类是只能在当前包中被访问。
类的其他修饰符
final 此关键字表示当前类不能被继承,她是一个最终类。如果你不想类被继承修改,
就用final吧。例如 String 就是一个最终类。
abstract 抽象类
方法说明符:
方法的访问说明符:
(1) Public 不同包中的任何类都可以相互访问
(2) protected 如果一个子类的父类是不同包中的类,但因为父类方法使用了protected
关键字,那么不同包中的子类就可以访问父类的该方法咯。
(3) default 只能在同一包中被访问。例如一个子类的父类是不同包中的类,那么这
个子类都无法访问父类中的默认方法。因为子类和父类分属于不同包中。
(4) private 只能在同一个类中访问,就是子类继承了父类,父类中的私有方法都不
能被继承到子类,所以就是子类也无法访问到父类的私有方法。
方法的其他修饰符:
(1) static 此方法属于类本身,而不是类的某个实例
(2) final 为了保证类在被继承过程中保持不变,不让子类重写父类的好方法就是使
用final关键字。
类中所有private和static方法自然就是final方法哦
(3) abstract 没有方法体的方法就是抽象方法,具体表现就是没有{}和其中内容只有;
注意:抽象方法后一定有一个分号结尾哦!如果类中有抽象方法,那么该类必须申明为抽象类,而且抽象类是不能实例化一个类对象的哦。另外,如果一个子类继承了一个抽象父类,如果这个子类没有实现父类中定义的抽象方法,子类也需申明为抽象类,除非子类实现了所有抽象方法。
抽象类不能产生任何类实例的原因就是防止有没有实现的方法的类产生任何对象。
(4) native 该方法允许用户在java中可以使用,但是不能编写的方法
要了解该方法首先就得明白JNI技术(java native interface)它允许jvm中运行的java代码能够与使用其他编程语言(c,c++等)编写的应用程序和库进行互操作。简单理解为JNI就是java同本地应用程序之间的中介。具体过程要使用到javah.exe编译器,具体就不介绍了。
(5) synchronized 讲多线程时再介绍此修饰符
接口 interface
类中所有方法都是抽象的就叫接口,但是定义接口时用interface 而不是classpath了, 实现接口用implements。
注意:接口中的所有方法默认都是 public sbstract ,所以不用显式写出来。(接口所有变量默认都是public static final)正因为这样所以在实现接口的类中的方法一定要加上public权限符,因为接口中的方法是public的,而实现不可能越实现权限越小塞,所以实现接口的类中方法必须显示声明为public。如果实现接口的类没有完全实现接口中的方法,那么这个类要被声明为abstract哦,因为接口中的方法默认都是抽象的哈。例如:
interface Sport
{
void run();
void jump();
}
class Athlete implements Sport
{
public void run() //注意这里一定要添加public哦,但是类Athlete没有加
{ //public的哦
System.out.println("run");
}
public void jump() //注意这里一定要添加public哦 如果此方法在这里没有被
{ //实现的话,那么Athlete类应该被声明为abstract哦
System.out.println("jump");
}
public static void main (String[] arg)
{
At hlete tom = new Athlete();
tom.run();
}
}
上面代码首先保存为Sport.java文件,然后执行javac javac Sport.java,注意编译的时候是编译的Sport.java文件,然后会生成一个Athlete.class文件,然后运行java Achlete,就会输出“run”了。
下面做一个作业,要求设计一个电脑类,要有主板的显卡、cpu、内存的接口类,然后显卡、cpu、内存类分别要实现他们的厂商名称、型号和价格。
接口变量:
接口所有变量默认都是public static final
关于接口的一些特点:
接口可以继承另一个接口的哦,而且java中可以继承多个接口,多个用,逗号隔开。接口继承还使用extends关键字。
一个类可以实现多个接口,一个类也可以在继承一个类的同时,实现多个接口。
Eg:class tom extends father implements boy,girl{}
内部类:
在一个类中定义另一个类,这个类就叫内部类或内置类(inner class)
内部类的可见性由外部类来控制。下面是个例子:
如果把Inner类定义在Outer类外边,功能也没什么区别,但是如果定义在里边Inner类就可以访问Outer类的私有成员变量private int index了,也就是内部类可以随意访问外部类中所有成员方法和变量。Outer$Inner.class这种就是内部类的命名方式。
注意下面这种情况,结果将打印哪个数呢:
首先:执行javac Outer.java 然后java Test 打印结果是20哦。
那要是我想把内部类和外部类中的index变量都打印出来怎么办呢??只要如下书写就可以了:
class Inner
{
private int index = 50;
void print()
{
int index = 20;
System.out.println(index);
System.out.println(this.index);
System.out.println(Outer.this.index);
}
} //打印结果就为20 50 100
注意:当你想产生一个Inner实例对象怎么办?直接 new一个吗?不行看下面这段代码:
上面这段代码编译时会出现错误吗??编译时提示你23行new关键字处Inner non-static variable不是类的一个静态变量,而main方法又是一个静态的方法,所以你不能这样直接访问它。就像你在Outer类中定义了一个static int index2 = 45;那么这时你就可以在main方法中直接使用了哦例如:prinln(index2);明白了吗?
也就是说这里的Inner类是Outer的一个成员,但是不是静态的,她是属于Outer类的某个实例对象,而不是Outer类本身。所以如果你想产生一个Inner类实例呢,那么就得首先产生一个Outer实例,像这样:
这时就能正常打印了。但是23行处new前一定要加上一个Outer类实例的引用对象outer哦,但是23行处也可改成Inner inner = outer.new Inner();而不要前边的Outer引用,原因是这里main函数能看见Inner。
内部类也可以放在方法中,只是这时内部类的使用范围只能在该方法内部使用。其他地方都看不见了。
内部类也可定义在一个方法体内,但是这时内部类如果要访问该方法的参数或者方法的变量时,必须得把参数和变量申明为final类型,否则编译出错,当然,如果内部类不需要访问该方法的参数或者方法的变量,则无需定义成final类型。例子就不再举了。
上面已经说了,内部类其实就是外部类的一个成员方法,所以能够修饰方法的关键字都能用来修饰内部类,例如可以把内部类修饰成protected、static或者final等。其含义与在方法定义时含义相差无几。当内部类定义成static时,内部类就不能再使用外部类的非静态方法和非静态变量了,但是注意,在静态内部类中可以有静态成员,在非静态内部类中就不能有非静态成员哦,或则是在顶层类中才可以定义静态成员(如果内部类有嵌套,也就是说只有最外部那个类才能定义静态成员)。