一维数组
初始化:
动态初始化:数组声明且为数组元素分配空间与赋值操作分开进行
静态初始化:在定义数组的同时就为数组元素分配空间并赋值
数组元素类型
二维数组
数组中的数组
初始化
注意特殊学法情况:int[]x,y[]: x是一维数组,y是二维数组
多维数组不必都是规则矩阵形式
十大内部排序算法
选择排序:直接选择排序,堆排序
交换排序:冒泡排序,快速排序
插入排序:直接插入排序,折半插入排序,shell排序
归并排序
桶式排序
基数排序
Arrays工具类的使用
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法
数组元素排序:
import java.util.Arrays;
Arrays.sort();
Java类及类的成员
对象的创建和使用
创建对象语法:类名 对象名 = new 类名();
使用 对象名.对象成员 的方式访问对象成员(包括属性和方法)
成员变量(属性)和局部变量的区别?
方法
方法是类或对象行为特征的抽象,用来完成某个功能操作,在某些语言中也称为函数或过程。
将功能封装为方法的目的是,可以实现代码重用,简化代码
Java里的方法不能独立存在,所有的方法必须定义在类里。
方法的声明格式:
其中:
修饰符:public,缺省,private,protected等
返回值类型:
没有返回值:void
有返回值:声明返回值的类型。与方法体中“return返回值”搭配使用
方法名:属于标识符,命中时遵循标识符命名规则和规范,“见名知意”
形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开
返回值:方法在执行完毕后返还给调用它的程序的数据
方法的分类
方法的重载
在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同即可。
特点:与返回值类型无关,只看参数列表,且参数列表必须不同,调用时,根据方法参数列表的不同来区别。
示例:
可变个数的形参
Java的实参值如何传入方法呢?
Java里方法的参数传递方法只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型的变量的“地址值”传给形参
信息的封装和隐藏
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;
四种访问权限修饰符
对于class的权限修饰只可以用 public 和 default
public 类可以在任意地方被访问
dufault类只可以被同一个包内部的类访问。
构造器
特征:它具有与类相同的名称
它不声明返回值类型。
不能被static,final,synchronized,abstract,native修饰,不能有return语句返回值
作用:创建对象;给对象进行初始化
根据参数不同,构造器可以分为如下两类:
隐式无参构造器(系统默认提供)
显式定义一个或多个构造器(无参、有参)
注意:
Java语言中,每个类都有至少一个构造器;
默认构造器的修饰符与所属类的修饰符一致;
一旦显示定义了构造器,则系统不再提供默认构造器;
一个类可以创建多个重载的构造器;
父类的构造器不可以被子类继承。
UML类图
this关键字
this是什么?它的作用和其词义很接近
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。
this可以调用类的属性,方法和构造器
当在方法内需要用到该方法的对象时,就用this
例如:我们可以用this来区分属性和局部变量。this.name = name;
MVC设计模式
MVC是常用的设计模式之一,将程序分为三个层次:视图模型层,控制器层,数据模型层。
这种将程序输入输出、数据处理以及数据的展示分离开的设计模式使程序结构变得灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性。
JDK中主要的包介绍
java.lang:包含一些java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能
java.net:包含执行与网络相关的操作的类的接口。
java.io:包含能提供多种输入/输出功能的类。
java.util:包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
java.text:包含了一些java格式化相关的类
java.sql:包含了java进行JDBC数据库编程的相关类/接口
java.awt:包含了构成抽象窗口工具集的多个类(abstract window toolkits),被用来构建和管理应用程序的图形用户界面(GUI)
类继承
语法规则:
class Subclass extends SuperClass{ }
Java只支持单继承和多层继承,不允许多重继承:
一个子类只能有一个父类
一个父类可以派生出多个子类
方法的重写
在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
要求:
子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表;
子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型;
子类重写的方法的访问权限不能小于父类被重写的方法的访问权限;
子类不能重写父类中声明为private权限的方法
子类方法抛出的异常不能大于父类被重写方法的异常
注意:
子类与父类中同名同参数的方法必须同时声明为非static的(重写),或者同时声明为static的(非重写),因为static方法是属于类的,子类无法覆盖父类的方法。
重写是一种多态性:同名的方法,用不同的对象来区分调用的是哪一个方法。
关键字super
在Java类中使用super来调用父类中的指定操作:
super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造器中调用父类的构造器
注意:
尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
super的追溯不仅限于直接父类
super的用法和this相像,this代表本类对象的引用,super代表父类的内存空间的标识
调用父类的构造器
子类中所有的构造器默认都会访问父类中空参数的构造器
当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器,同时,只能 二选一 ,且必须放在构造器的首行
如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
this 和 super 的区别
子类对象的实例化过程
多态性
是面向对象中最重要的概念,在Java中的体现:
对象的多态性:父类的引用指向子类的对象,可以直接应用在抽象类和接口上
Java引用变量有两种类型:编译时类型和运行时类型
编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边
若编译时类型和运行时类型不一致,就出现了对象的多态性
多态情况下:看左边:看的是父类的引用(父类不具备子类特有的方法)
看右边:看的是子类的对象(实际运行的是子类重写父类的方法)
一个引用类型变量如果声明为父类的类型,但实际引用的是子类的对象,那么该变量就不能再访问子类中添加的属性和方法
虚拟方法调用
当一个引用类型变量声明为父类的类型,但实际引用的是子类的对象时,通过该父类引用变量直接访问的确是无法访问子类特有的属性和方法的。这是因为编译时,编译器只能确认到该变量的声明类型,即父类类型,编译器并不知道运行时该变量实际引用的对象类型。
然而,这并不意味着不能通过该父类引用变量调用子类覆写(Override)的方法。这里就要谈到“动态绑定”了。动态绑定,也叫做晚期绑定,是指在程序运行时(而非编译时),根据对象的实际类型来调用对应的方法。这是多态性的一种表现。
多态性允许我们通过父类的引用来调用子类的实现,这样的设计使得我们可以编写更加通用和灵活的代码。具体到方法调用时,即使是通过父类的引用变量,只要该方法在子类中被覆写了,那么实际上调用的就是子类中的方法实现。这就是动态绑定的工作原理。
例如,考虑以下Java代码片段:
class Animal {
void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
void eat() {
System.out.println("Dog is eating");
}
void bark() {
System.out.println("Dog is barking");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
a.eat(); // 动态绑定到Dog的eat()方法
// a.bark(); // 编译错误,因为Animal类中没有bark()方法
}
}
在上述代码中,尽管a
被声明为Animal
类型,但实际上它引用的是一个Dog
对象。因此,当调用a.eat()
时,由于存在动态绑定,所调用的实际是Dog
类中覆写的eat()
方法。然而,如果尝试调用a.bark()
,则会在编译时发生错误,因为在Animal
类中并不存在bark()
方法。
总结一下,动态绑定允许我们在运行时根据对象的实际类型调用相应的方法,这是实现多态性的关键机制。尽管不能直接通过父类引用访问子类特有的属性和方法,但我们仍然可以通过动态绑定来调用覆写的方法,实现多态的效果。
重载和重写的对比
多态小结
多态的作用:提高了代码的通用性,常称作接口重用
前提:需要存在继承或者实现关系,有方法的重写
成员方法:
编译时:要查看引用变量所声明的类中是否有所调用的方法
运行时:调用实际new的对象所属的类中的重写方法
成员变量:
不具备多态性,只看引用变量所声明的类
instanceof 操作符
检验x是否为类A的对象,返回值为boolean
要求x所属的类与类A必须是子类和父类的关系,否则编译出错
如果x属于类A的子类B,x instanceof A 值也为True
基本类型,包装类和String类间的转换
-128~127的整数对象会被缓存,直接使用
6
关键字:static
类属性、类方法的设计思想
类属性作为该类各个对象之间的共享的变量。在设计类时,分析哪些属性不因对象的不同而改变,这些属性设置为类属性,相应的方法设置为类方法
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用
static
使用范围:
在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享
访问权限允许时,可不创建对象,直接被类调用
因为不需要实例就可以访问static方法,所以static方法内部不能有this,super
static修饰的方法不能被重写
单例设计模式
应用场景
代码块
代码块(或初始化块)的作用:
对Java类或对象进行初始化
分类:一个类中代码块若有修饰符,只能被static修饰,为静态代码块;没被修饰的,为非静态代码块
static代码块通常用于初始化static的属性
程序中成员变量赋值的执行顺序
声明成员变量的默认初始化——显式初始化、多个初始化块依次被执行——构造器再对成员进行初始化操作——通过“对象.属性”或“对象.方法”的方式,可以多次给属性赋值
final关键字
表示 最终的
final标记的类不能被继承,提高安全性,程序可读性
String类、System类
final标记的方法不能被子类重写
比如:Object类的getClass()。
final标记的变量即称为常量。名称大写,且只能被赋值一次
final标记的成员变量必须在声明时或在每个构造器中或代码块中显示赋值,然后才能使用
final double MY_PI = 3.14
抽象类与抽象方法
用abstract关键字来修饰一个类,这个类叫做抽象类
用abstract来修饰一个方法,这个方法叫抽象方法
抽象方法,只有方法的声明,没有方法的实现,以分号结束。比如public abstract void talk();
含有抽象方法的类必须被声明为抽象类
抽象类不能被实例化,抽象类是用来被继承的,抽象类的子类必须重写父类的抽象方法,并提供方法体,若没有重写全部的抽象方法,扔为抽象类
不能用abstract修饰变量、代码块、构造器
不能用abstract修饰私有方法、静态方法、final方法、final类(不能继承)
接口
接口interface 是抽象方法和常量值定义的集合
特点: