设计模式(重点)
单例
说明:这种模式只产生一个对象(只有一个实例)
应用场景: windows资源管理器,java数据库中的连接池,网站的计数器,一般也是采用单例模式实现,否则难以同步。
步骤:
1. 私有化构造参数
2. 定义一个类方法用于获得单例的对象
3. 在类中提供一个这个类类型的类属性(要用static修饰)
4. 在类方法中返回实例化的对象
final
修饰变量
用final修饰的变量不能修改
修饰在类属性上
这个属性必须要初始化或者在构造函数中赋值,如果有多个构造方法,那每个方法都要给这个final属性初始化
修饰在方法
final修饰的方法不能被重写
修饰在类上
不能被继承
继承(重点)
面向对象的三个基本特征: 继承、多态、封装
继承是描述两个类的关系,如果两个类有重复的属性和方法,我们就可以使用继承的方式来实现/设计。
语法:
class 子类名称 extends 父类{
属性名
方法名
}
1.继承中,子类会把父类的所有属性和方法都继承下来 ,包括static和final (除了私有的属性和方法)。
2.子类继承父类后,还可以拥有自己的属性和方法
3.子类只能获得父类的非private属性,private的方法也是不能继承下来的。
4.java中,只能单继承
super关键字
作用
1.子类实例化的过程中,父类构造器先被调用,然后再调用子类的构造器(在子类构造器内部默认的调用super());
2. 子类通过构造器实例化时调用了父类的默认构造器,是隐含的调用了super()这个方法,但是如果子类的构造器中调用了父类的有参构造方法,那么无参的构造器就不会被调用。不能在子类构造器中同时调用两次super()
- super()的调用要放在第一行
- super可以表示父类的引用,我们可以使用super和this来区分父类和子类的同名属性。在子类中访问属性的查找顺序首先在子类中查找指定的属性名,如果在子类中没有找到该属性。那么就去父类中去查找该属性。
方法也是一样,当子类和父类拥有同样的方法时,通过子类调用这个方法时,调用的是子类的方法。但是我们通过super对父类的引用来调用父类的方法。
this代表当前类的指定实例的引用
方法的重写
重写(override): 在子类继承父类时,子类的方法和父类的方法相同(访问修饰限制符,返回值类型,方法名,参数列表),方法体不同。这种子类的方法将父类的方法覆盖叫重写(父类的方法不能满足子类的需求时,要重写 ,重写不代表消失,可以使用super来调用父类方法)
重载(overload): 同一个类中,有相同的方法名,但是参数的类型或者参数的个数不同,这两个方法就是重载。
父子类之间的类型转换
子类转成父类
- 如果子类对父类的方法有重写,并且子类的实例赋值给父类的引用,通过这个引用调用的方法是子类的方法。
- 父类指向子类实例的引用不能够调用子类的独有的方法和属性
- 如果父子类有同名的属性,那么父类指向子类实例的引用调用的属性是父类的属性,和方法不一样
父类转成子类
1.父类转换成子类不能自动完成,需要强制转换。
2.父类转成子类的前提是,原先这个父类的引用指向的就是子类的实例。这样就可以访问子类的独有属性和方法。
3.子类之间不能互相转换(编译能通过,但是运行会报错)
抽象类(重点)
说明: 当多个类存在共同的行为,但是有不同的实现逻辑,这个方法可以使用抽象方法实现
定义:
abstract class 类名{
}
使用:
抽象类不能实例化,即不能创建对象,只能被继承,然后实例化。
继承抽象类的非抽象类必须实现抽象方法。
抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类。
抽象类可以继承抽象类,可以不用实现抽象方法。
抽象的方法不能加private ,final,static修饰
接口(重要)
说明
一个类所具有的方法的特征集合,是一种逻辑上的抽象。
说明:
- 接口中的方法不能使用private和final
- 接口不能实例化,需要有类来实现接口,并且实现接口的抽象方法。
- 接口中的方法默认就是抽象的
- 接口可以多继承,因为接口只定义行为,并不包含类别的含义,不指代具体的事物。
- 接口中可以定义常量,常量默认会带public static final。该常量不能修改。一般我们通过"接口名.常量" 来访问
方式:
interface 类名称{
}
和抽象类的区别:
- 一个类只能继承一个类,是单继承的,但是一个类可以实现多个接口
- 抽象类有实例变量,而接口只能有常量(static 修饰的变量)
- 接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
jdk1.8的接口
1.在接口中定义static方法
2.在接口中定义默认方法
default void 方法名称(){
}
在 java 8 之前,接口与其实现类之间的耦合度太高了,当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。
多态(重要)
多态的条件
- 子类对父类有方法的重写
- 父类的引用指向子类的实例,调用重写的这个方法的时候,调用的是子类的方法。
包(package)
类似文件夹,对类做分类管理,可以区分同名不同包的类
不同的包可以创建相同的类
扫描器Scanner(了解)
作用:
扫描器的作用就是让我们运行程序的时候可以从控制台来输入数据.
Scannerscan=newScanner(System.in);
// 从键盘接收数据
while(true) {
System.out.println("nextLine方式接收:");
// 判断是否还有输入
if (scan.hasNextLine()) {
Stringstr2=scan.nextLine();
System.out.println("输入的数据为:"+str2);
}
}
}
内部类
说明: 类内部的类就是内部类
把一个类定义到另一个类中,那么这个就是内部类。
注意点:
内部类不能直接创建,内部类的外部类如果要访问内部类的方法,必须创建内部类的对象,根据内部类的对象来访问。
创建内部类的语法:
外部类.内部类 变量名 = new 外部类对象.new 内部类对象
特点:
1.本类可以直接创建内部类对象
2.内部类可以访问外部类的属性和方法。
注意点: 内部类和外部类属性同名时: 内部类访问外部类方法: 外部类名称.this.外部类属性
匿名内部类
packagecom.mashang;
publicclassTest03 {
publicstaticvoidmain(String[] args) {
//匿名内部类
Teacherteacher=newTeacher() {
@Override
publicvoidteach() {
System.out.println("teach不知道什么课");
}
@Override
publicvoidplay() {
System.out.println("play 不知道什么游戏");
}
};
teacher.teach();
}
}
Object(重要)
说明:
Object是所有类的根类,所有的类都是直接或者间接继承Object类的
toString()
返回该对象的字符串表示。通常toString方法会返回一个"已文本方式表示" 此对象的字符串。结果应该是一个简明但易懂的信息表达式
hashCode()
由Object类定义的hashcode方法给不同的对象返回不同的整数
finalize()
用于垃圾回收,我们不用手动去调用,有JVM来调用,当垃圾回收器确定不存在该对象的引用时,由对象的垃圾回收器调用此方法
equals()(重要)
比较两个对象地址的值。自定义类重写equals用来比较这两个对象是否相等。