目录
类:
描述现实世界中一个客观的业务实体或者业务对象。
定义类的时候,如果显示的提供了构造函数(无返回类型并且和类名一样的一个方法),那么JVM不在提供默认的空体构造函数。空体构造函数,将类中的数据成员都初始化为默认值,8种基本数据类型种的6种数值默认值0,char字符默认值'',boolean默认值false,对象引用默认值null。构造函数的作用,声明出来一个对象时,一定都会调用构造函数的。
this关键字永远指向当前对象,super指向父类对象。
来个配套稍难理解的this的用法介绍:注意理解,this永远指向当前对象。
class A{
public A(){
System.out.println( this.getClass().getName() );
//输出是B不是A,因为这时是new B(); this永远指向当前对象
}
}
class B extends A{
}
//测试
public class Test{
public static void main(String[] args){
new B(); //new子类时,没硬性指定构造函数时,jvm默认调用父类的空体构造函数A()
}
}
类的三大特性:封装、继承、多态
- 封装:
将数据成员,方法成员封装到一起,形成一个类Class。
- 继承:
A:子类继承父类的所有成员,但是子类无法访问父类中的私有成员。
B:父类变量可以指向子类对象,但是此时不能访问子类中新增的成员,要想访问,需要类型强制转换为子类类型。这种设计的初衷是为了满足 面向接口编程;
C:super的用法:
c.1:super()构造函数,子类构造函数第一句:用于初始化父类的私有数据成员,子类中拥有这些成员开辟内存
c.2:super()构造函数,被子类覆盖的父类成员,可用 super.父类成员 来访问父类成员
- 多态:
运行时,JVM虚拟机才知道到底应该调用哪个方法,这种特性叫做多态。
A:多态体现方式一:方法重写,子类继承父类,并重写了父类方法。运行根据对象引用到底指向了哪个对象,JVM决定调用那个对象的重写方法。
运行时的方法动态调度(父类的方法可以被子类重写);面向接口编程,父类变量可以访问的成员只能是父类中定义的成员。子类中的重写方法和父类中的原始方法哪个版本被实际调用,取决于当前对象。
父类的引用指向了子类的实际对象,这时直接想访问子类自己新增的成员是编译不通过的,必须进行向下强制类型转换,((childClass)parentReference).childxxxMethod();
B:多态体现方式二:方法重载,若干个方法的名字一样,但是每个方法的签名都不一样。运行时根据方法的实参到底是什么类型,JVM决定调用那个匹配实参类型和实参个数的重载方法。
方法重载:
方法的名字一样,但是同样名字的若干方法的签名却不一样,我们称之为方法重载。方法签名的定义:方法的名字,方法的入参纠集在一起的考究,叫做方法签名。
方法重写:
子类继承了父类,并且重写了父类中的方法,我们称之为方法重写@override
静态导入:
也就是个快捷语法而已,没什么高深的。
无静态导入之前的代码:
double result = Math.sqrt( Math.pow(3.5 , 2) + Math.pow(4.8 , 3) ); //静态方法之前需要类名
有静态导入之后的代码:
import static java.lang.Math.sqrt;
import static java.lang.Math.pow;
double result = sqrt( pow(3.5 , 2) + pow(4.8 , 3) ); //静态导入之后无需类名,代码简短些
静态导入的语法:
import static pkg.ClassName.static_member; //导入某类的某个静态成员
import static pkg.ClassName.*; //导入某类的所有静态成员
内部类:
内部类:
在类的内部定义一个类,这个定义的内部类也叫非静态的嵌套类,其被当成一个成员由定义它的类来管理。此时定义内部类的类也叫外部类,外部类不能直接访问内部类当中的成员,而反过来,内部类本身是一个成员,可以访问外部类中的所有成员,就跟一个外部类的普通方法可以访问类内的所有成员一样的访问调用方式。只能在外部类的内部才能实例化该内部类。
匿名内部类:
作为方法的入参来使用
1:事件监听处理器类:处理事件时作为监听处理器方法的形参的Handler类
2:多线程编程时的任务类:往线程池当中提交一个实现了Runnable接口的类
一般结构如下:
event.addEventListener( new Handler(){
public void xxxMethed(Event event){}
}
); //这里的Handler就是匿名内部类,这个匿名类中有一个方法xxxMethod(); 这个xxxMtd()是由事件调度线程来执行的。
threadPoolExecutor.execute( new Runnable(){
public void run(){}
}
); //这里的Runnable就是匿名内部类,这个匿名类中有一个方法run(); 这个run()是由线程池调度工作线程来执行的。
方法形参的可变参数:
可变参数...args只能出现在方法的最后一个形参的位置。在方法内部访问这个可变参数时,是当成数组来访问的。举例如下:
定义xxxMethod()方法:
public void xxxMethod(int i, String...args){
if( null != args && args.length>0 ){ //有args的值时才消费
}
}
调用xxxMethod()方法:
obj.xxxMethod(1); //OK
obj.xxxMethod(1,"str"); //OK
obj.xxxMethod(1,null); //failure! no compiled!
接口:
接口的定义:
在接口中声明方法,隐式默认为public abstract
JDK8新增:接口中可提供默认方法 default修饰符。默认实现可以从本质上根除适配器模式。
JDK8新增:接口中可提供静态方法 static修饰符。可以 接口名.静态方法() 来调用。
JDK8新增:接口中可声明变量,隐式默认为public final static
interface MyInterface {
int search();
//jdk8:接口中的数据成员
String s = "abc";
//jdk8:接口中的默认方法
default void get(){ }
//jdk8:接口中的静态方法
static void staticmethod(){ }
}
接口的运用:
一个类可以实现多个接口