final关键字
抽象类
接口
抽象类与接口的区别
Object类
package和import
访问权限控制
final关键字final表示不可改变的含义
1. 采用final修饰的类不能被继承
2. 采用final修饰的方法不能被覆盖
3. 采用final修饰的变量不能被修改
4. final修饰的变量必须显示初始化
5. 如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋值,但被指向的对象是可以修改的
6. 构造方法不能被final修饰
7. 会影响JAVA类的初始化:final定义的静态常量调用时不会执行java的类初始化方法,也就是说不会执行static代码块等相关语句,这是由java虚拟机规定的。我们不需要了解的很深,有个概念就可以了。
抽象类1. 在java中采用abstract关键字定义的类就是抽象类,采用abstract关键字定义的方法就是抽象方法
2.抽象的方法只需在抽象类中,提供声明,不需要实现
3. 如果一个类中含有抽象方法,那么这个类必须定义成抽象类
4.如果这个类是抽象的,那么这个类被子类继承,抽象方法必须被重写。如果在子类中 不复写该抽象方法,那么必须将此类再次声明为抽象类
5. 抽象的类是不能实例化的,就像现实世界中人其实是抽象的,张三、李四才是具体的
6. 抽象类不能被final修饰
抽象方法不能被final修饰,因为抽象方法就是被子类实现的 抽象类中可以包含方法实现,可以将一些公共的代码放到抽象类中,另外在抽象类中可以定义一些抽象的方法,这样就会存在一个约束,而子类必须实现我们定义的方法,有了多态的机制,我们在运行期就可以动态的调用子类的方法。所以在运行期可以灵活的互换实现。
采用abstract声明抽象类 class AbstractTest01 {
public static void main(String[] args) {
//不能实例化抽象类
// 抽象类是不存在,抽象类必须有子类继承
//Person p = new Person();
//以下使用是正确的,因为我们new的是具体类
Person p1 = new Employee();
p1.setName("张三");
System.out.println(p1.getName());
}
}
//采用abstract定义抽象类
// 在抽象类中可以定义一些子类公共的方法或属性
// 这样子类就可以直接继承下来使用了,而不需要每个
// 子类重复定义
abstract class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//此方法各个子类都可以使用
public void commonMethod1() {
System.out.println("---------commonMethod1-------");
}
}
class Employee extends Person {
}
class Student extends Person {
}
抽象的方法只需在抽象类中,提供声明,不需要实现,起到了一个强制的约束作用,要求子类必须实现
class AbstractTest02 {
public static void main(String[] args) {
Person p = new Employee();
// Person p = new Student();
// Person p = new Person();
p.setName("张三"); p.printInfo();
}
}
abstract class Person {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
} //此方法各个子类都可以使用
public void commonMethod1() {
System.out.println("---------commonMethod1-------");
}
//public void printInfo()
// {
// System.out.println("------Person.printInfo()--------"); //}
// 采用abstract定义抽象方法
// 如果有一个方法为抽象的,那么此类必须为抽象的
// 如果一个类是抽象的,并不要求具有抽象的方法
public abstract void printInfo();
}
class Employee extends Person {
//必须实现抽象的方法
public void printInfo() {
System.out.println("Employee.printInfo()");
}
}
class Student extends Person {
//必须实现抽象的方法
public void printInfo() {
System.out.println("Student.printInfo()");
}
}
如果这个类是抽象的,那么这个类被子类继承,抽象方法必须被覆盖。如果在子类中不覆盖该抽象方法,那么必须将此方法再次声明为抽象方法
抽象类不能被final修饰
抽象类中可以没有抽象方法
接口(行为)
接口我们可以看作是抽象类的一种特殊情况,在接口中只能定义抽象的方法和常量
1) 在java中接口采用interface声明
2) 接口中的方法默认都是public abstract的,不能更改
3) 接口中的变量默认都是public static final类型的,不能更改,所以必须显示的初始化
4) 接口不能被实例化,接口中没有构造函数的概念
5) 接口之间可以继承,但接口之间不能实现
6) 接口中的方法只能通过类来实现,通过implements关键字
7) 如果一个类实现了接口,那么接口中所有的方法必须实现
8) 一类可以实现多个接口
接口的进一步应用在java中接口其实描述了类需要做的事情,类要遵循接口的定义来做事,使用接口到底有什么本质的好处?可以归纳为两点:
1. 采用接口明确的声明了它所能提供的服务
2. 解决了Java单继承的问题
3. 实现了可接插性(重要)
以上代码不能灵活的适应需求,当需求发生改变需要改动的代码量太大,这样可能会导致代码的冗余,另外可能会导致项目的失败,为什么会导致这个问题,在开发中没有考虑到程序的扩展性,就是一味的实现,这样做程序是不行的,所以大的项目比较追求程序扩展性,有了扩展性才可以更好的适应需求
第二种方案,使用接口 UML,统一建模语言
接口和抽象类的区别?
a) 接口描述了方法的特征,不给出实现,一方面解决java的单继承问题,实现了强大的可接插性
b) 抽象类提供了部分实现,抽象类是不能实例化的,抽象类的存在主要是可以把公共的代码移植到抽象类中
c) 面向接口编程,而不要面向具体编程(面向抽象编程,而不要面向具体编程)
d) 优先选择接口(因为继承抽象类后,此类将无法再继承,所以会丧失此类的灵活性)
类之间的关系 1. 泛化关系,类和类之间的继承关系及接口与接口之间的继承关系
2. 实现关系,类对接口的实现 3. 关联关系,类与类之间的连接,一个类可以知道另一个类的属性和方法,在java语言中使用成员变量体现 4. 聚合关系,是关联关系的一种,是较强的关联关系,是整体和部分的关系,如:汽车和轮胎,它与关联关系不同,关联关系的类处在同一个层次上,而聚合关系的类处在不平等的层次上,一个代表整体,一个代表部分,在java语言中使用实例变量体现 5. 合成关系,是关系的一种,比聚合关系强的关联关系,如:人和四肢,整体对象决定部分对象的生命周期,部分对象每一时刻只与一个对象发生合成关系,在java语言中使用实例变量体现 6. 依赖关系,依赖关系是比关联关系弱的关系,在java语言中体现为返回值,参数,局部变量和静态方法调用 is-a、is-like-a、has-a 1. Is-a
2. is-like-a 3. has-a Object类
a) Object类是所有Java类的根基类
b) 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
toString()返回该对象的字符串表示。通常toString 方法会返回一个“以文本方式表示”此对象的字符串,Object 类的 toString 方法返回一个字符串,该字符串由类名加标记@和此对象哈希码的无符号十六进制表示组成,Object类toString源代码如下:
getClass().getName() + '@' + Integer.toHexString(hashCode())
finalize垃圾回收器(Garbage Collection),也叫GC,垃圾回收器主要有以下特点:
1. 当对象不再被程序使用时,垃圾回收器将会将其回收
2. 垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他,尽快回收资源(System.gc和Runtime.getRuntime().gc())
3. 垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize方法
4. GC主要针对堆内存
5. 单例模式的缺点
当垃圾收集器将要收集某个垃圾对象时将会调用finalize,建议不要使用此方法,因为此方法的运行时间不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行
==与equals方法等号“==”
等号可以比较基本类型和引用类型,等号比较的是值,特别是比较引用类型,比较的是引用的内存地址
import进行导包
JDK常用开发包
1. java.lang,此包Java语言标准包,使用此包中的内容无需import引入
2.java.sql,提供了JDBC接口类
3. java.util,提供了常用工具类
4. java.io,提供了各种输入输出流
访问控制权限java访问级别修饰符主要包括:private protected和public,可以限定其他类对该类、属性和方法的使用权限
注意 以上对类的修饰只有:public和default,内部类除外
内部类在一个类的内部定义的类,称为内部类 内部类主要分类:
1. 实例内部类
2. 局部内部类
3. 静态内部类
实例内部类1.创建实例内部类,外部类的实例必须已经创建
2. 实例内部类会持有外部类的引用
3. 实例内部不能定义static成员,只能定义实例成员
静态内部类1. 静态内部类不会持有外部的类的引用,创建时可以不用创建外部类
2. 静态内部类可以访问外部的静态变量,如果访问外部类的成员变量必须通过外部类的实例访问
局部内部类局部内部类是在方法中定义的,它只能在当前方法中使用。和局部变量的作用一样 局部内部类和实例内部类一致,不能包含静态成员
匿名内部类是一种特殊的内部类,该类没有名字



