重新编辑了一下上一篇文章,加了案例上去
导包的格式:import 包名;
修饰符的分类:权限修饰符,状态修饰符
权限修饰符:
修饰符 | 同一个类中 | 同一个包中子类无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
private | √ | |||
默认 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
状态修饰符:①final(最终态)可以修饰成员方法,成员变量,类
修饰方法:表示该方法是最终方法,不能被重写
修饰变量:表示该变量是常量,不能再次被赋值
修饰类:表面该类是最终类,不能被继承
②static(静态)可以修饰成员方法,成员变量
静态成员方法只能访问静态成员
多态:同一个对象,在不同时刻表现出来的不同形态
多态的前提:有继承/实现关系;有方法重写;有父类引用指向子类对象
定义一个Animal的父类,子类为Cat,定义一个测试类实现多态的测试
/*
动物类
*/
public class Animal {
public int age = 40;
public void eat() {
System.out.println("动物吃东西");
}
}
/*
猫类
*/
public class Cat extends Animal {
public int age = 20;
public int weight = 10;
@Override
public void eat(){
System.out.println("猫吃鱼");
}
public void playGame(){
System.out.println("猫捉迷藏");
}
}
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.age);
// System.out.println(a.weight);报错,多态编译看左边
a.eat();
// a.playGame();报错,多态编译看左边
}
}
/*
40
猫吃鱼
*/
通过上面的实例可以得出多态中成员访问的特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右边
问:为什么成员变量和成员方法的访问特点不一样?
答:因为成员方法有重写,而成员变量没有 。
多态的好处:提高了程序的扩展性,定义方法的时候使用父类型作为参数,将来在使用的时候没使雍具体的子类型参与操作
多态的弊端:不能使用个子类的特有功能
多态的转型,父类和子类的代码和上面一样就不再贴一遍了,测试类代码如下
/*
向上转型从子到父,父类应用指向子类对象
向下转型从父到子,父类应用转为子类对象
*/
public class AnimalDemo {
public static void main(String[] args) {
//多态
Animal a = new Cat();//向上转型
a.eat();
// a.playGame();多态无法访问子类的特有成员
Cat c = (Cat) a;//向下转型
c.eat();
c.playGame();
}
案例:猫和狗(多态版)
案例:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
/*
动物类
*/
public class Animal {
public String name;
public int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat() {
System.out.println("动物吃东西");
}
}
/*
猫类
*/
public class Cat extends Animal {
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
/*
测试类
*/
public class AnimalDemo {
public static void main(String[] args) {
//多态
Animal a = new Cat();
a.setName("加菲");
a.setAge(5);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
//new之后两个a的地址值不一样
a = new Cat("加菲", 5);
System.out.println(a.getName() + "," + a.getAge());
a.eat();
}
}
/*
加菲,5
猫吃鱼
加菲,5
猫吃鱼
*/