一、类 class
public class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
void sayHello(){
System.out.println("Hello!");
}
}
1. 属性
a. 字段
也就是成员变量,在构造方法中进行初始化,没有指针的概念,需要访问时直接使用p.name的方法
仍旧可以用this.表示域内的变量
b. 方法
构造方法
constructor,方法名与类名相同,如果不定义构造方法,系统会定义一个默认构造方法
this中还可以使用this调用另一构造方法,如在person类中添加
Person(){
this("lilei", 0); // 这条调用语句要放在第一行
}
方法重载
方法的参数个数或者参数的类型不同,通过重载可以实现多态(polymorphism)
c. 修饰符
访问修饰符()+其他修饰符(abstract等)
访问修饰符
public(非子类、子类、同包类、自身)、protected(子类、同包类、自身)、private(自身),默认(同包类、自身)
字符用private修饰从而更好地封装和隐藏,但是可以用setter和getter暴露出来,bean规范
其他修饰符
static
静态的,可以修饰内部类和成员
不保存在某个对象的内存中,而是存储在公共存储单元中,如System类的in和out
属于整个类,不能操纵某个对象的成员变量,只能调用static域或者static方法
不能访问实例变量,不可以使用this和super
使用类名直接调用static方法
import static
final
最终的,不可改变的,可以修饰类、成员、局部变量
如果修饰类,表示这个类不可以被继承
如果修饰方法,就是不能被子类覆盖的方法
如果修饰字段,那么一旦给定值,就不可以修改,且必须显式赋值(定义时赋值或构造函数总能赋值)
如果修饰局部变量,可以从变量中取值,final a = b;
static final可以表示常量,如Integer.MAX_VALUE,如果不给初始值,就默认进行初始化
abstract
抽象的,不可实例化的,可以修饰类和成员
如果修饰类,该类不可以被实例化,不可以new
如果修饰方法,则不需要实现,只声明即可
如果一个类中包含了抽象方法,那么这个类就要被声明为abstract类,而在子类中实现,如果子类中仍然没有实现,那么子类也需要abstract
2. 继承
class Teacher extends Person{
String school;
String subject;
void teach(){}
}
子类(subclass)、父类或超类(superclass)
父类包括所有直接或间接被继承的类,一个子类只能直接继承于1个类,子类可以继承、修改、添加父类的状态和行为,但是构造方法是不能够被继承的
没有继承关系则类默认为java.lang.Object对象
a. 方法覆盖 Override
@Override
void sayHello(){
System.out.println("Hello everybody!");
}
b. 方法重载
void sayHello(Teacher another){
System.out.println("Hey!");
}
c. super
可以用来访问父类的字段和方法,构造方法不能被继承,但是使用super可以调用父类的构造方法
Teacher(String name, int age, String school){
super(name, age);
...
}
d. 父类子类的转换
子类对象可以视为父类的一个对象
父类对象不能当做子类的对象
如果一个方法的形参是父类对象,调用方法时可以用子类
如果父类引用的实际上是一个子类对象,那么可以强制类型转换为子类对象的引用,如Person liu = new Teacher(xxx);可以使用Teacher wang = (Teacher) liu;
二、包 package
import package[.pkg[.xxxx]]
包实际是为了解决名字空间(存储路径)问题和可访问性问题(同一个包里面的各个类可以互相访问)
包层次的根目录由CLASSPATH决定,如果没有package语句,就是无名包
java编译器自动导入java.lang
javac可以将.class文件放入想用的目录,使用-d指明包的根目录,运行程序时指明含有main的类名
java和javac可以用-classpath指明引用的类的路径,也可以设置系统变量
三、接口 Interface
接口就是一个高度抽象的类,用来描述某种特征,所有的方法都是public abstract,java8以上还可以声明static方法以及具有实现的方法
实现接口时需要使用implements,可以实现多继承,与继承是无关的
面向接口编程而不是面向实现,Interface = new class()
可以实现不相关类的相同特征,通过接口可以指明多个类需要实现的方法
接口中定义的常量可以被实现该接口的多个类共享,通常全部大写
interface Transport{
int INITIAL = 100;
double getSpeed();
}
public Car implements Transport{}
四、语法小结
完整的类的定义
[public] [abstract | final] class [extends ]
[implements] [InterfaceNameList(,分割)]{
[public | protected | private] [static] [final] [transient] [volatile] type variableName;
[public | protected | private] [static] [final | abstract] [native] [synchronized] returnType methodName()[throws]
}
完整的接口的定义
[public] interface InterfaceNmae [extends superInterfaceList]{
type constantName = Value;
returnType methodName();
|
固定声明方式
构造方法
className(){}
main方法
public static void main(String args[])
finalize()方法
protected void finalize() throws throwable{}
完整java文件
package packageName; // 只能有1个
import packageName.xxx.*;
public classDefinition{} // public的类的定义 0或1个
interfaceDefinition and classDefination //0或多个