目录
用super操作被隐藏的成员变量和方法,也可以使用super调用父类的构造方法
1.包
1.1包的作用
(package:将一个或者多个类打包)
- 区分相同名字的类,并且可以保存管理类(一个包下面有多个类,不同包里面可以有相同名字的类)
- 控制访问范围
1.2包的基本语法
(关键字:package)
语法:package+包名
Eg: package task1;
包的命名规则:包含字母,数字,下划线,小圆点,不能以数字开头,不能是关键字。
1.3常用包
java.lang.*//不需要引入的基本包
java.util.*//使用Scanner提供工具包,工具类
Java.net.*//网络开发
java.awt.*//界面开发
1.4包的引入
语法:import +包名;
2.访问修饰符
2.1种类:4种;
2.2作用:控制方法和属性的调用权限
2.3分类:
- private 私有的 只有类本身可以访问
- default 默认的 对同一个包的类公开
- protected 保护的 对子类和同一个包中的类公开
- public 公开的 所有的类都可以访问
访问控制修饰词 | 同类 | 同包 | 不同包中的子类 | 不同包中的非子类 |
private | T | F | F | F |
default(默认的) | T | T | F | F |
protected | T | T | T | F |
public | T | T | T | T |
2.4.被protected修饰的成员对于本包和其子类可见。
子类和父类不在同一个包中,在Other类中创建子类对象,Other类和父类在同一个包中时,子类继承父类的protected成员才能被访问。
protected的可见性:
- 对于子类a自己声明的protected成员变量和方法,只要在other类和a类在同一包中,object对象就可以访问这些protected成员变量和方法
- 对与子类a从父类继承的protectd成员变量和方法,需要追溯到这些protected成员变量和方法所在到“祖先类”。 Eg:
3.封装
封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。
封装的目的在于保护信息.
3.1封装的实现步骤
- 目的:将属性进行私有化(private)【让外部不能直接修改属性】
- 提供一个公有的set方法(public),用于对属性判断并赋值。
public void setXXX(类型 参数名){ 属性=参数名; }
- 提供一个公有的get方法(public),用于获取属性的值。
public 数据类型 getXx(){ return xx; }
4.继承
继承是一种由已有的类创建新类的机制。
利用继承,我们可以先创建一个共有属性的一般类(父),根据该一般类再创建具有特殊属性的新类(子),新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。
Java不支持多重继承(子类只能有一个父类)
子类可以继承父类的非私有方法和成员变量,也可以重写父类的非私有(private修饰的)方法。所有子类的方法都默认访问父类的无参构造。
(1)子类与父类
1.1父类
被继承的类称为父类(超类) 。
1.2子类
由继承而得到的类称为子类;
1.2.1子类的定义:
修饰符 class 子类名 extends父类名(){
//…………………………
}
注意⚠️:一个子类只可以继承一个父类,而一个父类可以被多个子类继承
1.3类的树形结构
除了Object类,每个类都有且仅有一个父类,一个类可以有多个或零个子类。
(Java的类按继承关系形成树形结构这个树形结构中,根节点是Object类( Object是java.lang包中的类),即Object是所有类的祖先类。)
(如果一个类(除了Object类)的声明中没有使用extends关键字,这个类被系统默认为是Object的子类,即类声明“class A”与“class A extends Object"是等同的。)
(2)子类的继承性
注:子类文件和父类文件的存储关系:同一个包内 或者 不同包内。
2.1子类与父类在同一包中的继承性
子类和父类在同一个包中,子类自然地继承了其父类中非private的成员变量和方法。
继承的成员变量或方法的访问权限保持不变。
2.2子类与父类在不同包中的继承性
如果子类与父类不在同一个包中,则子类只会继承父类public、protected的变量和方法,继承的变量和方法的访问权限保持不变。
(private和的fault修饰的变量和方法不能被继承)
子类和父类不在同一个包中,在Other类中创建子类对象,Other类和父类在同一个包中时,子类继承父类的protected成员才能被访问
2.3继承使用细节⭐️⭐️
(1)子类必须继承父类的构造方法
- 子类必须调用父类的构造方法,完成父类的初始化,会默认调用父类的无参构造方法,隐藏super();
- 如果父类没有提供无参构造方法,必须在子类的构造方法中用super去指定使用父类的某个构造方法完成对父类的初始化工作,否则,编译不会通过。
(2)子类调用父类构造方法
- 子类希望指定去调用父类的某个构造方法,则显示的调用super(参数列表)。
- super在使用时必须放在构造方法的第一行,即super必须在构造方法中使用。
- super( )和this( )都只能放在不同的构造方法的第一行。
2.4继承关系的UML图
如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束。
(3).子类与对象
3.1子类对象的特点
· 如果访问的成员变量子类中有,则优先访问子类本身的。
· 如果访问的成员变量子类中无,父类中有,则访问继承下来的。
· 如果子类与父类中有同名的成员变量,则优先访问子类自己的,即子类将父类的同名变量隐藏 。
成员变量的访问遵循就近原则,自己有就优先访问自己的。
3.2—instanceof运算符
(1)—instanceof使用情况说明:
对象a instanceof 类A
- instanceof 是 Java 的保留关键字。
- 作用是:测试它左边的对象是否是它右边的类的实例(对象),返回 boolean 的数据类型。
- instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
(2)—instanceof使用说明:
- 说明下:类的实例包含本身的实例,以及所有直接或间接子类的实例。
- instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误。
- 左边的对象实例不能是基础数据类型
- null用instanceof跟任何类型比较时都是false
(4).成员变量的隐藏和方法的重写
4.1成员变量的隐藏
在子类中 声明成员变量时,如果所声明的成员变量的名字和从父类继承来的成员变量的名字相同(类型可以不同),子类就会隐藏所继承的成员变量,对该成员变量进行重新定义和调用。
class Father{
String s = "父类";
}
class Son extends Father{
String s = "子类";//!!!!!
}
class TestDemo{
public static void main(String[] args) {
Son son = new Son();
System.out.println(son.s);//output:子类
}
}
4.2方法的重写
(1)重写的定义:
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。
(2)重写和重载的区别:
名称 | 发生范围 | 方法名 | 形参列表 | 返回类型 | 修饰符 |
重载(overload) | 本类 | 必须一样 | 类型,个数或顺序至少有一个不同 | 无要求 | 无要求 |
重写(override) | 父子类 | 必须一样 | 相同 | 子类重写的方法。返回的类型和父类返回的类型一致,或者是其子类 | 子类方法不能缩小父类方法的访问范围 |
(3)重写的注意事项:
- 子类中重写的参数列表,返回类型必须完全与被重写方法的参数列表,返回类型相同;
- 子类重写的访问权限必须比父类中被重写的方法访问权限更高或者相等;
- 父类的成员方法只能被它的子类重写。
- 构造方法不能被重写。
-
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
-
如果不能继承一个方法,则不能重写这个方法。
- 声明为final的方法不能被继承,也就不能被重写。声明为static的方法不能被重写,但是能够被继承。
(子类和父类在同一个包中,那么子类可以重写父类所有除了声明为private和final的方法;
子类和父类在不同包中,那么子类只能够重写父类的声明为public和protect的非final方法。)
class Father{
String s = "父类";
void print(){
System.out.println("父类的print");
}
}
class Son extends Father{
String s = "子类";
void print(){
System.out.println("子类的print");
}
void printDemo(){
print();
super.print();//!!!!!!
}
}
class TestDemo{
public static void main(String[] args) {
Son son = new Son();
son.printDemo();
}
}
//输出:子类的print
//输出:赋类的print
(5).—super关键字
5.1—super的作用:
用super操作被隐藏的成员变量和方法,也可以使用super调用父类的构造方法
如果子类中存在与父类同名的方法成员,则通过关键字super在子类方法中访问父类方法成员
5.2-super的使用原则:
使用super访问遵循就近原则。
5.final关键字
final关键字可以用来修饰变量,成员方法以及类。
5.1修饰变量或字段,表示常量(即不能修改)
final int a = 10;
a = 20;//编译报错
5.2修饰类,表示类不能继承
final public class Person{
}
public class Student extends Person{
}//编译报错
5.3修饰方法,表示方法不能被重写