定义类
[修饰符] class 类名
{
零到多个构造器定义..
零到多个Field…
零到多个方法…
}
修饰符
- public
- protected
- private
- static
- final
- abstract
abstract和final最多只能出现其中之一,可以与static组合起来修饰方法
构造函数
与类名同名的函数,不带返回类型。
对象、引用和指针
public class Person
{
public String name;
public int age;
public void say(String content){
System.out.println(content);
}
}
Person p; //p变量,放在栈内存里
p=new Person(); //Person对象放在堆内存里
类也是一种引用数据类型,因此程序中定义的Person类型的变量实际上是一个引用,它被存放在栈内存里,指向实际的Person对象,而真正的Person对象则存放在堆(heap)内存中。
栈内存里的引用变量并未真正存储对象的Field数据,对象的Field数据实际存放在堆内存里。
当一个对象被创建成功以后,这个对象将保存在堆内存中,Java程序不允许直接访问堆内存中的对象,只能通过该对象的引用操作该对象。不管是数组还是对象,都只能通过引用来访问它们。
堆内存里的对象可以有多个引用,即多个引用变量指向同一个对象。如接上面的程序:
Person p2=p;
如果堆内存里的对象没有任何变量指向该对象,那程序将无法再访问该对象,这个对象就变成了垃圾,Java的垃圾回收机制将回收该对象,释放该对象所占的内存区。
因此,如果希望通知垃圾回收机制回收某个对象,只需切断该对象的所有引用变量和它之间的关系即可,也就是把这些引用变量赋值为null。
对象的this引用
this关键字总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的默认引用有两种情形:
- 构造器中引用该构造器正在初始化的对象
- 在方法中引用调用该方法的对象
this关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或Field。
在static修饰的方法里不能使用this引用。
Java语法规定:静态成员不能直接访问非静态成员。
有些时候this可以省略。
Java允许使用对象来调用static修饰的Field方法,但应避免这样使用。
方法
- Java的方法参数传递只有一种方式:值传递
形参个数可变的方法
public class Varargs{
public static void test(int a,String... books)
{
for(String tmp : books)
{
System.out.println(tmp);
}
}
public static void main(String[] args)
{
test(5,"疯狂Java讲义","ABC");
}
}
递归方法
略
方法重载
略
成员变量和局部变量
略
隐藏和封装
略
package、import 和 import static
JDK1.5后新增引入静态成员:
import static java.lang.Math.*;
引入所有静态Field和方法
继承
super限定
如果需要在子类方法中调用父类被覆盖的实例方法,则可使用super限定来调用父类被覆盖的实例方法:
public void callOverrideMethod()
{
super.fly();
}
多态
Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。如果编译与运行时类型不一到处,就可能出现所谓的多态(Polymorphism)
instanceof运算符
instanceof运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的对象是否是后面的粝,或者其子类,实现类的实例。
继承与组合
初始化块
初始化块是Java类里可出现的第4种成员,一个类里可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化后执行
public class Person
{
{
; //先执行
}
{
; //2
}
public Person()
{
; //3
}
public static void main(String[] args)
{
new Person();
}
}
初始化块只在创建Java对象时隐匿执行,而且在构造函数之前执行。
静态初始化块
在类初始化阶段执行静态初始化块,因此比普通初始化块先执行。
静态初始化块会一直上溯到顶父类静态初始化类先执行,最后才执行该类的静态初始化块。