标签:Java 子类 age Cat Animal 抽象类 eat
抽象类
和抽象类离不开的是抽象方法,由于子类中对同一个方法的实现方式不同,引入了方法和抽象类,比如:
package Chouxianglei;
public class MainDemo {
Animal a=new Cat();
a.eat();
int a=a.age;
}
package Chouxianglei;
public abstract class Animal {
int age=20;
public abstract void eat();
}
package Chouxianglei;
public class Cat extends Animal{
int age=40;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
(1)由于不同的Animal对eat方法的实现不尽相同,我们在抽象类Animal中定义了抽象方法eat,在继承时,子类必须实现父类中的所有抽象方法,除非子类也是抽象类
(2)抽象类不能直接实例化,我们只能通过子类来进行间接实例化,所以我们定义了变量a,a的引用是Animal类但其被实例化为Cat,对于a.eat();语句,程序会直接运行eat方法在子类Cat中的重载,对于a.age,由于a的引用是Animal类的,引用的地址存在栈中,a的实例化是Cat,存在堆中,程序运行时是无法直接访问堆内存的,也就无法访问堆内存中Cat类里面的age(因为程序直接访问的时栈内存,而栈中并不存有Cat类中age的引用),所以a.age访问的是Animal里面的age成员。(这里有点不好理解)
(3)抽象类在作为参数或返回值进行传递时,本质上传递的是抽象类的实例化对象,这里很好理解,方法本质上是对具体的东西进行处理,传个引用过去当然不合理啦
标签:Java,子类,age,Cat,Animal,抽象类,eat 来源: https://blog.csdn.net/weixin_51235620/article/details/120382611
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。