包
package表示关键字,表示打包,讲下面写的类打包
com.hspedu表示包名
包的本质
aaa_bbb为一个包;ccc_ddd为一个包;两个包下面有不同的类,还有同名的类,由于所在包不同,所以允许类同名
当创建不同包下相同类名的对象时
其中一个类要导包,引入;另一个要不能导包,使用时要加上完整的包名和类名
包的命名
数字不能开头
常用的包
java.lang下的类可以直接使用不用导入
由于Math是lang包下的类,直接用类.方法名即可调用
导包区别
第一种导入改包下的所有类,第二种只导入了Scanner类
导入一个类并使用它的方法,如图所示
导入了Arrays类,使用他的sort()方法对数组进行排序
package细节
访问修饰符,用于定义方法和属性
访问修饰符的访问范围
访问修饰符还可以修饰类,但是只能用public和默认来修饰;成员方法的访问也遵循上述条件
由于A类和B类在同一个包下,所以在B类创建A类的对象是不需要导包
在不同的包下只能访问其它类的public修饰的属性或方法
封装
封装的实现步骤(3步)getset方法
1.将属性私有化(不允许从外部直接用访问修饰符来修改属性)
2.提供一对get()和set()方法;set()用于修改、设置属性值,里面还有数据的验证;get()用于获取数据,返回一个类型的数据,里面可能还有对于权限的判断,用来判断是否可以获取信息
对set方法添加数据验证
封装与构造器
可以在构造器中调用同类的set方法来设置属性
增加一个方法,英语查看账户信息
继承
继承的概念与基本语法
继承示意图
A类中拥有B类和C类共有的属性和方法
B类继承A类,拥有A类的属性和方法,且拥有自己的属性和方法;D类继承B类,拥有A类和B类的属性和方法,且拥有自己的属性和方法(所有继承都要通过extends关键字来实现),D是B的子类也是A的子类
继承的细节
1.
非私有的方法和属性在子类中能直接访问,私有方法和属性在子类中不能直接访问,要通过父类提供的公共方法去访问
父类提供一个公共方法返回私有变量n4的值
子类调用方法去访问
父类提供一个公共方法去调用私有方法
子类调用公共方法访问test400()
2.
创建子类对象时,不管使用什么构造器,父类的构造器会先被调用,默认调用父类的无参构造器
如果父类没有无参构造器,需要用super去指定使用父类哪个构造器
在子类的所有构造器中默认有一句super()默认调用父类的构造器
在创建子类对象时,无论使用什么构造器都会调用父类的构造器
父类没有无参构造器的情况下需要用super
3.
在子类构造器中调用父类的无参构造器:1.不写super()2.加super()
super只能放在构造器第一行,不能和this()调用构造器一起使用,super是对父类的构造器,this是对本类构造器,两者不能共存只能2选1;super只能在构造器中使用,不能在成员方法中使用
4.
5.
单继承,若想让A使用B和C中的方法,先让A继承B,再让B继承C
继承的本质
首先执行new Son();加载Son类的信息,在加载之前会先找到Son的父类加载父类的信息
在爷类,父类和子类中虽然都有同一个的变量名name,但是不会影响,三个name分配的空间不一样
先加载类,根据继承关系来确定加载顺序,加载完再从最顶层的类开始分配空间
访问属性的规则
通过对象访问一个属性,若该类没有该属性父类有,但是不能访问(),会直接报错,不会继续查找上一级的类;如果想访问父类的private属性,要在父类中写一个public方法,返回该属性的值,再用对象进行调用
例子1
流程:创建B类对象时,使用B类中的无参构造器,在B类的无参构造器中因为有this,所以屏蔽了super(有this没super),故在B()方法中不会访问父类的无参构造器,直接来到B(String name)方法中,在此方法中再调用父类的无参构造器故先输出a,再回到B(String name)中输出b name,执行完再回到B()中输出b
例子2
创建子类继承父类,若父类没有无参构造器,子类会调用父类的有参构造器,那么子类就会报错
创建了子类后后会默认子类拥有一个无参构造器,这个无参构造器会调用父类的无参构造器,若父类没有无参构造器则报错
在子类中将父类属性初始化
在子类构造器中调用super调用父类的构造器进行属性初始化,在子类中定义属性,也应该使用getset方法
从子类中获取子类特有属性和从父类继承属性的两种方法:
1.调用get方法获取
2.使用父类中获取全部信息的方法(由于此方法返回值的类型是String所以可以从中获取)
super关键字
1.super可以访问父类中除了私有的属性
在子类中直接访问n1和super.n1的区别,直接访问n1会根据就近原则去访问,如果子类中也有n1那么会访问子类中的n1,而super.n1则会直接去父类中访问
2.super访问父类的方法
super.方法名(参数列表),直接调用和super.方法名()的区别和属性一样,super只能访问父类的属性
注:参数列表和形参列表不一样
3.super在子类构造器中访问父类构造器
super(参数列表)
super细节
1.调用父类构造器
2.子类的成员(属性和方法)重名,用super可以指定访问父类的成员(属性和方法),super只能访问父类的方法,故super第一步会跳过本类直接从父类查找方法,其它逻辑和下面直接访问父类的方法一样
直接访问方法或this.方法名()从子类开始寻找方法
方法的查找在方法区开始查找,从子类开始,找到方法就访问,找到不能访问报错,最终在Obeject类中找不到就会报无法解析can't resolve
查找属性,直接访问和用this访问属性
使用super访问属性
3.
super不仅仅只查找父类的属性或方法,若父类中没有,会继续向上查找爷类是否有;若父类与爷类方法重名且形参列表相同,则会根据就近原则调用父类的方法;若父类与爷类的方法重名且形参列表不同,则可通过super.方法名(传入不同的参数列表)来选择调用父类还是爷类中的方法
super和this
方法重写(覆盖)
子类的父类不一定是一级的关系,也可以是子类和爷类
在子类Dog中重写了cry()方法;名称,返回类型,参数要和父类中的cry()方法一样
方法重写的细节
1.进行方法的重写时要保证方法的形参列表和方法名与父类一致
2.子类在重写方法时,方法的返回类型要与父类的返回类型相同或者子类的返回类型是父类的子类。如:父类的m1()方法返回类型是Object,子类m1()方法的返回类型是String,编译可以通过,Object是所有类的父类,而String是lang包下的一个类,故满足子类m1方法的返回类型是父类m1方法返回类型的子类。如A类是B类的父类,若子类方法的返回类型是B,父类方法的返回类型是A,那么很满足方法重写。
3.子类方法不能缩小父类方法的访问范围,访问范围要和父类访问范围一样或者扩大访问范围
父类是默认的访问范围,子类是public通过编译
重写和重载的不同
重写方法中只用super访问父类的方法
子类的say用super调用父类的say()方法,将信息输出。由于父类的属性是私有的,不能直接访问父类属性。只能通过调用父类的get方法获取私有属性或者用super调用父类输出信息的方法获取私有属性