类是组成Java程序的基本要素
是一类对象的原型
它封装了一类对象的状态和方法,将变量和函数封装到一个类中
class Person{
String name;
int age;
void sayHello(){
System.out.println("Hello! My name is "+name);
}
}
字段(field)是类的属性,是用变量来表示的 字段又称为(域、域变量、属性、变量成员)等
方法(method )是类的功能和操作,是用函数来表示的
构造方法constructor是一种特殊的方法
用来初始化(new)该类的一个新对象
构造方法和类同名,而且不能返回数据类型,相当于初始化类,类的实例化,成了对象
Person(String n,int a){
name=n;
age=a;
}
一般来说类都有一个或多个构造方法,如果没有定义任何构造方法,系统会自动产生一个构造方法,即默认构造方法
方法重载,有多个方法相同的名字,编译时能识别出来
这些方法可能是参数不同,或者是参数类型不同(和C++差不多)
this 和C++中的类似 当前对象的代替
在构造方法中用this调用另一种构造方法
Person()
{
this(0,"");
.....
}
java里规定 它要写到括号里 其次它要放到最开头,不能放到其他语句后面
继承
子类(subclass) 父类或超类(superclass)
父类包括所有直接或间接被继承的类
JAVA支持单继承:一个类只能有一个直接父类 (和C++不同 相当于简化了)
继承通过extends关键字来实现
class Student extends Person{
......
}
如果没有extends关键字,该类默认为java.lang.Object的子类
所有的类都是通过直接或间接的继承java.lang.Object来得到的
举例 Student 继承Person
class Student extends Person{
String school;//相当于新扩展的变量 java中叫字段
int score;
boolean isGood(){return score>80;}//相当于新扩展的方法
//..
}
在继承过程中,子类可以继承所有父类的字段,可以添加字段,比如上面例子中的school score等,在继承过程中子类会获得父类非私有的方法。如果对父类的方法需要改写,那么重新定义与父类同名的方法,实现对父类方法的覆盖。方法的重载与C++类似,定义重名函数(参数不同),然后调用的时候它会自动找到对应的方法。
如果想调用被覆盖的父类的方法或者变量,可以用super关键字来实现。
综上,JAVA在继承父类时候,它的字段都和父类相同,如果你想更改,和C++类似 重新定义并赋值,实现了对父类的覆盖,如果想要调用父类的变量或者方法的时候,可以 当前对象.super.变量或方法 也可以直接用父类的对象来调用。
Package 包及子包的定义实际上是为了解决 类的名字冲突
它与类的继承没有关系,实际上以个类与其父类可以处于不同的包中
包有两方面的含义:
名字空间,存储路径
可访问性(同一包中的各个类,默认情况下可以相互访问)
包层次的跟目录是由环境变量CLASSPATH来确定的,没有package语句称为无名包
java JDK中提供了很多包,java.applet java.awt java.awt.image java.awt.peer java.io java.lang java.net java.util java.swing等
使用JAVA中提供的类需要用Import导入 格式:import package1[.pacaage2...](classname|*);
例如 import java.util.Date; 这样在程序中 java.util.Date 可以写成Date
import java.awt.* ; 注意使用*只能表示本层次中所有的类,不包括子层次下的类。
JAVA编译器自动导入 java.lang*;
修饰符分为两类 访问修饰符(private/public) 其他修饰符(abstract)
定义类的时候 前面加上public就可以被其他包的访问 如果什么也不加 默认形式,同包可以访问
在设计类的方法的时候,为了提高安全性对于修改的权限最好是private,只读模式还是可靠性高的。
其他修饰符:static final abstract
static:它们是类的字段,不输入任何一个 对象实例(和C语言不同)
它保存在类的内存区域的公共存储单元
类变量可以通过类名直接访问,也可以通过实例对象来访问 ,两种方法一样
如:System类的in out对象,属于类的域直接用类名来访问 即System.in System.out
class Person{
static long totallNum;
int age;
String name;
}
totallNum代表总数 它与具体实例对象无关,可以Person.totallNum 和p.totallNum来访问
在一定意义上可以用来表示全局变量
static的几重含义:
(1)非static得方法是属于某个对象得方法, 在这个对象创建时,对象得方法在内存中拥有自己专用得代码段。而static得方法是属于整个类得,在内存中得代码段将随着类的定义而进行分配和装载,不被任何一个对象专有
(2)static方法 是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,
即static方法只能处理本类中的static域或调用static方法
(3)static方法中,不能访问实例变量,不能用this或super
(4)调用这个方法时,应该使用类名直接调用
final类 如果一个类被final修饰,说明类不能被继承,不可能有用子类
final 方法 final修饰的方法不能被子类所覆写
被static final两个修饰符限定的时候,它可以表示常量
在定义static final域时,若不给定初始值,按照默认初始化 (数值0 boolean为false 引用是null)
在定义final字段时,若不是static域,则不许且只能赋值一次,不能缺省
这种域的赋值方式 1 在定义变量的时候赋值 2在每一个构造函数中赋值
定义final局部变量时,也必须且只能赋值一次
abstract类,抽象类不能被实例化
abstract方法,抽象方法,作用:为所有子类定义一个统一的接口。
抽象方法只需声明,不用实现,用(;)而不是{}格式如下
abstract return Type abstractMethod([paramlist]);
抽象类中可以包含抽象方法,也可以不包含抽象方法,但是,一旦某个类中包含了抽象方法,这个类必须是抽象类
抽象方法在子类中必须被实现,否则子类仍然是抽象的
接口:某种特征的约定
定义接口 interface 所有方法都自动是public abstract
实现接口 implements 可以实现多继承 与类的继承关系无关
面向接口编程,而不是面向实现
Flyable f=new Bird();
Java中有大量的接口
接口作用
1 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系,从而在一定意义上实现了多重继承
2 通过接口可以知名多个类需要的实现的方法
3 通过接口可以了解对象的交互界面,不需了解对象所对应的类
例子
interface Collection
{
void add(Object obj);
void delete(Object obj);
Object find(Object obj);
int size();
}
interface 前面可以解public等修饰符修饰 默认是public
将上面接口抽象为下面统一的形式,接口的定义包括接口声明和接口体两部分
interface Declaration{
intarface Body;
}
最简单的接口声明如下: interface interfaceName{....}
通常接口以able ible 结尾 表明接口能完成一定的行为
接口声明还可以包含对接口的访问权限以及它的父接口列表,完整表达如下:
[public] interface interfaceName[extends listOfSuperInterface]{.....}
punlic表明任意类都可以用这个接口,缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口。
extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能由一个父类。子接口继承父接口中所有的常量和方法
方法定义的格式:
returnType methodName([paramlist]);
接口中只能进行方法的声明,不提供方法的实现,所以定义没有方法体,且用 ; 结尾。
在接口中声明的方法具有public和abstract属性。所以定义的时候这两个关键词是可以省略的
另外,如果在子接口中定义了和父接口同名的常量或相同的方法,则父接口中的常量被隐藏,方法被重载
接口的实现
在类的声明中用implements子句来表示一个类使用某个接口,在类实体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法,一个类可以实现多个接口。
class FIFOQueue Implements collection{
public void add(Object obj){
}
public void delete(Object obj){
}
public Object find(Object obj){
}
public int currentCount{
}
}
在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的完全一致
接口可以作为一种引用类型来使用。任何实现该接口的类的实例都可以存储在该接口类型的变量中,通过这些变量可以访问类所实现的接口中的方法。Java运行时系统动态地确定该使用哪个类中的方法
把接口作为一种数据类型可以不需要了解对象所对应的具体的类,以前面所定义的接口Collection和实现该接口的类FIFOQueue 为例,下例中,我们以Collection作为引用类型来使用
class InterfaceType{//这里相当于是定义了一个接口类
public static void main(String args[]){
Collection c = new FIFOQueue();//从接口的角度理解 相当于c时 这个类的实例化 是一个新对象
...
c.add(obj);
...
}
}
接口中的常量 枚举
接口体中可以包含常量定义
定义格式 type NAME=value;
在接口中定义的常量可以被实现该接口的多个类共享,它于c中用define 以及C++中用const定义的常量是相同的。
在接口中定义的常量常具有public static final的属性
总结:
完整的类的定义 放括号中的是可选项
[public][abstract|final]class className[extends superclassName]
[implements InterfaceNameList]{//类声明 如果多个接口InterfaceNameList 表示用逗号分开的接口
[public|protected|private][static][final][transient][volatile]type varibleName;
//成员变量声明,可以多个 上面关键字 transient volatile和内存访问、线程相关后面会有
[public|protected|private][static][final|abstract][native][synchronized]
//关键词native表明了用c++等其他语言来写的 synchronized和线程有关后面会有
returnType methodName([paramList])//方法定义及实现,可为多个
[throws exceptionList]{//表明抛出什么异常
statements
}
}
接口完整的定义
接口声明
[public]interface InterfaceName[extends superInterfaceList]{//接口声明
type constantName=Value;//常量声明,可为多个
returnType methodName([paramList]);//方法声明 可为多个
}
三种方法固定的声明方式
构造方法
className([paramlist]){
...
}
main()方法声明
public static void main(String args[]){
...
}
finalize()方法声明 析构方法 一般不用
protected void finalize() throws throwable{
...
}
完整的java源文件
package packageName;//指定文件中的类所在的包,0个或1个
import packageName.[className[*]];//指定引入的类 0个或多个
public classDefinition//属性为public的类定义,0个或1 个
interfaceDefinition and classDefinition//接口或类定义,0个或多个
源文件的名字必须与属性为public的类的类名完全相同
在一个java文件中 package语句和public 类最多只能由1个