变量相同字父类不会被覆盖,而方法相同子类会覆盖父类方法,java在调用方法时会调用实际new时对象的方法,new Student 那么如果Student中有fun则调用,没有才查找父类中有没有fun方法,而属性会直接根据引用调用,引用是Person,就调用Person的i,写程序时是根据引用来写的,所以不可能你引用Person,会写出子类的属性,比如Student有个自己的属性j,你通过to肯定找不到j,如果引用是Student则调用Student的i,
嘉陵ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
JAVA中一个抽象类抽象方法继承与对象多态性的例子
面向对象的三大特点:封装,继承,多态。
在JAVA中我们总是尽可能地让一个类继承一个抽象类,这样大大的节省代码方便开发。
一个继承与对象多态性的例子:声明一个Person 类。Student 类,Worker类分别继承Person。
人有姓别,年龄,学生有特有的成绩属性,工人有特有的工资。
所有属性都用private封装
abstract class Person{
private String name;
private int age;
public Person(String name,int age){
this.setName(name);
this.setAge(age);
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public void say(){
System.out.println(this.getContent());
}
public abstract String getContent();
}
class Worker extends Person{
private float salary;
public Worker(String name,int age,float salary){
super(name,age);
this.setSalary(salary);
}
public void setSalary(float salary){
this.salary=salary;
}
public float getSalary(){
return this.salary;
}
public String getContent(){
return "工人信息------姓名:"+super.getName()+",年龄:"+super.getAge()+",工资:"+this.getSalary();
}
}
class Student extends Person{
private float score;
public Student(String name,int age,float score){
super(name,age);
this.setScore(score);
}
public void setScore(float score){
this.score=score;
}
public float getScore(){
return this.score;
}
public String getContent(){
return "学生信息------姓名:"+super.getName()+", 年龄:"+super.getAge()+",成绩:"+this.getScore();
}
}
public class OODemo11{
public static void main(String []args){
Person p=null;
p=new Student("张三",23,90);
p.say();
p=new Worker("李师傅",26,3000);
p.say();
}
}
运行结果:
学生信息------姓名:张三, 年龄:23,成绩:90.0
工人信息------姓名:李师傅,年龄:26,工资:3000.0
package extend;
/**
* 圆类
* @author 枫雅
* 2019年3月21日
*/
public class Circle {
private double r;
public final static double PI = 3.14;
public Circle(double r) {
this.r = r;
}
public double Circumference(double r) {
return 2*PI*r;
}
public double Area(double r) {
return PI*r*r;
}
}
package extend;
/**
* 圆柱类,继承自圆类
* @author 枫雅
* 2019年3月21日
*/
public class Cylinder extends Circle{
private double h;
public Cylinder(double r, double h) {
super(r);
this.h = h;
}
public double CeArea(double r, double h) {
return super.Circumference(r)*h;
}
public double Volume(double r, double h) {
return super.Area(r)*h;
}
}
package extend;
/**
* 圆锥类,继承自圆柱类
* @author 枫雅
* 2019年3月21日
*/
public class Cone extends Cylinder{
public Cone(double r, double h) {
super(r, h);
}
public double CeArea(double r, double h) {
return super.CeArea(r, h)/2;
}
public double Volume(double r, double h) {
return super.Volume(r, h)/3;
}
}
package extend;
/**
* 测试类
* @author 枫雅
* 2019年3月21日
*/
public class Test {
public static void main(String[] args) {
double r = 3;
double h = 2;
Circle circle = new Circle(r);
System.out.println("半径为:" + r + " 圆的周长为:" + circle.Circumference(r));
System.out.println("半径为:" + r + " 圆的面积为:" + circle.Area(r));
Cylinder cylinder = new Cylinder(3, 2);
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆柱的侧面积为:" + cylinder.CeArea(r, h));
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆柱的体积为:" + cylinder.Volume(r, h));
Cone cone = new Cone(3, 2);
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆锥的侧面积为:" + cone.CeArea(r, h));
System.out.println("底部半径为:" + r + ",高为:" + h + " 圆锥的体积为:" + cone.Volume(r, h));
}
}
简单写了下,希望对你有帮助
建议你找一下Java转型方面的资料
class Vehicle{
protected void vehicleRun(){
System.out.println("vehicle!!!");
}
}
class Truck extends Vehicle{
//子类覆写父类“vehicleRun方法”
protected void vehicleRun(){
System.out.println("It's Truck!!!");
}
protected void truckRun(){
System.out.println("truck!!!");
}
}
class Test{
public static void main(String [] args){
Vehicle v = new Vehicle();
v.vehicleRun(); //父类方法
//向上转型
Vehicle v1 = new Truck();
v1.vehicleRun(); //子类覆写后方法
//向下转型
Truck t = (Truck)v1;
t.vehicleRun();
t.truckRun();
}
}
public class Test {
public static void main(String[] args){
Test2 t2 = new Test2();
t2.t1();
System.out.println("继承的变量:"+t2.i);
}
}
class Test1{
int i=100;
public void t1(){
System.out.println("这是父类的方法");
}
}
class Test2 extends Test1{
}
看看下面这个例子,就会明白了:JAVA中继承可以实现代码复用,
由于在父类中已经定义的方法,被子类继承以后,就可以使用,实现了代码的复用
class Father{
private int moneyDollar=300;
int moneyHK=200;
int add(int x,int y){
return x+y;
}
}
class Son extends Father{
int moneyRMB=800;
public void changMoneyHK(int x){
moneyHK=x;
}
public void changMoneyRMB(int x){
moneyRMB=x;
}
int subs(int x,int y){
return x-y;
}
}
class GrandSon extends Son{
int multi(int x,int y){
return x*y;
}
}
public class Example5_1{
public static void main(String args[]){
int a=5,b=3;
Son son=new Son();
GrandSon sunzi=new GrandSon();
son.changMoneyHK(666);
son.changMoneyRMB(5000);
System.out.println("儿子的港币是继承的属性,当前的值是:"+son.moneyHK);
System.out.println("儿子的人民币是新增的属性,当前的值是:"+son.moneyRMB);
System.out.printf("减法是儿子新增的功能,%d-%d等于%d\n",a,b,son.subs(a,b));
System.out.printf("加法是儿子继承的功能,%d+%d等于%d\n",a,b,son.add(a,b));
System.out.println("孙子的港币和人民币都是继承的属性,,当前的值是:");
System.out.println("港币:"+sunzi.moneyHK+" 人民币:"+sunzi.moneyRMB);
System.out.printf("乘法是孙子新增的功能,%d*%d等于%d\n",a,b,sunzi.multi(a,b));
System.out.printf("加法是孙子继承的功能,%d+%d等于%d\n",a,b,sunzi.add(a,b));
System.out.printf("减法是孙子继承的功能,%d-%d等于%d\n",a,b,sunzi.subs(a,b));
}
}