(一)面向对象(多态)
多态概述:
多态实质上是同一个对象相应不同消息的能力,你理解不了也可以把它理解为事物存在的多种形态.
当然了能够理解实质当然更好.
多态的前提:
要有继承关系,
要有方法重写,
要有父类的引用指向子类的对象.
多态中成员访问的特点
成员方法:
在编译的时候看的是父类中是否有该方法,运行的时候看的是子类的方法为什么呢,
在这里我就和你说说但是看不懂只要记住编译看左边运行看右边.因为在具体的方法分析如下
假设父类子类都有print()方法.
在编译的的时候是父类的.class文件先加载进去然后是子类的.class文件加载到方法去.然后main方法进栈,此时father f = new son() father f 在主方法中,new son(在堆内存中开辟内存(包含super()内存标识,是访问父类的成员变量)此时地址值赋值给father f,这个时候father f指向new son 堆内存中的super内存标识(他只能看到super的内存标识),此时f中有方法f.print()方法.此时编译的时候看的是指向父类.class文件中的print()方法.
而运行的时候却是指向子类print()方法.(被复写)所以真正进栈的是子类的print()方法.
具体的如图所示
成员变量
这里就不分细成员变量具体在内存中的运行步骤了
成员变量和静态方法一样,编译和运行都是看左边
(二)面向对象(抽象类)
(1):抽象类
说实在内谈谈个人理解.
就是把事物的共同拥有的属性或者行为(却不能真的不知道是具体怎么实现的)把这些向上抽取出来装进一个类中,这就是我理解的抽象类.
(1):抽象类特点
1,抽象类的修饰词必须用abstract关键字修饰
abstract class 类名 { }
2,抽象方法修饰
public abstract void 方法名();
在这里谈到抽象类我就想说说他和接口的区别进行比较的和你们分享下我的理解:
在JAVA中学习和比较,都是三个方面成员方法,成员变量,构造方法
抽象类:
成员变量,可以是常量也可以是变量.但是变量的时候不能被abstract修饰
成员方法,可以有抽象和非抽象的,抽象的方法是强迫子类要去复写的,非抽象的方法是子类继承的,提高代码的复用性
构造方法, 有!!!!!他是给子类访问父类数据时候初始化使用的.
接口:
狭义的是就是java中得interface
广义的是就是给外部提供规则的都是借口
成员变量,只能是创来了给你,(共有静态最终) 被public static fainl修饰
成员方法只能是抽象的方法 public abstract
构造方法 没有!!!!!!!(他的实例化是通过多态实现的)
那么,类和接口的关系是什么?java中他们有什么联系>?
类与类
继承 单继承
类与接口
实现 但实现多实现
接口与接口
继承 但继承多继承
(3):实例(抽象类和接口的运用)
案例:
动物类:姓名,年龄,吃饭,睡觉。
猫和狗
动物培训接口:跳高
猫和狗
动物培训接口:跳高
class Animal_2 {
public static void main(String[] args) {
Cat c = new Cat("加菲",8);
c.eat();
c.sleep();
JumpCat jc = new JumpCat("跳高猫",3);
jc.eat();
jc.sleep();
jc.jump();
}
}
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 Jumping { //跳高的接口
public void jump();
}
class Cat extends Animal {
public Cat() {} //空参构造
public Cat(String name,int age) {//有参构造
super(name,age);
}
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("侧着睡");
}
}
class JumpCat extends Cat implements Jumping {
public JumpCat() {} //空参构造
public JumpCat(String name,int age) {//有参构造
super(name,age);
}
public void jump() {
System.out.println("猫跳高");
}
}