一.封装、继承、多态:
1、extends(继承):
一、继承,定义子类继承父类。只能继承一个父类。
二、class 子类名 extends 父类名。
2、implements(实现接口):
一、声明实现接口,可以声明实现一个接口或者多个接口。
二、class 类名 implements 接口名。
3、interface(接口):
一、定义接口 public interface 接口名。
二、通过implements来引用。
三、实现接口方法时必须加上public修饰符。
四、并且接口可以继承其他的接口,并添加新的属相和抽象方法。
五、接口中的变量成员会自动默认为public static final
六、所有的成员方法都默认为public abstract类型
二.抽象(abstract)、静态(static)、常量(final)
1、abstract的用法,修饰符,可以修饰类和方法
一、abstract修饰类,成为抽象类,抽象类不能生成对象实例,相当于类的半成品,需要子类继承并覆盖其中的抽象方法。
二、abstract修饰方法,成抽象方法,只有声明(定义)而没有实现,需要子类继承实现(覆盖)。
三、 有抽象方法的类一定是抽象类。但抽象类中不一定都是抽象方法,也可以全是具体方法。
四、抽象方法要求子类覆盖实现这个方法。调用时可以以多态方式调用子类覆盖实现后的方法,除非子类本身也是抽象类。
五、抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法。
2、static 的用法,被修饰的方法称为静态方法,被修饰的变量称为静态变量
一、静态变量和静态方法代码块在对象创建之前已经在内存中创建好对应的变量和方法,被JVM加载在内存中,作为公用的变量和方法。
1.静态方法
无需本类对象即可调用此方法“类名.方法名”,并有以下限制:
仅能调用其他的static 方法。
只能访问static数据。
不能以任何方式引用this 或super。
2.静态变量
静态变量实质是全局变量,只分配一块存储空间,所有此类的对象都可操控此块存储空间。
3.静态内部类
通常一个公用类不能设置为静态,只能是内部类设置为静态。
二、static和final一块修饰成员变量和成员方法,可理解为全局常量。
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。
3、final关键字的使用
一,修饰基础数据称为常量,必须在声明时设置值,不可修改。
二,修饰类或对象的引用的final,比较少使用。
在Java中,无法让对象被修饰为final,而只能修饰对象的引用,这意味着即使你写public final A a = new A(),a指向对象的数据可以被修改,a 本身的引用值不能被修改,即你不能再对a进行重赋值。同样在数组中,比如public final int[] b = {1, 2, 3, 4, 5},事实上b中的数值是可修改的 即可以写a[0] = 3。据目前了解,java中数组内的数据是无法修饰为不可修改的。
三、继承的子类中不能修改(重写)final修饰的方法。
修饰的方法不可被继承成员重新定义。(当父类的方法是私有类型,子类允许定义同名方法,不能重新定义是指不能通过改写方法,使得方法重写 的多态性得以实现)。
四,当一个方法被修饰为final方法时,编译器可能将该方法用内联(inline)方式载入。
五,私有方法也被编译器隐式修饰为final,这意味着private final void f()和private void f()并无区别。
六,修饰类的final的类不能被继承,例如String类。
5、synchronized用法。
一,修饰一个方法或者一个代码块时,保证在同一时刻最多只有一个线程执行该段代码。
二,当两个并发线程访问同一个对象object中synchronized(this)同步代码块时,同时间内只能执行一个线程。另一个线程必须等待当前线程执行完 才能执行该代码块。
三,在一个线程访问object的一个synchronized(this)同步代码块时,另一个线程可以访问该object中的非synchronized(this)同步代码块。
四,在一个线程访问object的一个synchronized(this)同步代码块时,将阻塞其他线程对object中所有其它synchronized(this)同步代码块的访问。
五,总结补充:
synchronized关键字的作用域:
1,不同对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。
2,加上static后,synchronized static aStaticMethod{}防止多个线程同时访问类中synchronized static方法,可以对类的所有对象实例起作 用。
3,synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f() {}。继承类需要你显式的指定它的某个方法为synchronized方法。
三、创建线程的三种方式
1. 继承Thread类(有单继承的限制,但是所有的线程都要通过Thread中的start方法启动)
使用start()启动线程主方法run();
2. 实现Runnable(以后都用Runnable接口实现多线程,避免Thread的单继承实现,并且更好的实现共享)。
实现Runnable与Thread相同,Runnable没有启动线程的start()方法,但是在Thread中拥有包含Runnable的构造方法,借助构造方法启动start()方法。
Callable接口,接口亦可实现多线程,但是更加麻烦。
3. 应用程序可以使用Executor框架来创建线程池
可以通过匿名内部类实现:
new Thread(new Runnable(){
@override
pubblic void run(){
System.out.println("多线程");
}
}).start();
四、Java方法的覆盖和方法重载
重载:发生在同一个类里面两个或者多个方法的方法名相同但参数不同的情况。
覆盖:子类重新定义父类的方法,必须有相同的方法名、参数列表和返回类型,但不一定限制对它所覆盖方法的访问。
五、构造函数
新对象被创建时,调用构造函数,每个类都有构造函数,在没有给类提供构造函数时,java编译器会为这个类创建默认的构造函数。
六、泛型
java泛型中主要:<?>和<T>、T自定义泛型和?通配符泛型
?和T都表示不确定的类型 但如果是T的话 函数里面可以对T进行操作 比如while里面可以这样写
T t = it.next();