1:多态 (1)对象在不同时刻表现出来的不同状态。 举例:狗(狗、宠物、动物) (2)多态的前提 A:要有继承或者实现关系。 B:要有方法的重写/实现。 C:要有父类引用或者父接口引用指向子类对象。 注意:多态有三种体现形式 类多态 抽象类多态 接口多态 (3)多态中的成员特点: A:成员变量 编译看左边,运行看左边。 B:成员方法 编译看左边,运行看右边。 为什么?因为方法存在重写,而变量没有。 举例:孔子扮父。 (4)多态的弊端: 父类(接口)引用不能使用子类特有功能。 为了解决这个弊端,我们需要向下转型。 Fu f = new Zi(); //向上转型 Zi z = (Zi)f; //向下转型 Zi z = new Zi(); (5)多态的好处: 可以提高代码的扩展性和可维护性。 2:抽象类 (1)如果多个类中存在相同的方法声明,而方法体不一样,我们就可以只提取方法声明。 如果一个方法只有方法声明,没有方法体,那么这个方法必须用抽象修饰。 而一个类中如果有抽象方法,这个类必须定义为抽象类。 (2)抽象类的特点 A:抽象类和抽象方法必须使用abstract修饰 B:抽象类不能被实例化 C:抽象类有构造方法,用于子类实例化使用 D:如果一个类是抽象类,那么,继承它的子类 要么是抽象类。 要么重写所有抽象方法。 (3)抽象类的成员特点 A:成员变量 可以变量,也可以是常量 B:构造方法 有构造方法 C:成员方法 可以有抽象方法,也可以有非抽象方法(全是抽象方法或者非抽象方法都是可以的) (4)抽象类的几个小问题 A:抽象类不能被实例化,为什么有构造? 用于子类实例化使用。 B:一个类没有抽象方法,为什么定义为抽象类? 不想被实例化,或者是抽取出来的一个规则类 C:abstract不能和哪些关键字共存。 final private static (5)案例: 老师案例 学生案例 另付学生类代码 /* 构造方法格式及特点: A:方法名必须和类名一致 B:没有返回值类型 C:没有具体的返回值
作用: 给对象进行初始化。 注意事项: A:如果你没有给出构造方法,那么,系统会默认给出一个无参构造方法。 public Person(){} B:假如你给了,会是什么情况呢? 只要你给出了构造方法,系统将不再提供无参构造。 推荐做法:请永远手动给出无参构造。 C:构造方法重载 其实就是构造方法接收不同的参数。
给成员变量赋值: A:通过set方法。推荐使用。 B:通过构造方法。 C:定义时手动赋值 */ class Person { private String name;//(private私有) private int age;//(private私有)
//构造方法 public Person()//(无参构造方法) { //System.out.println("无参构造方法"); }
public Person(String name)//(含参构造方法) { this.name = name; }
/* 这不是构造方法 public void Person() { System.out.println("haha"); } */
public void setName(String name)//(set方法) { this.name = name; }
public String getName()//(get方法) { return name; }
public void setAge(int age)//(set方法) { this.age = age; }
public int getAge()//(get方法) { return age; } } class PersonTest { public static void main(String[] args) { //创建对象 Person p = new Person(); p.setName("hello");//(set方法) System.out.println(p.getName());//(get方法)
System.out.println("-------------"); Person p2 = new Person("林青霞"); System.out.println(p2.getName());//(get方法) } }
|