目录
一、final
final修饰符,用来修饰
- 类: 修饰类,类不被继承
- 属性/变量: 修饰变量,变量不能被修改
- 方法: 修饰方法,方法不能被重写
1.1 final修饰类: 类不能被继承,即不能有子类
1.2 final修饰方法: 子类不能重写,但是可以正常使用
1.3 final修饰属性/变量: 变量为常量,不能再改变
三、static
3.1 语法特征
static修饰符,主要是用来修饰
- 属性
- 方法
static修饰属性和方法的语法特点
- static修饰的属性/方法
随着类加载而在内存出现并初始化
,而且是出现在内存的方法区
中 - static修饰的属性/方法在
内存中只有一份
,所以被该类所有对象共享
3.2 使用技巧
技巧1: 当某些属性/方法需要被共享使用时就加静态static, 比如售票的票数
public class Ticket {
static int num = 100;
public void sell(){
System.out.println("售出一张票" );
num--;
System.out.println("还剩"+num+"张" );
}
public static void main(String[] args) {
Ticket t1 = new Ticket( );
Ticket t2 = new Ticket( );
t1.sell();
t2.sell();
}
}
技巧2: 当某些属性和方法想要方便调用时,给加static
可以通过类名.方法() 类名.属性直接调用,不需要创建对象
int[] arr = {1,2,3,4};
System.out.println(Arrays.toString(arr ) );
System.out.println(Math.PI );
技巧3: 为了main方法方便调用时候,给方法加static
main方法是静态的,定义的方法也是静态的,静态调用静态可以直接调用,不用创建对象,
技巧4: 经常使用static 和final一起声明常量,称为静态常量
public static final int A = 1;
- 常量的命名规范: 所有字母都大写! 多个单词直接使用_分开
- public static final String ID_CARD = “41111111X”;
- public static final三个顺序没有关系,只不过习惯是写这个顺序
3.3 注意事项
-
静态可以调用静态,但是不能不调用非静态
- 因为静态的随着类加载就在内存出现了
- 其他属性和方法需要创建对象才会在内存出现
- 即有静态属性和方法的时候,不一定有非静态的属性
-
非静态可以调用静态,也可以调用非静态
- 因为非静态方法/属性需要对象调用
- 对象需要被类创建
- 类需要被加载
- 即非静态方法执行意味着,类已经加载且已经创建对象
public class TestStatic {
static int x = 1; // 静态属性
int y = 1; // 非静态属性
// a是静态方法
public static void a(){
b();//静态调用静态方法
System.out.println(x );//静态调用静态属性
//c(); //静态不能调用非静态方法
//System.out.println(y ); //静态不能调用非静态属性
}
// b是静态方法
public static void b(){}
// c是非静态方法
public void c(){
a(); // 非静态都可以调用
System.out.println(x );
System.out.println(y );
}
}
四、多态[重点]
4.1 什么是多态
-
生活中的多态: 多种状态/形态,变形金刚 ; 蝌蚪
-
代码中的多态: 是指的类中的方法,具体是指方法执行出现多种状态
4.2 怎么实现多态
要想实现同一个方法执行出现不同的状态,即多态,需要满足三个前提条件
- 1)继承/实现
- 2)重写
- 3)向上转型(子类对象赋值给父类引用/父类引用指向子类对象)
满足以上3个条件,再执行这个父对象的方法,执行出来的结果就会不一样
4.3 演示
// 父类
public class Animal {
public void eat(){
System.out.println("动物吃" );
}
}
// 子类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头" );
}
}
// 测试
public static void main(String[] args) {
// 向上转型(子类对象赋值给父类引用/父类引用指向子类对象)
Animal animal = new Dog( );
animal.eat();// 编译看父类,运行看子类
// eat() 执行的是Dog类的方法
// 多建一个Cat类,继承,重写,向上转型后,再调用eat()
}
4.4 为什么要多态
- 解/松耦合
- 方便扩展代码
假设: 目前设计一个方法,这个方法运行可以展示狗类吃东西的状况,如下
public static void main(String[] args) {
Dog dog = new Dog( );
show(dog);
}
public static void show(Dog dog){
dog.eat();
}
后来,动物园又来一个动物,猫,需要一个方法来展示猫如何吃东西,如下
public static void main(String[] args) {
Dog dog = new Dog( );
show(dog);
Cat cat = new Cat( );
show(cat);
}
public static void show(Dog dog){
dog.eat();
}
public static void show(Cat cat){
cat.eat();
}
}
再后来,动物园陆陆续续来了其他动物,老虎,猪,狮子等等很多动物,都需要展示如何吃, 该怎么办?
以现在的情况,每次来一个动物要展示吃,就需要该代码单独创建一个方法…
此时,就会考虑,能不能设计代码,让代码能够适应任何动物来,都不需要改代码? --> 多态
public static void main(String[] args) {
Dog dog = new Dog( );
show(dog);// 传参数,相当于给Animal赋值,即向上转型
Cat cat = new Cat( );
show(cat);
show(new Pig());
}
// 设计方法的参数为父类类型,
public static void show(Animal animal){
animal.eat();// eat()会多态展示,运行看子类
}
五、向上转型&向下转型
5.1 什么是向上转型
-
例如:Animal父类,Dog是子类
-
那么 Animal animal = new Dog(); 就是将子类对象赋值给父类引用,也就是子类对象向上转型变成了父类类型
为什么需要向上转型?
- 是因为利用多态来实现代码的扩展性
向上转型后,有一个注意事项:
- 转型后的父类对象,只能调用父类中有,或者是子父类中都有的,即子类中特有方法无法调用 —> 编译看父类,运行看子类
5.2 什么是向下转型
-
向下转型就是将父类对象变为子类对象过程
-
需要注意:需先向上转型后,再向下转型
-----------------------------------------------------------------------------------------------------------
为什么需要向下转型? 因为向上转型的父类,无法使用子类特有方法
- 因为需要转回成自己的子类对象,来调用子类特有的方法
六、每日一练【多态的使用】
- 创建三个类,组成一个继承树,表示游戏中的角色。
描述如下:- 父类:Role。是所有职业的父类。
- 属性:name,表示角色的名字。
- 方法:public int attack(),
- 该方法返回值为角色的攻击对敌人的伤害。
- Role 有两个子类:
- 1) 法师Magicer
- 属性:魔法等级(范围为1 ~ 10)
- 方法: public int attack(),
- 该方法返回法师的攻击对敌人造成的伤害值。
- 法师攻击伤害值为:魔法等级*魔法基本伤害值(固定为5)
- 2) 战士Soldier
- 属性:攻击伤害值
- 方法: public int attack(),
- 该方法返回战士的攻击对敌人造成的伤害值。
- 战士的攻击伤害值为:其攻击伤害属性值
- 注意:上述的三个类所有属性都应当作为私有,并提供相应的get/set 方法。
再设计一个Team 类,表示一个组队。具有如下方法- 1) addMember,表示组队增加一个成员。注意:组队成员最多为6 人
提示:应当利用一个数组属性,保存所有成员 - 2) attackSum,表示组队所有成员进行攻击时,对敌人造成的总伤害值
- 1) addMember,表示组队增加一个成员。注意:组队成员最多为6 人
参考UML类图
点这里获取参考代码
最后
如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍