面向对象的三大特征:
1.封装
2.继承
3.多态
多态:一个对象具备多种形态(父类的引用类型变量指向了子类的对象 或者 接口的引用类型变量指向了接口实现类的对象)
多态的前提:必须存在继承或者继承的关系
多态要注意的细节:
1.多态情况下,子父类存在同名的(静态和非静态)成员变量时,访问的是父类的成员变量
2.多态情况下,子父类存在同名的非静态成员函数时,访问的是子类的成员函数
3.多态情况下,子父类存在同名的静态成员函数时,访问的是父类的成员函数
4.多态情况下,不能访问子类特有的成员(成员变量和成员方法)
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名的非静态函数时才是访问子类的
编译看左边(解释第3点),运行不一定看右边(解释总结的话)
编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的
成员,如果不具备马上编译报错
/**
* Author:Liu Zhiyong
* Version:Version_1
* Date:2016年4月24日17:19:47
* Desc:
面向对象的三大特征:
1.封装
2.继承
3.多态
多态:一个对象具备多种形态(父类的引用类型变量指向了子类的对象 或者 接口的引用类型变量指向了接口实现类的对象)
多态的前提:必须存在继承或者继承的关系
多态要注意的细节:
1.多态情况下,子父类存在同名的(静态和非静态)成员变量时,访问的是父类的成员变量
2.多态情况下,子父类存在同名的非静态成员函数时,访问的是子类的成员函数
3.多态情况下,子父类存在同名的静态成员函数时,访问的是父类的成员函数
4.多态情况下,不能访问子类特有的成员(成员变量和成员方法)
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名的非静态函数时才是访问子类的
编译看左边(解释第3点),运行不一定看右边(解释总结的话)
编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的
成员,如果不具备马上编译报错
*/
interface A
{
int a =1;
public void print();
}
class Animal
{
String name;
static String color = "动物颜色";//1.多态情况下,子父类存在同名的(静态和非静态)成员变量时,访问的是父类的成员变量
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(name + "动物吃吃吃吃。。。。");
}
}
class Mouse extends Animal
{
static String color = "老鼠颜色";
String bb = "hhh"; //特有的成员变量
public Mouse(String name){
super(name);
}
public void eat(){
System.out.println(name + "老鼠吃大米。。。。");
}
public void dig(){ //特有的成员函数
System.out.println(name + "打洞。。。。");
}
}
class Demo55 implements A
{
public void print(){
}
public static void main(String[] args)
{
Animal animal = new Mouse("老鼠");
System.out.println(animal.color);
// System.out.println(animal.bb);
animal.eat();
// animal.dig();
}
}
多态的应用:
1.多态用于形参类型的时候,可以接收更多类型的数据
2.多态用于返回值类型的时候,可以返回更多类型的数据
多态的好处:
提高了代码的拓展性
/**
* Author:Liu Zhiyong
* Version:Version_1
* Date:2016年4月24日21:26:34
* Desc:
多态的应用:
1.多态用于形参类型的时候,可以接收更多类型的数据
2.多态用于返回值类型的时候,可以返回更多类型的数据
多态的好处:提高了代码的拓展性
*/
abstract class Myshape
{
public abstract void getArea();
public abstract void getCircumference();
}
class Circle extends Myshape
{
public static final double PI = 3.14;
double r;
public Circle(double r){
this.r = r;
}
public void getArea(){
System.out.println("圆形面积:" + PI*r*r);
}
public void getCircumference(){
System.out.println("圆形周长:" + 2*PI*r);
}
}
class Rect extends Myshape
{
double width;
double height;
public Rect(double width, double height){
this.width = width;
this.height = height;
}
public void getArea(){
System.out.println("矩形面积:" + width*height);
}
public void getCircumference(){
System.out.println("矩形周长:" + 2*(width+height));
}
}
class 梯形 extends Myshape
{
public void getArea(){
System.out.println("梯形面积:" );
}
public void getCircumference(){
System.out.println("梯形周长:" );
}
}
class Demo56
{
public static void main(String[] args)
{
Circle c = new Circle(2);
print(c);
Rect rect = new Rect(1, 1);
print(rect);
梯形 t = new 梯形();
print(t);
Myshape my = getShape(11);
print(my);
}
//需求1:定义一个函数可以接收任意类型的图形对象,并且打印图形的面积与周长
public static void print(Myshape myshape){//Myshape myshape = new Rect(1,1); //这就是多态
myshape.getArea();
myshape.getCircumference();
}
//需求2:定义一个函数可以返回任意类型的图形对象。
public static Myshape getShape(int i){
if(i == 0){
return new Circle(4);
}else{
return new Rect(1, 1);
}
}
}