Java面向对象-3

本文深入解析了面向对象编程中的多态概念,包括其基本原理、成员访问特性、优点与弊端,以及向上和向下转型。同时,对比了抽象类与接口的特点,探讨了它们在继承与实现方面的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多态

概念:多态指一个事物在不同情况下的状态
前提:
  • 必须有继承
  • 同时子类必须对父类的方法进行重写
  • 父类的引用必须指向子对象Father s = new Son();
多态中成员访问的特点
  • 如果是成员变量或者静态方法,那么编译和运行都看左边即父类
  • 如果是成员方法,那么编译看左边,运行看右边即子类
多态的优点及弊端
  • 优点:提高了代码的维护性以及扩展性(下面有例子)
  • 弊端:不能使用子类的特有属性和行为
向下转型及向上转型
  • 向上转型:将子类的对象指向给父类的引用Father s = new Son();
  • 向下转型:当父类想要使用子类的特有方法或者属性时,需要进行向下转型(强制转换),这时就需要将父类引用指向给子类引用Son s2 = (Son)s;
public class Polymorphism {

	public static void main(String[] args) {
		
		//必须父类引用指向子对象
		Father s = new Son();
		s.show(); //输出结果为:I'm son
		// s.print();这是错的,因为父类没有这个方法,要实行强制转换
		System.out.println(s.num); //输出结果为在父类定义的num==10
		/*
		 * 强制转换的方法
		 * 如果有多个子类,可以用instanceof进行类型判断(可以看菜鸟的多态),这体现了多态的扩展性
		 */
		Son s2 = (Son)s;
		s2.print(); //输出结果为:I'm son,this method only belong to me
	}
	
}

class Father{
	
	int num = 10;
	
	public void show(){
		System.out.println("I'm father");
	}
}

//多态必须有继承,并且子类必须重写父类的方法
class Son extends Father {
	
	int num = 20;
	
	public void show() {
		System.out.println("I'm son");
	}
	
	public void print() {
		System.out.println("I'm son,this method only belong to me");
	}
}

抽象类

特点
  • 必须使用abstract关键字进行修饰
  • 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
  • 抽象类的子类肯定是抽象类或者会重写抽象类中的所有抽象方法
abstract不能以下关键字共存
  • static 产生矛盾,static在类加载时就加载了,而abstract是要求必须重写
  • private 同样abstract要求必须重写,但是private不行
  • final 因为final是个最终的方法 ,不能被重写,也产生了矛盾
public class Abstract {

	public static void main(String[] args) {
		
		Zi zi = new Zi();
		zi.show(); //输出结果I'm son
		zi.print(); //输出结果I'm father
		/*
		 * 抽象类的实例化
		 * 第一种:Fu f = new Zi;
		 * 第二种:匿名内部类,会产生一个JVM提供名字的class文件	
		new Fu() {
			public void show() {
				System.out.println("I'm father");
			}
		}.show();
		 */
	}
	
}

abstract class Fu {
		
	public abstract void show();
	
	public void print() {
		System.out.println("I'm father");
	}
}

class Zi extends Fu {
	
	public void show() {
		System.out.println("I'm son");
	}
}

接口

概念

接口用关键字interface表示,类实现接口用implements表示,接口不能实例化,接口中所有的抽象方法都必须被重写

特点
  • 成员变量只能是常量,用public stasic final修饰
  • 接口没有构造方法也不能被实例化,因为成员方法全都是抽象的也只能是抽象的
package com.hepu.javawebclass.oop.polymorphism;

public class Interface {

	public static void main(String[] args) {
		
		Phone phone = new Phone();
		phone.usb();
	}
	
}

interface Computer {
	
	void usb(); 
}

class Phone implements Computer {
	
	public void usb() {
		System.out.println("charging...");
	}
}

class Camera implements Computer {
	
	public void usb() {
		System.out.println("transmitting...");
	}
}

抽象类和接口的区别

  • 抽象类可以有普通变量也可以有常量,但是接口只能public static final 类型的常量;
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值