目录
第二章 数组
2.1 数组的概述
- 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
- 数组的常见概念
- 数组名
- 下标(或索引)
- 元素
- 数组的长度
- 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
- 数组的长度一旦确定,就不能修改。
- 数组的分类:
- 按照维度:一维数组、二维数组、三维数组、…
- 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
2.2 一维数组和多维数组的使用
Java语言中声明数组时不能指定其长度(数组中元素的数),例如:inta[5];//非法
一维数组初始化:
数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。
对于基本数据类型而言,默认初始化值各有不同
对于引用数据类型而言,默认初始化值为null
多维数组的使用:
数组中涉及的常见算法:
- 数组元素的赋值(杨辉三角、回形数等)
- 求数值型数组中元素的最大值、最小值、平均数、总和等
- 数组的复制、反转、查找(线性查找、二分法查找)
- 数组元素的排序算法。
2.3 数组的遍历
int[] a = new int[]{1, 2, 3};
①for循环遍历
for(int i=0; i < a.length; i++){
System.out.println(“下标为”+ i + “的数组元素为” + a[i]);
}
②foreach遍历
for(int n : a){
System.out.println(n);
}
③Arrays.toString(a)。使用Arrays中的toString方法。
2.4 数组的排序和异常
Arrays.sort(数组名);
编译时不报错
第三章 面向对象编程一
3.1 Java类及类的成员
类和对象:
属性:成员变量|
行为:成员方法或函数
创建对象:类名 对象名 = new 类名();
访问对象成员(包括属性和方法):对象名.对象成员
类的访问机制:
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(static方法只能访问static)
在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
类的成员:
属性
在方法体外,类体内声明的变量为成员变量。
在方法体内部声明的变量为局部变量(局部变量除形参,都要显式初始化)。
对象属性的默认初始化值:
方法
概念:方法(函数或过程)是类或对象行为特征的抽象,用来完成某个功能操作。
将功能封装为方法的目的是,可以实现代码重用,简化代码。
Java方法不能独立存在,所有方法必须定义在类内。
方法中只能调用方法或属性,不可以在方法内部定义方法。
重载:在同一个类中允许存在一个以上的同名方法,与返回值类型无关,只看参数列表,且参数类别必须不同(参数个数或参数类型)。调用时,根据参数列表的不同来区别。
方法参数的值传递机制:
- 形参:方法声明时的参数
- 实参:方法调用时实际传给形参的参数值。
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
构造器(构造方法)
特征
- 具有与类相同的名称
- 不声明返回值类型。
- 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值。
作用
创建对象,给对象进行初始化
注意
Java语言中,每个类至少有一个构造器。
默认构造器的修饰符与所属类的修饰符一致。
一旦显式定义了构造器,则系统不再提供默认构造器。
一个类可以创建多个重载构造器(参数列表不同)。
父类的构造器不可被子类继承。
代码块
作用:对java类或对象进行初始化
静态代码块:用static修饰的代码块
1.可以有输出语句。
2. 可以对类的属性、类的声明进行初始化操作。
3. 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
4. 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
5. 静态代码块的执行要先于非静态代码块。
6. 静态代码块随着类的加载而加载,且只执行一次。
非静态代码块:没有static修饰的代码块
- 可以有输出语句。
- 可以对类的属性、类的声明进行初始化操作。
- 除了调用非静态的结构外,还可以调用静态的变量或方法。
- 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
- 每次创建对象的时候,都会执行一次。且先于构造器执行。
内部类
- 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
- Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完 整的名称。 Inner class的名字不能与包含它的外部类类名相同;
3.2.1 this的使用
this是什么?
- 在方法内部使用,即这个方法所属对象的引用;
- 在构造器内部使用,表示该构造器正在初始化的对象。
- This可以调用类的属性、方法和构造器
使用this,调用属性、方法:
在任意方法或构造器内,如 果使用当前类的成员变量或成 员方法可以在其前面添加this。
当形参与成员变量同名时, 如果在方法内或构造器内需要 使用成员变量,必须添加this来 表明该变量是类的成员变量。
使用this访问属性和方法时, 如果在本类中未找到,会从父 类中查找。
使用this调用本类的构造器:
必须声明在第首行;
在类的一个构造器中,最多只能声明一个“this(形参列表)”
this():调用本类中无参构造器、this(形参列表):调用有参数的构造器。
3.2.2 package、import的使用
lpackage语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为: package 顶层包名.子包名 ;
包的作用:
- 帮助管理大型软件系统:将功能相近的类划分到同一个包中。如MVC思想。
- 包可以包含类和子包,划分项目层次,便于管理。
- 解决类命名冲突的问题。
- 控制访问权限。
为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类 或全部类(.*)。import语句告诉编译器到哪里去寻找类。
语法格式:import 包名.类名。
静态导入包:inmort static 包名.类名.方法名
3.2.3 MVC设计思想
MVC是常用的设计模式之一,将整个程序分为三个层次:视图模型层,控制器层,与数据模型层。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式 使程序结构变的灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程 序的耦合性。
3.2.4 super
在java类中使用super来调用父类中的指定操作:
- super可用于访问父类中定义的属性。
- super可用于调用父类中定义的成员方法。
- super可用于在子类构造器中调用父类的构造器。
注意:
- 当子父类出现同名成员时,可以用super表明调用的是父类中的成员
- super的追溯不仅限于直接父类
- super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识。
调用父类的构造器:
- 子类中所有的构造器默认都会访问父类中空参数的构造器
- 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的 构造器。同时,只能”二选一” ,且必须放在构造器的首行
- 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又 没有无参的构造器,则编译出错
This和super的区别
3.2.5 final的使用
Final可以修饰类,成员方法,变量
Final修饰的类不能被继承
修饰符 final class 类名{
}
Final不能修饰构造方法
Final修饰的方法不能被重写,可以被继承
Final修饰的变量表示常量,只赋值一次,且赋值后不改变:
修饰数据类型变量,值一旦确定就不改变;
修饰引用类型变量,地址确定后不改变,但可以改变地址指向的值。
3.2.6 static的使用
使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备的特点:
- 随着类的加载二加载
- 优先于对象存在
- 修饰的成员,被所有对象所共享
- 访问权限允许时,可不创建对象,直接被类调用
类方法:
- 没有对象的实例时,可以用类名.方法名()的形式访问由static修饰的类方法。
- 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
- 因不需要实例就可以访问static方法,所以static方法内部不能有this(super)。
- Static修饰的方法不能被重写。
代码块:
1.匿名代码块:直接在{}中写,在构造器之前加载执行
2.静态代码块:static {},跟类同时加载,最先执行。且只执行一次。
3.构造器
单例设计模式:
优点:
3.3 面向对象三大特征
3.3.1 封装
封装:将数据声明为私有的(private),再提供公共的方法:get(),set()实现对该属性的操作。
权限修饰符:
3.3.2 继承
为什么要有继承?
- 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类(子类或派生类)无需再定义这些属性和行为,只要继承那个类即可。
- 父类也称为基类或超类。
- 语法规则:class Subclass extends SuperClass{}。
作用:
- 继承的出现减少了代码冗余,提高了代码的复用性。
- 继承的出现,更有利于功能的扩展。
- 继承的出现让类与类之间产生了关系,提供了多态的前提。
子类继承了父类,就继承了父类的方法和属性。
在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。但子类不能直接访问父类中私有的成员变量和方法。
Java只支持单继承和多层继承,不允许多重继承
- 一个子类只能有一个父类
- 一个父类可以派生出多个子类
3.3.3多态
对象的多态性:父类的引用指向子类的对象(可以直接应用在抽象类和接口上)
父类类型 变量名 = new 子类类型();
Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
- 简称:编译时,看左边;运行时,看右边。
- 若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)
- 多态情况下,“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法 - 对象的多态 —在Java中,子类的对象可以替代父类的对象使用
一个变量只能有一种确定的数据类型 Ø
一个引用类型变量可能指向(引用)多种不同类型的对象
子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向上转型(upcasting)。 - 一个引用类型变量如果声明为父类的类型,但实际引用的是子类 对象,那么该变量就不能再访问子类中添加的属性和方法
instanceof操作符:
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
- 要求x所属的类与类A必须是子类和父类的关系,否则编译错误
- 如果x属于类A的子类B,x instanceof A值也为true。
对象类型转换:
- 从子类到父类的类型转换可以自动进行
- 从父类到子类的类型转换必须通过造型(强制类型转换)实现(向下转型)
如果要调用子类有的而父类没有的方法,那就要进行强转,转成子类类型
Cat c = (Cat) a(其中a是父类new出来的对象) - 无继承关系的引用类型间的转换是非法的
3.4 方法的重写
定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。当程序执行时,子类方法将覆盖父类的方法。
要求:
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表。
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型。
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限。(子类不能重写父类中private权限的方法)
- 子类方法抛出的异常不能大于父类被重写方法的异常。
注意:
子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为 static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
3.5 object类的使用
- Object类是所有Java类的根父类
- 如果在类的声明中未使用extends关键字指明其父类,则默认父类 为java.lang.Object类
- ==操作符与equals方法:
==:
- 基本类型比较值:只要两个变量的值相等,即为true。
- 引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。
- 用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本 数据类型除外),否则编译出错
equals():
- 所有类都继承了Object,也就获得了equals()方法。还可以重写。 Ø
- 只能比较引用类型,其作用与“==”相同,比较是否指向同一个对象。 Ø
- 格式:obj1.equals(obj2)
- 重写equals()方法的原则:
tostring()方法:
- toString()方法在Object类中定义,其返回值是String类型,返回类名和它 的引用地址。
- 在进行String与其它类型数据的连接操作时,自动调用toString()方法
- 可以根据需要在用户自定义类型中重写toString()方法 如String 类重写了toString()方法,返回字符串的值。
- 基本类型数据转换为String类型时,调用了对应包装类的toString()方法