面向对象的三大特征:继承、封装和多态。
类是某一类事物的描述,是抽象的、概念上的定义,
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)
“==“用来比较两个引用变量的值是否相等,equals方法是比较两个对象中的内容是否相等。
private的访问权限为同一个类内部才能进行访问
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
垃圾回收器方法:System.gc();
在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
静态方法不能以任何方式引用this和super关键字(super关键字在下一章讲解)。与上面的道理一样,因为静态方法在使用前不用创建任何实例对象,当静态方法被调用时,this所引用的对象根本就没有产生。
main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例对象,因而在main()方法中,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在以后的例子中会多次碰到。
内部类的方法能够访问外部类中的成员变量,而外部类中的方法不能访问内部类中的成员变量。
内部类被外部引用
class Outer
{
private int size=10;
public class Inner
{
public void doStuff()
{
System.out.println(++size);
}
}
}
public class TestInner
{
public static void main( String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.doStuff();
}
}
final关键字
final标记的类不能被继承。
final标记的方法不能被子类重写。
final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
方法中定义的内置类只能访问该方法内的final类型的局部变量,用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期,将一个形参定义成final也是可以的,这就限定了我们在方法中修改形式参数的值。
public static final共同标记常量时,这个常量就成了全局的常量。
抽象类:
抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰
interface(接口)
接口中的成员都是public访问类型的。接口里的变量默认是用public static final标识的 。
我们可以定义一个新的接口用extends关键字去继承一个已有的接口
我们也可以定义一个类用implements关键字去实现一个接口中的所有方法,我们还可以去定义一个抽象类用implements关键字去实现一个接口中定义的部分方法。
一个类可以继承一个父类的同时,实现一个或多个接口,extends关键字必须位于implemnets关键字之前
对象的类型转换:
instanceof操作符可以用来判断一个实例对象是否属于一个类
多线程:
如果我们对某个线程对象在启动之前调用了setDaemon(true)方法,这个线程就变成了一个后台线程。
对java程序来说,只要还有一个前台线程运行,这个进程就不会结束,如果一个进程中只有后台线程运行,这个进程就会结束。
pp.join()的作用是把pp所对应的线程合并到调用pp.jion();语句的线程中。
多线程中主要要注意两个方面的问题:线程安全和线程间的通信。
使用关键字synchronized保证多线程访问共享资源或方法时的协作和有序。
使用wait()方法迫使当前正在执行的线程必须等待,直到其他线程调用notify()或notifyAl()结束等待状态。
使用notify()或notifyall()方法通知其他等待线程可以进入共享资源进行更新和操作。