1.私有的定义
如果一个方法里面的属性是由private修饰的话就无法被继承 私有
用private修饰的属性想要调用的话得通过get或set方法 私有
2.公有属性
公有属性Public则可以直接调用
3.extends
利用extends关键字表明**类继承**类
继承使子类可以直接使用父类的菲斯有属性和方法
1.父类是无法使用子类的自由成员属性的(无论共有还是私有)
2.兄弟之间也是无法共享自有成员属性的(无论共有还是私有)
小结:
一个子类只能有一个父类
子类可以访问父类非私有成员
子类自己自由成员其他兄弟无法访问
父类不可以访问子类的自由成员
4.方法的重写
对于方法的重写,指的是在子类中重新描述父类中的方法。
方法的重写,要求返回值类型,方法名,参数类型、顺序、个数都要与父类继承的方法完全一致。
实现方法的重写 实际上是子类不想直接使用父类中的方法逻辑,要求针对自身情况做出修改
当子类重写父类方法之后,子类对象调用的是重写之后的方法。
方法重载与方法重写
在学习中,我们有可能会把方法重载和方法重写混淆。所以我们来通过一个表格认识一下方法重载与方法重写的区别
方法的签名是由方法的方法名和形参列表(注意:包含方法的参数和类型)组成
| 方法重载 | 方法重写 | |
|---|---|---|
| 类关系 | 发生在同一个类中 | 发生在有继承关系的子类与父类中 |
| 方法签名 | 方法名相同,参数列表不同(参数顺序、个数、类型) | 方法名相同,参数列表相同(参数顺序、个数、类型) |
| 返回值 | 返回值任意 | 返回值相同或返回值呈现父子关系 |
| 访问修饰符 | 访问修饰符任意 | 访问修饰符的访问范围需要大于等于父类的访问范围 |
| 参数名 | 与方法的参数名无关 | 与方法的参数名无关 |
当要实现重写的方法的话 重写方法的访问修饰符必须是比父类的方法问修饰符范围大 也就是private<default<protected<public
[email protected]注释
通过@Override//该注解用于去验证注解下的方法是否属于重写方法
如果不是重写方法就会出现的报错(参数名不变 参数数据类型相同 参数名可以不同)
如果是重写的话就不会出现任何的报错
重写方法就是在子类当中利用重写覆盖了父类当中的方法 调用的话是直接调用子类当中的重写方法的
Java依靠方法签名区分方法(有方法名和参数列表组成)
重写方法的返回值必须相同或呈现父子关系
虽然Java不存在属性的重写,但是它可以在子类中定义与父类类同名的属性
在不同的包中使用其他包中的类需要引用,在同一个包中应用不是private的类不需要引用
6.修饰符属性:
Private修饰的内容只能在本类中被使用(换了一个类或者换了一个包之后就无法被调用了)
最大访问范围在同一个类 常用来修饰类的属性
Default访问修饰符default和switch中的default不同 作为访问修饰符的default不可以被明确的写出来 (String name)正确 (Default String name)错误
最大访问范围在同一个包中 不怎么常用
Protected 使用extends继承父类后的子类跨包子类!!!在不同包的子类中使用被protected修饰的内容是有限制的 需要借助new出子类对象 然后通过子类对象去进行调用父类中被protected修饰的内容
最大访问范围在不同包的子类当中 常用于父类为子类准备的属性和方法,即父类不打算使用这些属性和方法
Public 不管是在本类中还是跨包引用都可以被调用,访问权限最大
最大访问范围是全局范围 常用来修饰类的方法
访问修饰符
访问控制修饰符能修饰的对象包括:属性、方法、构造器
访问修饰符可以用来限制成员被访问的范围,即用来控制被修饰的成员可以在哪里(包)被使用。
| private | default | protected | public | |
|---|---|---|---|---|
| 同一个类 | √ | √ | √ | √ |
| 同一个包 | √ | √ | √ | |
| 子类 | √ | √ | ||
| 全局范围 | √ |
- private: 只允许在本类中进行访问(访问权限最小的)
- public: 允许在任意位置访问(访问权限最大的)
- protected: 允许在当前类、同包子类/非子类、跨包子类调用;跨包非子类不允许
- default: 允许在当前类、同包子类/非子类调用;跨包子类/非子类不允许调用
在实际的开发中,大部分的场景使用 private 定义属性,public 定义方法。
7.关键字Super
Super关键字代表着对父类对象的引用 this代表着对本类对象的引用 调用本类的属性和方法
Super只能写在子类定义的方法中,在main方法中不能直接使用spuer 调用父类的属性和方法
- 子类重写父类的方法,则父类的方法会被隐藏,隐藏的方法或者成员变量可以通过super关键字访问
- 引入super关键字的原因是可以使用被隐藏的成员变量和方法,而且super只能在子类的方法中定义使用
父类的构造方法不允许被继承,不允许被重写
无论是通过子类的有参或无参构造器构造
先加载父类静态属性
加载父类静态代码块
记载子类的静态属性
加载子类的静态代码块
进入子类的构造器
由子类构造器继承父类静态资源
加载子类的静态代码块
进入子类的构造器(没有加载)
由子类构造器进入父类构造器
加载父类的成员属性
加载父类的构造代码块
加载父类的构造器
直接加载子类的构造代码块(没有加载子类成员属性)
加载了子类的构造器
生成子类对象
构建子类对象一定会加载父类的构造器
在创建子类对象时,如果没有明确指示的话,调用的是父类的无参构造器
所以在写一个类的时候一定得保证编写一个无参构造器
Super必须写在构造器的第一行
一个构造器中this()和super()只能选择一个
Super(添加父类多参构造器的对应参数)调用的是父类的构造器
总结:
- 子类默认调用父类无参构造方法;
- 可以通过
super()调用父类允许访问的其他构造方法; -
super()必须放在子类构造方法的有效方法的第一行,而且只能出现一次。 -
this()和super()在同一构造器中只可能出现一个。
super,this,super()和this()
| super | this | super() | this() | |
|---|---|---|---|---|
| 用处 | super可以用在子类的成员方法中 | this可以用在本类中的成员方法中 | super()可以用在子类的构造器中 | this()可以用在本类的构造器中 |
| 目的 | 调用父类非私有(no private)的成员变量或方法 | 调用本类的成员变量或方法 | 调用父类的构造器 | 调用本类的构造器 |
super和this可以同时出现的,而super()和this()不能同时出现在一个构造器中
不写无参构造器,该类无法被继承-在所有的子类明确指示不适用父类的无参构造器时,可以不写无参构造器
8.equals
上面的代码返回值都是false 作用都是比较这两个所指向的内存地址是否一致
如果一个方法的参数为引用类型,实际参数可以是该引用类型对象及其子类对象
9.Object类
Object类是所有类的老祖宗,如果有一个类没有显式的说明继承自哪个类,那么该类就默认的继承Object类。
对于Object类,它有着如下的特点
-
Obejct类是所有类的父类 - 一个类没有使用
extends关键字明确标识继承关系,则默认继承Object类(包括数组) - Java中每个类都可以使用
Ojbect类中定义的方法
接下来,我们就来结合Java API(JDK文档)来看看Java中对于Object类的介绍
文档地址:http://www.matools.com/api/java8
当参数为Object类型时,因为Object时所有类的父类,所以参数其实可以是任意类型
Equals方法用于比较调用当前equals方法的对象和参数对象是否相等
如果一开始就强制改变输入的Object类型为某种数据类型来进行比较
则调用对比的时候 数据类型对比会优先对比与自己数据类型相近的数据类型方法比较
10.final
在定义方法或属性时,访问修饰符位置和控制修饰符位置可以互换
Final在修饰属性的属性值时不可修改的
Final修饰的属性可以通过设置初始值赋值
Final修饰属性时无论在什么方法中都不可以赋值
Final修饰的属性只可以在全部的构造器(无参构造器和有参构造器)中赋值
Final修饰的属性可以在构造代码块中赋值
如果是static final修饰的属性的话 就需要在静态代码块中进行赋值
Final当修饰的变量是引用数据类型,对象不允许再重新实例化(不想允许再被new),但此对象的属性值是可以更改的
Final很少用来修饰类和方法 最常用的就是修饰属性 和static共用
Final static修饰的内容一般常量名是字母全部大写
Final不能修饰构造方法