一. 二维数组的定义格式和常见用法
二维数组的定义格式:
1)直接给定一维数组的长度 数组类型[][] 数组名称=new 数组类型 [x][y]
2)给定一维数组的个数 数组类型[][] 数组名称=new 数组类型[x][]
3)给定数组的元素值 数组类型[][] 数组名称=new 数组类型[][]{{元素1,元素2...},{元素1,元素2...},......}
简便写法 数组类型[][] 数组名称={{元素1,元素2...},{元素1,元素2...},......}
注意:简便写法在声明之后必须立即初始化,不能先声明再初始化
二维数组的初始化:
1)静态初始化:给定数组长度,系统默认初始值 形式为定义格式中的1),2)
2)动态初始化:不给定数组长度,给定初值 形式为定义格式中的3)和简便写法
二维数组的遍历:
给定一个静态初始化的二维数组如何遍历数组元素?其实这个问题不难理解,构造两个循环的嵌套,外层循环控制一维数组的个数,内层循环控制一维数组的长度
例如:给定int[][] array=new int[][]{{1,2,3},{4,5,6},{7,8,9}};,遍历数组元素
二.代码块的简单概述及应用
代码块的定义:在java中,用{}括起来的叫做代码块
代码块的分类:
1)局部代码块 :直接定义在方法内部,一般和 if ,while, for....等一起使用
2)初始化代码块:直接定义在类中方法外
3)静态代码块:用static修饰的初始化代码块
静态代码块,构造代码块,构造方法的执行流程:
1)静态代码块只执行一次,随着类的加载而加载
2)每次创建对象都会调用构造方法,在调用构造方法之前都会先执行一次初始化代码块
优先级:静态代码块>初始化代码块>构造方法
三.继承关系
继承的特点:继承只能单继承不能多继承,但是可以多层继承
继承的格式:class 子类 extends 父类
继承的好处:
1) 继承可以提高代码的复用性
2) 继承可以提高代码的维护性
3) 它是多态的前提
方法的覆盖: 子类声明一个与父类相同的方法声明,其目的是覆盖父类的方法,当对象调用这个方法时优先调用子类中的这个方法完成自己的功能
注意事项:
1) 子类继承父类的成员或方法是由其修饰符决定的,private不能直接访问
2) 子类不能继承父类的构造方法但可以通过super()访问
3) 子类构造方法进行数据初始化时,总是默认访问父类构造方法,让其先进行初始化
注意:super()语句必须在构造方法第一句, object是所有类的父类
假如父类没有无参构造方法?会有什么结果,如何解决?
编译错误 1) 可以自己提供无参构造方法
2) 通过super(有参构造)访问
3) 通过this()访问本类的无参构造,在通过无参构造间接访问父类的带参构造
注释:成员变量名称一致时,访问的时采用"就近原则"
寻找顺序:局部位置----->成员位置---->父类的成员位置---->如果还没有就报错
四.多态
多态的概念:同一时刻,体现出不同的形态
多态的前提:
1) 必须有继承关系
2) 必须有方法的覆盖
3) 存在向上转型
多态的弊端及解决方法:
弊端:不能访问子类的特有的功能
解决方法:向下转型,将父类的引用强制转换为对子类的引用
向下转型容易出现的错误: class cast Exception,类型转换不当,此时仔细分析内存的指向问题
多态的优点:
1) 提高代码的复用性
2) 提高代码的扩展性
多态成员的访问特点:
1) 成员变量:编译看左,运行看左
2) 成员方法(非静态):编译看左,运行看右
3) 成员方法(静态):编译看左,运行看左
五.抽象类
概念:将类中的功能抽象化,用abstract修饰类
抽象类的特点:不能实例化即不能创建对象
抽象类成员的特点:
成员变量:既可以是变量,也可以是常量
成员方法:既可以是抽象方法也可以是非抽象方法
构造方法:有参/无参
注意:抽象类的的抽象方法没有方法体,必须在子具体类中重写
注释:
1) 有抽象方法的类一定是抽象类,但抽象类不一定有抽象方法
2) 抽象类的子具体类为非抽象类,否则没有研究意义
抽象类多态的使用和多态相同
六.接口
概念:给一些类提供一些额外的功能(扩展功能), 定义接口的关键字是:interface
接口的成员特点:
1) 成员变量:全部为常量,默认的修饰符:public static final
2) 成员方法:全部为抽象的方法
注意:接口没有构造方法
接口子实现类的格式: class 实现类名 implements 接口名
接口多态的使用和多态相同
七.final关键字
final可以修饰类, 成员变量, 成员方法
1) final修饰类,则该类不能被继承
2) final修饰成员变量,则该变量代表一个常量
3) final修饰成员方法,则该方法不能被重写
注释: final修饰成员变量,该变量可以是基本数据类型,也可以是引用数据类型
1) 修饰基本数据类型,则代表该值一旦被赋初始值,则该值不能被重新赋值
2) 修饰引用数据类型,则代表该引用类型的地址不能改变,但该地址里面的内容可以改变
八.形式参数和返回值的问题
1) 形式参数为具体类: 形式参数为一个具体类的话,则创建具体对象作为实际参数
2)形式参数为抽象类:抽象类形式参数要借助其子具体类来实现
3)形式参数是接口:形式参数如果是接口的话,则需要创建其子实现类
4)返回值是一个类:
5)返回值是抽象类:返回值如果是抽象类的话,必须借助于其子具体类来完成返回操作
6)返回值是接口: 返回数据类型如果是接口,则必须要先建立其子实现类
九.内部类的访问特点及内部类的分类
内部类的分类: 内部类有两种:
1)成员内部类
2)局部内部类
内部类的访问特点:
1.内部类(非静态)访问外部类可以直接访问,包括私有的成员变量
注意:局部内部类访问局部变量,jdk1.8声明该变量时不加final不会报错,但jdk1.7则会报错
1)创建两次对象,间接访问
2)直接访问 :外部类名.内部类名 对象名=new 外部类无参构造.new 内部类无参构造
3.外部类访问局部内部类
1)内部类如果是静态的,外部类访问内部类的成员
外部类名.内部类名 对象名=new 外部类名.内部类名()
2)静态的内部类如果要访问外部类的数据,则该数据必须有static修饰,静态类只能访问静态成员
4.匿名内部类
前提:必须存在接口/类(抽象类/具体类)
格式:new 接口名/类名(){
重写的方法(){.........}
};
注释:利用匿名内部类不需要创建子实现类
实际应用如下例:
十.抽象类和接口的区别?
1成员的区别:
1)成员变量:抽象类既可以是变量也可以是常量,接口只能是常量
2)成员方法:抽象类既可以有抽象方法也可以有非抽象方法,接口只能有抽象方法
3)构造方法:抽象类有构造方法,接口没有构造方法
2关系的区别:
1)接口和类之间是实现关系,一个类继承一个类的同时,还可以实现多个接口
2)类和类是继承关系,只能是单继承,不能是多继承,但是可以是多层继承
3)接口和接口之间是继承关系,可以是单继承也可以是多继承
3设计原则的区别:
1)抽象类是一种继承关系,体现的是一种"is a"的关系
2)接口是一种实现关系,体现的是一种"like a"的关系