static
static : 静态的 adj. 状态修饰符
作用的地方 : 修饰成员变量和成员方法-> 被修饰的成员变量叫静态的成员变量....
static修饰成员的特点:
1. 被static所修饰的成员被所有对象所共享 -> 一变则都变
2. 被static所修饰的成员可以直接使用类名访问 -> 方便使用
3. 被static所修饰的成员不属于对象属于类
4. 被static所修饰的成员随着类的加载而加载优先于对象
static的内存图
static的成员访问问题
非静态成员变量 | 非静态成员方法 | 静态成员变量 | 静态成员方法 | |
---|---|---|---|---|
非静态成员方法 | √ | √ | √ | √ |
静态成员方法 | X | X | √ | √ |
结论:
- 静态成员方法只能访问静态成员 -> 静态虽好,但是只能访问静态
- 非静态成员方法都可以访问
- 非要在静态方法内访问非静态成员,解决办法: 在静态方法内创建类的对象!
- 在静态方法内不可以使用this关键字
static关键字的应用场景
static关键字的应用场景 : 工具类 -> 利用的是static关键字不用创建对象可以直接使用类名调用的好处
例如: Arrays,Math,System ...
漂亮打印数组 : Arrays.toString(数组名);
快排 : Arrays.sort(数组名);
如何编写工具类
1. 定义类 类名叫 XxxxxUtil
2. 私有无参构造,并不提供其他任何构造方法
3. 把类中所有的成员变量和成员方法 全部用 static 修饰
继承
继承 : 第二大特性
Java类于类之间的关系;(类与类之间的关系: 父子关系,无关系)
继承的特点:
1. Java中类与类之间的继承是 单一继承,多层继承 -> 语法要求
2. 一个子类只能有一个父类,但是一个父类却可以有多个子类(多个子类之间无关系) -> 语法要求
*3. 子类继承父类,子类可以使用父类所有非私有的成员 -> 父爱如山
4. 父类不会使用子类的成员 -> 父亲是渣男,父类不知道自己有这个子类
*5. 子类要加载优先加载父类 -> 先有爹后有儿子
6. 子类对象会优先使用自己的成员,自己没有时才会使用父亲提供的 -> 儿子孝顺
继承的格式
继承的关键字 : extends
格式:
public class Fu extends Object{
}
public class Zi extends Fu{
}
当一个类没有继承任何父类,那么这个类默认继承 Object;
Object 根类,基类,超类 -> 是所有类直接或者间接的父类
炎黄子孙 -> Object 炎黄
继承关系下成员变量访问的特点
1. 在子类中访问:
自己有的用自己的,自己没有的找父类要,不能访问父类私有的
System.out.println("num = " + num);//333 优先访问局部
System.out.println("this.num = " + this.num);//222 强制访问本类成员
System.out.println("super.num = " + super.num);//111 强制访问本类父类成员
2. 在父类中访问:
只能访问自己的和自己父类的,不可以访问子类的成员
3. 在第三方类中,创建子类对象访问 :
子类对象可以使用自己的成员也可以使用父类的非私有成员
子类和父类都有相同的成员变量,优先使用自己的
继承关系下成员方法访问的特点
1. 在子类方法中访问:
自己有的就调用自己的,自己没有就找父类要
/this./method();//调用本类中的method
super.method();//调用本类父类中的method
2. 在父类方法中访问: 自己有的找自己,自己没有的不找儿子要
3. 在第三方类中,创建子类对象访问:
自己有的就调用自己的,自己没有就找父类要
方法的重写
方法的重载 : Overload -> 用的多,写的少
1. 在同一个类中
2. 方法名相同
3. 形参列表不同 (个数不同,类型不同,类型顺序不同)
4. 与返回值无关,与形参的变量名无关
方法的重写 : Override -> 别名: 方法的覆盖 -> 用的多,写的多
1. 必须有继承/实现关系
2. 子类中出现和父类 方法声明"完全相同"的方法 -> 99%
方法声明: 权限修饰符 返回值类型 方法名(形参列表)
3. 方法体可以不一样!
担心重写的方法格式写错了,推荐一个注解 : @Override
@Override : 写在子类重写方法的上方,用来约束子类重写方法的格式是否正确
方法重写中可以不同的板块: -> 了解,理解
1. 权限修饰符 : 子类的权限修饰符 >= 父类的权限修饰符 (public > protected > 不写 )
2. 返回值类型 :
父类的方法返回值是void,子类重写方法返回值必须也是void
父类的方法返回值是基本数据类型,子类重写方法返回值必须相同
父类的方法返回值是引用数据类型,子类重写方法返回值必须是父类方法的同类或者子类
Object > Number > Integer
static方法不存在重写的概念!!!
继承关系下构造方法的访问特点
子类要加载优先加载父类 -> 先有爹后有儿子
构造方法注意事项:
1. 每一个构造的方法的第一句代码默认存在隐藏的 : super();
2. 在构造方法内调用其他构造方法的语句只能作为构造方法的第一句代码
3. 一个构造方法内只能访问一次其他的构造方法,而且这句代码必须是第一句代码
4. 如果你在构造方法内调用了其他的构造方法,默认赠送的super()就不送了
5. 一个类中的多个构造方法内必须有一个构造方法去加载父类!!
九阳神功
前提 : 只要看到有对象调
第一步: 先找到对象创建的语句
类名 对象名 = new 类名(实参);
第二步: 看对象在干吗?
1. 对象.成员变量 : 编译看左边 运行看左边
2. 对象.成员方法 : 编译看左边 运行看右边
3. 类名.静态成员方法 : 编译看左边,运行看左边
//公式解释:
编译 : 公式中编译这个阶段是用来调错的!!
//如果代码有错,就看编译这句话,如果代码没有报错,忽略这句话
看左边 : 看等号左边的类中是否有这个成员(注意有没有继承关系,本类中没有还要去父类中看)
运行 : 公式中运行这个阶段是用来说结果的!!
看?边 : 看等号?边的类中那个成员是什么,是什么就执行什么!!
this 和 super的总结
this : 本类对象的引用
如何分辨this代表谁 : 哪个对象调用含有this的方法,this就是那个对象!!
-> 对象.方法 好比 对象照镜子 --> 镜子里出现的对象就是this代表的对象!
this的作用: 重要!!
this. -> 打破局部的约束,强制访问本类成员位置上的 成员
this(...) -> 调用本类的无参,带参构造方法
super : 本类父类对象的引用
如何分辨super代表谁 : 哪个对象调用含有super的方法,super就是那个对象的某个父类对象!!
-> 对象.方法 好比 对象照镜子 --> 镜子里出现的对象是此对象的父类对象,这个父类对象就是super代表的对象!
super的作用: 重要!!
super. -> 打破本类的约束,强制访问本类父类成员位置上的 成员
super(...) -> 调用本类父类的无参,带参构造方法
公式:
this.变量名: 访问本类成员位置上的变量
this.方法名(实参): 调用本类成员位置上的方法 -> 不会这么用
super.变量名: 访问本类父类成员位置上的变量
super.方法名(实参):调用本类父类成员位置上的方法
super(): 调用本类父类的无参构造方法 -> 创建子类时加载父类
super(实参) : 调用本类父类的有参构造方法 -> 创建子类时加载父类
this() : 调用本类无参构造方法
this(实参) : 调用本类有参构造方法
继承性
继承性的好处和弊端 :
好处:
1. 体现在抽取上!! --> 提高了代码的复用性!
假设多个子类中有相同的属性和行为,没有必要在每个子类中编写一份这样重复的属性和行为;
推荐把重复的属性和行为 抽取到一个父类中!! 让这些子类继承这个父类
2. 子类功能的拓展/对子类行为的约束 (角度: 父类往子类看)
龙生龙,凤生凤,老鼠的儿子会打洞!!
弊端:
1. 提高了代码的耦合性 (大原则: 高内聚,低耦合)
继承的利大于弊的!! 有机会继承 果断继承!!