一、二维数组
1、定义方式
m:代表当前二维数组中有多少个一维数组;n:代表每个一维数组的长度
(1)数据类型[][] 数组名=new 数据类型[m][n]
(2)数据类型[][] 数组名=new 数据类型[m][ ],只给定m个一维数组,每个一维数组长度动态给定。
(3)数据类型[][] 数组名={{元素1,元素2,......}...{......}},静态初始化。
(4)数据类型[] 数组名[]=new 数据类型[m][n]
(5)数据类型 数组名[][]=new 数据类型[m][n]
例如:
运行结果:
二、代码块
(1)概述:用{}括起来的统称为代码块。
(2)分类及其特点:
A、局部代码块:在main()方法里,限定变量的生命周期,外部不能访问局部代码块中的变量;
B、构造代码块:在一个类的成员方法中,用{}括起来,可将多个方法中相同代码块放到构造代码块中,对对象进行初始化,在每次执行构造方法之前,先执行构造代码块;
C、静态代码块:在一个类的成员位置中,用{}括起来,被Static修饰,一般情况下,用于给类进行初始化,并且只能执行一次。
(3)静态代码块,构造代码块,构造方法的执行流程:静态代码块>构造代码块>构造方法。
例如:
三、继承
1、概述:多个类存在相同属性或行为时,将这些内容抽取到一个单独的类中,多个类无需再定义这些属性或行为,只需要继承那个类即可。其中被继承的类称为父类、基类或超类,继承的类称为子类或派生类。
2、关键字:extends。
3、子类继承格式:
Class 子类名 extends 父类名{......}
4、设计原则:高内聚低耦合。内聚是指实现一个功能的能力(能用一个类完成的事情尽量不要用多个类去完成),耦合指类与类之间的关系,尽量降低耦合性。
5、继承特点:
(1)只支持单继承,不支持多继承(一个类只能有一个父类,不能有多个父类);
(2)支持多层继承(继承体系)。例如:
Class A{}
Class B extends A{}
Class C extends B{}
(3)子类继承父类,是继承了父类的所有成员(成员变量、成员方法,包括私有),但子类不能直接访问父类的私有成员,只能通过父类的公共访问方法间接的让子类去访问。
6、注意事项:
(1)子类可继承父类所有成员(成员方法、成员变量),但是父类中的私有成员,子类只能通过在父类中创建公有方法间接去访问,不能直接去访问;
(2)子类不能继承父类的构造方法,但可通过super关键字去访问父类构造方法;
(3)不能为部分功能而去使用继承,当类与类之间的关系体现的是“is a”的时候使用继承。
(4)例如:
7、super关键字
(1)super代表父类的空间标识(即父类的引用或父类的对象)。
(2)super与this类似,区别如下:
this:表示对本类的引用。
Super:代表父类存储空间的标识(可理解为父类引用)。
(3)用法(this与super均可如下使用):
A、访问成员变量:this.成员变量名、super.成员变量名
B、访问构造方法:无参:this()、super();有参:this(...)、super(...)
C、访问成员方法:this.成员方法()、super.成员方法()
8、继承中成员变量的关系
在子类方法中访问一个变量:(1)首先在子类局部范围找;(2)其次在子类成员范围找;(3)最后在父类成员范围找(绝对不能访问到父类局部范围)。
当子类中定义的成员变量与父类中的成员变量名称一致时,若用子类的方法访问该成员变量时,访问的是子类的成员变量。
9、继承中成员方法的关系
(1)子类访问父类,当成员方法名不一致的情况下,分别调用。
(2)当子类中成员方法名与父类中成员方法名一致的情况下:先在子类中的成员方法找,若有则调用,若无,则在父类中的成员方法找。
10、继承中构造方法的关系
(1)子类中所有的构造方法默认都会访问父类中空参数的构造方法。子类会继承父类中的数据,可能还会使用父类中的数据,所以子类初始化前一定要先完成父类数据的初始化,为实现这个效果,在子类构造方法的第一条语句上都默认有一个super()。
(2)若父类中没有构造方法,则:a、提供父类的构造方法;b、子类通过super关键字去显示访问父类其他的带参构造方法;c、子类通过this调用本类的其他构造方法(有参构造),间接访问父类的带参构造方法(子类必须有一个带参构造方法或无参构造方法,让父类进行初始化。
(3)注意:super和this都默认在构造方法中的第一句且必须在第一句,否则会有父类数据的多次初始化,可省略。
11、继承中初始化
(1)初始化方式:分层初始化。
(2)初始化顺序:子类继承父类,父类先进行初始化,子类再进行初始化。
(3)例如:
12、继承优点
(1)提高了代码的复用性(多个类相同的成员放在同一个类中);
(2)提高了代码的维护性(若功能代码需要修改,修改一次即可);
(3)多态的前提,让类与类之间产生了关系。
四、多态
1、多态概述:多态是指允许不同类的对象对同一消息作出响应。即同一消息可根据发送对象的不同而采用多种不同的行为方式(发送消息指方法调用)。
2、多态前提
(1)必须有继承关系;
(2)必须有方法重写(方法覆盖);
(3)必须有父类的应用指向子类对象(向上转型):父类名 对象名=new 子类名();。
3、多态中的访问特点
(1)成员变量:编译看左,运行看左;
(2)成员方法(非静态):编译看左,运行看右(存在方法重写);
(3)成员方法(静态):编译看左,运行看左(静态和类相关,算不上方法重写);
(4)构造方法:构造方法无论是子类还是父类,都是对对象进行初始化。
4、向上转型/向下转型
(1)向上转型:将父类的引用指向子类对象,父类名 父类引用=new 子类名()。
(2)向下转型:将子类的应用指向父类引用,子类名 子类引用=(子类名) 父类引用,向下转型前提是必须有父类引用,若使用不当,会出现运行时期异常,即ClassCastException。
(3)举例:
5、多态优势
(1)提供代码的复用性,由继承保证;
(2)提供代码扩展性,由多态保证。
6、多态弊端
(1)弊端:无法访问子类的特有功能。
(2)解决方案:利用向下转型,即将子类的应用指向父类引用,子类名 子类引用=(子类名) 父类引用,向下转型前提是必须有父类引用,若使用不当,会出现运行时期异常,即ClassCastException。
7、final关键字
(1)概述:final,最终的,终态的(不能被修改)。
(2)作用:可修饰类、成员方法、变量。
(3)特点:a、可修饰类,但该类不能被继承,所以声明类时不能和abstract同时存在;b、可修饰成员方法,但成员方法不能被重写;c、可修饰变量,此时变量为常量,不能被修改;d、被final修饰只能赋值一次;e、被final修饰时进行初始化和赋值是在使用之前;f、final既可修饰基本数据类型,也可修饰引用数据类型,若修饰基本数据类型,基本数据类型的值不可被改变,若使用引用数据类型,引用数据类型的地址值不能被改变,但堆内存中的成员变量值可改变。
(4)final关键字的面试题:
面试题:final、finally、finalize三者区别?
回答:A、final修饰符(关键字),主要用来修饰类、成员方法,变量等,表示终态的,最终的。主要作用a、可修饰类,但该类不能被继承,所以声明类时abstract不能和final同时存在;b、可修饰成员方法,但成员方法只能使用不能被重写;c、可修饰变量,此时变量为常量,不能被修改而且必须在声明时给出变量的初始值。
B、finally是在异常处理时提供finally块来执行任何操作。无论有无异常抛出、捕获,finally块都会被执行。所以在代码逻辑块中若有无论发生什么都必须执行的代码,就放在finally块中。
C、finalize是方法名。Java技术允许使用finalize()方法在垃圾回收器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。该方法在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行的其他清理工作。Finalize()方法是在垃圾回收器删除对象之前对这个对象调用的。
五、抽象类
1、概述:如果一个类中有一个方法声明抽象功能(抽象方法),则这个类定义为抽象类。其中一个类若有抽象方法,则这个类一定为抽象类;抽象类中不一定都是抽象方法。
2、关键字:abstract
3、抽象类的子类
(1)当子类为具体类时,子类必须实现父类中的抽象功能。
(2)当子类为抽象类时,无意义,不能实例化,不能创建对象。
4、特点:抽象类不能直接实例化,即不能创建对象。
5、抽象类成员特点
(1)成员变量:可以是常量,也可以是变量。
(2)成员方法:可以有抽象方法,也可以有非抽象方法。
(3)构造方法:可以有无参构造方法,也可以有有参构造方法,作用:给对象进行初始化。
6、不能与abstract共存的关键字:private、final、static。
7、举例:抽象类:
子实现类:
测试类:
六、接口
1、概述:接口是事物扩展×××的一个体现。
2、关键字:interface
3、格式:interface 接口名{//抽象功能}
4、接口的子实现类格式:class 类名+impl implements 接口名{}
5、特点:不能实例化。
6、接口成员特点
(1)成员变量:是一个常量,不能修改,并且有默认修饰符public static final;
(2)构造方法:接口不存在构造方法;
(3)成员方法:不能有方法体,都是抽象方法,有默认修饰符:public abstract。
7、接口、类的关系
(1)类与类之间的关系:继承关系,只支持单继承,不支持多继承,可以多层继承。
(2)类与接口的关系:实现关系,一个类继承另一个类的同时,还可以实现多个接口。
(3)接口与接口的关系:是一种继承关系,既可以单继承,也可以多继承。
8、接口与抽象类的区别
(1)成员区别
成员变量:
抽象类:既可以常量,也可以是变量。
接口:只能是常量,默认的修饰符:public static final
构造方法:
抽象类:有构造方法,无参/有参 (给对象进行初始化的)。
接口:无构造方法。
成员方法:
抽象类:可以有抽象方法,也可以有非抽象方法。
接口:只有抽象方法 ,默认的修饰符:public abstract
(2)类与类/类与接口/接口与接口关系的区别
类与类之间的关系:继承关系,只支持单继承,不支持多继承,可以多层继承。
类与接口的关系:实现关系,一个类继承另一个类的同时,还可以实现多个接口。
接口与接口的关系:是一种继承关系,既可以单继承,也可以多继承。
接口1 extends 接口2,接口3...接口 n
(3)设计原则的区别
抽象类:继承关系,体现的是一种"is a"的关系(A是B的一种)。
接口:类和接口,实现关系,体现的是一种" like a"的关系(扩展功能)。
9、实际开发中使用频率
(1)接口多态:使用最多。
(2)抽象类多态:比较多。
(3)具体对象的创建:经常会使用。
10、举例
抽象类:
子实现类学生:
子实现类老师:
接口+测试:
七、内部类
1、概述:在B类内部定义A类,则A类为B类的内部类。
2、内部类访问外部类:内部类可直接访问外部类的成员,包括私有成员。
3、外部类访问内部类:通过创建内部类对象的方式间接访问。
访问格式:外部类名.内部类名 对象名=外部类对象.内部类对象。
例如:
4、分类
(1)成员内部类:在外部类的成员位置。可直接访问外部类的成员,包括私有成员。
成员内部类修饰符:A、private:(作用)保证了数据的安全性。B、static:把静态内部类看成外部类成员,其特点是静态内部类访问外部类数据,该数据必须用static修饰。
例如:
(2)局部内部类:在外部类的局部位置。可访问外部类的成员,包括私有。在外部类的局部位置去访问内部类的成员方法时,需要在局部位置创建内部类对象,通过对象去访问。
例如:
(3)匿名内部类
A、前提:有类(该类可以是具体类也可以是抽象类)或接口。
B、格式:new 类名或接口名{ 方法重写();}
C、本质:继承了该类或实现了该接口子类对象。
D、匿名内部类面试题:补全代码,在控制台上输出(“Hello World”)。截图如下:
八、形式参数与返回值
1、概述:形式参数是基本类型,对实际参数无影响;形式参数是引用类型(类、抽象类、接口),影响实际参数,情况如下。返回值是基本类型时,用对应的基本类型接收数据即可;返回值若为引用类型,情况如下。
2、形式参数为具体类:需要提供该类对象。
返回值:该类对象。
例如:
3、形式参数为接口:需要提供接口的子实现类,通过子实现类进行实例化(接口多态)。
例如:
4、形式参数为抽象类:需要提供该抽象类的子类,以抽象类多态的形式创建对象。
返回值:需要当前抽象类的子类对象(抽象类多态)。
例如:
九、overload与override区别
(1)overload:方法重载,方法名一样,参数不同(个数或类型不同),与返回值无关。
(2)override:方法重写,子类定义一个与父类一样的方法声明,继承中使用。