一、多态
1.多态的前提
1)要有继承关系
2)要由方法重写
3)要由父类引用指向子类对象
2.访问特点
1)成员变量
编译看父类,运行看父类.
2)成员方法
编译看父类,运行看子类.
3)静态方法
编译看父类,运行看父类.
3.多态的好处
1)提高代码的维护性
2)提高代码的扩展性
3.多态的弊端
不能再使用子类的特有功能.
4.多态的向上转型和向下转型
向上转型相当于数据的默认类型转换,向下转型相当于数据的强制类型转换.
二、抽象类
1.应用
1)类:abstract class 类名 { }
2)方法:public abstract void xxx();
2.特点
1)如果定义了一个抽象类,其方法必须重写.
2)抽象类中不一定有抽象方法,但抽象方法的类一定是抽象类.
3.注意事项
1)成员比昂两既可以是变量,也可以使常量.
2)有构造方法,用于子类访问父类数据的初始化.
3)成员方法既可以是抽象的,也可以使非抽象的.
4)一个抽象类如果没有抽象方法,也可以作为一个抽象类.这样其他类将不能再创建本类对象,只能由子类来完成.
5)abstract不能和private、static、final一起使用.
三、接口
接口的成员比昂两只能是静态的常量.接口中定义的常量前面会默认省略public static fanal.接口中所有的方法都是抽象的,可直接写方法名: void xxx(){ }前面默认省略public abstract.
1.类与类之间的关系
继承关系,只能单继承,或多层基层.
2.类与接口之间的关系
实现关系,可以单实现也可以多实现.还可以在继承一个类的同时实现多个接口.
3.接口与接口之间的关系
继承关系,可以单继承,也可以多继承.
1.多态的前提
1)要有继承关系
2)要由方法重写
3)要由父类引用指向子类对象
2.访问特点
1)成员变量
编译看父类,运行看父类.
2)成员方法
编译看父类,运行看子类.
3)静态方法
编译看父类,运行看父类.
3.多态的好处
1)提高代码的维护性
2)提高代码的扩展性
3.多态的弊端
不能再使用子类的特有功能.
class TestAnimal{ public static void main(String[] args){ Person p = new SuperMan(); System.out.println(p.name); p.谈生意(); SuperMan sm = (SuperMan)p; sm.救人(); } } class Person{ String name = "John"; public void 谈生意(){ System.out.println("谈生意"); } } class SuperMan extends Person { String name = "超人"; public void 谈生意(){ System.out.println("谈几个亿的生意"); } public void 救人(){ System.out.println("飞出去救人"); } }
4.多态的向上转型和向下转型
向上转型相当于数据的默认类型转换,向下转型相当于数据的强制类型转换.
二、抽象类
1.应用
1)类:abstract class 类名 { }
2)方法:public abstract void xxx();
2.特点
1)如果定义了一个抽象类,其方法必须重写.
2)抽象类中不一定有抽象方法,但抽象方法的类一定是抽象类.
3.注意事项
1)成员比昂两既可以是变量,也可以使常量.
2)有构造方法,用于子类访问父类数据的初始化.
3)成员方法既可以是抽象的,也可以使非抽象的.
4)一个抽象类如果没有抽象方法,也可以作为一个抽象类.这样其他类将不能再创建本类对象,只能由子类来完成.
5)abstract不能和private、static、final一起使用.
class TestTeacher{ public static void main(String[] args){ 基础Teacher jc = new 基础Teacher("张三",23); jc.speak(); 就业Teacher jy = new 就业Teacher("李四",24); jy.speak(); } } abstract class Teacher{ //抽出一个老师类 private String name; private int age; public Teacher(){} //老师类的空参构造方法 public Teacher(String name,int age){ //老师类的有参构造方法 this.name = name; this.age = age; } public void setName(String name){ //设置姓名 this.name = name; } public String getName(){ //获取姓名 return name; } public void setAge(int age){ //设置年龄 this.age = age; } public int getAge(){ //获取年龄 return age; } public abstract void speak(); //讲课方法 } class 基础Teacher extends Teacher{ public 基础Teacher(){} public 基础Teacher(String name,int age){ super(name,age); } public void speak(){ System.out.println("我叫" + getName() + "我今年" + getAge() + "岁,我教se"); } } class 就业Teacher extends Teacher{ public 就业Teacher(){} public 就业Teacher(String name,int age){ super(name,age); } public void speak(){ System.out.println("我叫" + getName() + "我今年" + getAge() + "岁,我教ee"); } }
三、接口
接口的成员比昂两只能是静态的常量.接口中定义的常量前面会默认省略public static fanal.接口中所有的方法都是抽象的,可直接写方法名: void xxx(){ }前面默认省略public abstract.
1.类与类之间的关系
继承关系,只能单继承,或多层基层.
2.类与接口之间的关系
实现关系,可以单实现也可以多实现.还可以在继承一个类的同时实现多个接口.
3.接口与接口之间的关系
继承关系,可以单继承,也可以多继承.
class TestAnimal { public static void main(String[] args) { System.out.println("Hello World!"); } } abstract class Animal { private String name; private int age; public Animal(){} public Animal(String name,int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public abstract void eat(); public abstract void sleep(); } interface Jump { public void jump(); } class Cat extends Animal implements Jump { public Cat(){} public Cat(String name,int age) { super(name,age); } public void eat() { System.out.println("猫吃鱼"); } public void sleep(){ System.out.println("侧着睡"); } public void jump() { System.out.println("猫跳高"); } }