一:包
1.包的作用:相当于一个文件夹,保证类的唯一性,导入类的成员与方法
2.怎样导入包(import):
普通包的导入:
(1)import 包名.类名
eg:import person.china;
(2)import 包名.* ;(导入这个包的所有类)
eg:import person.* ;
静态包导入(导入一个类的静态方法和属性):
import static 包名.类名;
作用:静态方法和静态属性可以在当前类中直接调用,无需使用类名调用
二:封装(包的访问权限)
封装:封装自己的属性和方法(把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法set、get)
private:同一包中的同一类
default:同一包中的不同类
protected:不同包中的子类(可以在不同包中只能被自己和自己的子类调用)
public:任何时候都可以调用
private<default<protected<public
三.继承(extends)
1.继承的含义和调用
(1)子类继承父类的所有成员变量和成员方法,还可以根据自身情况扩展
(2)一个子类只能继承一个父类,但是子类可以多层继承 (可以有孙子)
(3)实例化子类时编译器会先实例化父类,子类使用super访问父类对象,调用时先调用父类再调用子类
2.final关键字
(1)修饰属性
表示这个属性是常量,无法被修改
(2)修饰类
表示这个类到此为止不能被继承,但可以被调用
若要保证当前类的唯一性,用final修饰当前类,保证此类所有人用的都是一样的
(3)修饰方法
该方法不能被重写
3.组合
一个类包含其他类,例如学校类包含学生类和老师类
4.类和类的三种关系
继承(树状)、组合(包含)、毫无关系
例题:求:输出顺序
静态代码块:用于初始化静态成员属性,不管类产生多少对象,静态代码块在类加载时调用,且只调用一次,优先于其他代码块。程序从main开始执行,main用到哪个类就加载哪个类,所以静态代码块优先于main执行(3->6->7)
构造代码块:用于初始化成员变量,优先于构造代码执行,并且有几个对象产生构造块就执行多少次(2->1->5->4->2->1->5->4)
子类和父类:调用子类先调用父类
四、多态
1.普通的引用
当前类 当前类的引用名称=new当前类();
eg:Person person=new Person();
2.引用的向上转型
父类 父类引用名称=new 子类();
eg:Person person =new China();
China继承Person
3.向上引用的表现形式
(1)直接赋值
Person person=new China();
(2)传参
向上引用用于方法传参,传父类,子类都可以用,不用再为子类参数不一样去重载多次
(3)方法返回值,把一个子类对象转换为一个父类的引用
4.动态绑定
父类应用调用子类对象,看new谁,就调用谁
5.方法的重写
发生在有继承关系的类中,子类的方法名、参数个数和类型、返回值(向上引用除外)与父类完全相同
重写的两个的要求:
(1)子类重写方法权限要大于等于父类
(2)子类的返回值与父类一直,向上转型除外
方法的重载:
发生在一个类中,方法的名称相同,参数个数或类型不同的一组方法,与返回值无关,也无权限要求
6.多态
一个引用在不同场景调用同一个方法表现出的不同行为(向上转型+方法重写:父类和子类写了一组重写方法,子类对象根据父类引用调用这组重写方法,产生不同行为)
被调用的方法参数为父类,根据不同对象的引用,行为不同
使用多态的优点:
(1)对于调用者,使用成本降低
eg:对于动物类和它的子类,只需要动物类来操作子类
(2)避免多个if else分支和重载方法
(3)很方便进行扩展
新子类产生,调用时不用添加代码,直接用父类调用