当多个类中出现了相同的功能,但是功能主体不同;这时,可以向上抽取,只抽取功能定义,而不抽取功能主体。
当一个类中有抽象方法的时候,该类也必须是抽象的
抽象的特点:
1,抽象方法一定在抽象类中
2,抽象方法和抽象类都必须被abstract关键字修饰
3,抽象类不能创建对象,因为调用抽象方法没有意义
4,抽象类中的抽象方法要被使用,必须由子类继承该类后重写所有的抽象方法后,建立子类对象调用
5,如果子类只覆盖部分抽象方法,那么该子类仍然是一个抽象类
6, 抽象类中可以有非抽象方法
7,一个抽象类中可以没有抽象方法(唯一的作用不让该类创建对象)
可以将一个体系中的共性的东西定义成抽象。好处:有强制性
每一个应用程序中,都会有共性的功能,可以将这些共性的功能进行抽取,独立封装,以便复用 。
但是发现了问题:
1,对象是用于封装数据的。可是ArrayTools对象中并未封装特有数据
2,ArrayTools类中的每一个方法,都没有访问到该类对象的特有数据。
这时,我们就可以考虑,如果让程序更严谨,是不需要对象的,那么我们就可以将ArrayTools中的方法都定义成静态的,直接通过类名调用。
如果想让程序更严谨,不让创建对象,可以将该类的构造函数封装(private修饰)
Person1 p = new Person1("zhangsan",20);
这句话都做了什么事情?
1,在栈内存中为变量p分配了一定的空间
2,因为new的操作用到了Person.class,所以会先找到Person.class文件,并加载到内存中
3,执行该类中的静态代码块。
4,在堆内存中开辟空间,分配地址值。
5,在堆内存中建立对象的特有属性,并进行默认的初始化赋值(null,0)
6,对特有属性进行赋值为zhangsan和20
7,对对象进行构造代码块的初始化
8,对对象进行对应的构造函数的初始化
9,将地址值赋值给栈内存中的p变量
extends 关键字表示继承
Teacher extends Person2表示 Teacher 继承了 Person2
Person2:父类(基类,超类)
Teacher:子类
子类继承父类后,就可以拿到父类中所有的非私有的成员
继承好处:
1,提高了代码的复用性
2,有继承关系,才出现了多态
注意:千万不要为了获取另一个类的功能,简化代码而继承,只有当两个类真正存在所属关系的时候才可以继承
java 语言 只支持 单继承,不支持多继承 (每个类只能有一个父类)但是支持多层继承B extends A , C extends B
学习一个继承体系的时候:查阅父类功能,创建子类对象使用功能
java保留c++ 多继承的机制,用另一种形式体现:多实现(因为多继承有安全隐患)
1,成员变量 2, 成员方法 3,构造函数
一、成员变量
当子父类中有同名变量时,子类对象访问的是子类的变量,如果在子类中想要访问父类同名变量时,要使用super。如:super: 父类对象
二、成员方法
当子父类中有同名的方法时,子类对象调用该方法,执行的是子类的方法这种情况称之为 重写(覆盖)
重写和重载的区别:
1,重载:只看同名函数的参数列表(和返回值无关)
2,重写:子父类中的方法是否一模一样(包括返回值类型和参数列表)
子父类的出现使功能的扩展更加的灵活
覆盖注意事项:
1,子类覆盖父类的方法,必须保证子类的方法的权限大于或者等于父类权限
2,静态方法只能覆盖静态方法
三、构造函数:
构造函数可以重写吗?
构造函数没有重写的概念:因为构造和类名保持一致
创建子类对象时,父类的构造函数也被调用了。因为子类构造函数的第一行,有一个默认的super();super()是用来给子类的构造函数访问父类构造函数的
Object(上帝类)是所有类的父类
创建子类对象时,一定是要先访问父类的构造函数的。如果父类空参的构造函数被重载了,那么我们就需要自己手动在子类的构造函数第一行加入对应的super语
1,可以修饰类,方法,变量(局部,成员)
2,被final修饰的类,不可以被继承
3,被final修饰的方法,不可以被重写
4,被final修饰的变量,是一个常量,不能被再次赋值
格式:
static{
静态代码块中执行的语句
}
什么时候被调用?
当一个类被加载到内存中时,该类中的静态代码块就会被执行。并且只会执行一次。
最先执行。 静态代码块:是对类做初始化的。
(什么东西是类一存在就必须存在的,那么,这个东西就要放到静态代码块中)
修饰符:修饰类的成员(成员变量、成员方法)
特性:1,被静态修饰的成员,是被对象所共享的。
2,被静态修饰的成员,与对象无关,先于对象存在。
多了一种调用方式:类名调用。 格式:类名.成员
3, 静态修饰的成员,是随着类的加载而加载的。
生命周期:和类保持一致。最长。
实例变量和类变量的区别:
1,存放位置:类变量是随着类的加载而存在于方法区中实例变量是随着对象存在于堆内存中
2,生命周期:类变量的生命周期最长,随着类的存在而存在随着类的消失而消失
实例变量的生命周期相对较短,随着对象的存在而存在,随着对象的消失而消失。
使用静态的注意事项:
1,静态方法只能访问静态成员(成员变量和成员方法)
非静态方法既能访问静态成员也可以访问非静态成员
2,静态方法中不能定义this,super关键字
3,主函数是静态的。
好处:对对象所共享的数据进行了单独空间的储存,节省了空间。可以直接类名调用,方便。
弊端:生命周期过长访问出现了局限性(静态虽好,只能访问静态)
什么时候使用静态?
1,什么时候成员变量需要定义成静态?
当对象中出现共享数据时,这些共享数据可以定义成静态(特有数据必须定义成非静态)
2,什么时候定义静态方法?
当方法内部没有访问到非静态成员(特有数据),那么该方法可以定义成静态的。
应用:工具类(工具类中的方法一般都是静态的)