JAVA面向对象

文章介绍了Java中的面向对象概念,包括对象、类和消息传递。对象具有状态和行为,类是对象的抽象集合,而消息传递则是对象间交互的方式。文章重点讨论了方法的重载和重写,展示了如何在Caculator类中实现不同参数类型的重载add方法,以及子类如何通过重写优化父类方法的示例,强调了重写时需遵循的规则。
摘要由CSDN通过智能技术生成

为了理解Java面向对象的程序设计思想,这里简单介绍有关面向对象的基本概念。
1.对象
在现实世界中,对象(object)无处不在。人们身边存在的一切事物都是对象。例如,一个人、一辆汽车、一台电视机、一所学校甚至一个地球,这些都是对象。除了这些可以触及的事物是对象外,还有一些抽象的概念,如一次会议、一场足球比赛、一个账户等也都可以抽象为一个对象。
一个对象一般具有两方面的特征:状态和行为。状态用来描述对象的静态特征,行为
用来描述对象的动态特征。
例如,一辆汽车可以用下面的特征描述:生产厂家、颜色、最高时速、出厂年份、价格等。汽车可以启动、加速、转弯和停止等,这些是汽车所具有的行为或者说施加在汽车上的操作。又如,一场足球比赛可以通过比赛时间、比赛地点、参加的球队和比赛结果等特性来描述。软件对象也是对现实世界对象的状态和行为的模拟,如软件中的窗口就是个对象,它可以有自己的状态和行为。
通过上面的说明,可以给“对象”下一个定义,即对象是现实世界中的一个实体,它具有如下特征:有一个状态用来描述它的某些特征。有一组操作,每个操作决定对象的一种功能或行为。
因此,对象是其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的实体。一个对象可以非常简单,也可以非常复杂。复杂的对象往往是由若干个简单对象组合而成的。例如,一辆汽车就是由发动机、轮胎、车身等许多其他对象组成。

2.类
类(class)是面向对象系统中最重要的概念。在日常生活中经常提到类这个词,如人类、鱼类、鸟类等。类可以定义为具有相似特征和行为的对象的集合,如人类共同具有的区别于其他动物的特征有直立行走、使用工具、使用语言交流等。所有的事物都可以归到某类中。例如,汽车属于交通工具类,手机属于通信工具类。
属于某个类的一个具体的对象称为该类的一个实例(instance)。例如,我的汽车是汽
车类的一个实例。实例与对象是同一个概念。
类与实例的关系是抽象与具体的关系。类是多个实例的综合抽象,实例是某个类的个
体实物。

3.消息
对象与对象之间不是孤立的,它们之间存在着某种联系,这种联系是通过消息传递的。
例如,开汽车就是人向汽车传递消息。
一个对象发送的消息包含三方面的内容:接收消息的对象;接收对象采用的方法(操
作);方法所需要的参数。
一.面向对象的重载

public class OverLoad
{
	public static void main(String[] args)
	{
		Caculator c=new Caculator();
		double result=c.add(10,20);
		System.out.println(result);

		//调用参数类型不同的重载方法
		int result2=c.add(50,55);
		System.out.println(result2);

		//调用重载方法
		double[] arr={20,30};
		result=c.add(arr);
		System.out.println(result);

		//调用另一个重载方法
		Operator op=new Operator(30,40);
		result=c.add(op);
		System.out.println(result);
	}
}


在同一个类中, 有同名的方法名,不同的参数个数或参数类型,返回值跟重载没有关系
方法重载特性:
当对象引用调用方法的时候, 会自动根据方法的参数个数或类型, 调用相应的重载方法
定义一个计算类Caculator类中定义一个公有的加方
 

class Caculator
{
	//输入两个数相加, 返回相加后的结
	public double add(double a,double b)
	{
		return a+b;	
	}

	public int add(int a,int b)
	{
		return a+b;
	}

	//方法重载
	public double add(double[] arr)
	{
		return arr[0]+arr[1];
	}

	public double add(Operator op)
	{
		return op.getA()+op.getB();
	}
}
class Operator
{
	private double a;
	private double b;

	public Operator(double a,double b)
	{
		this.a=a;
		this.b=b;
	}

	public double getA()
	{
		return this.a;
	}

	public double getB()
	{
		return this.b;
	}
}

二.面向对象的重写

重写,顾名思义,就是在子类中把继承自父类的某个方法重新写一遍。这样就能在子类中弄出一个同名的、更适合自身或者是效率更高的方法。于是我们就可以在子类中重写了sum()方法重写之后的sum()方法摒弃了循环求和的算法,而采用了更高效的等差数列求和的方法完成累加的计算。这样明显提高了运算效率。当我们创建一个子类对象,并且调用该对象的sum()方法时,虚拟机将会调用重写之后的sum()方法,而不是父类中那个老的sum()方法。

面向对象的基本特征.
1.封装性
2.继承性
3.多态性

重写和覆盖的区别

重写”和“覆盖”这两个词是从两个不同的角度描述了这种编程机制。“重写”是从编码的角度来说的,它体现了子类“重新编写”了父类的某个方法,因此叫“重写”。而“覆盖”是从代码运行效果的角度来说的,它形象的体现出:当子类重写了父类的某个方法之后,当子类对象通过方法名称调用该方法,不会调用到父类中定义的那个方法,只能调用到子类中所定义的那个同名方法,父类中的那个方法如同被子类中重新定义的同名方法覆盖住不见踪影一样,因此叫“覆盖”。

重写的三种常见情况
一、父类要求子类重写
这种情况其实就是指父类无法定义出某个方法的实现过程,于是只能把这个方法定义成抽象方法,从而强制子类去重写这个抽象方法。这个过程虽然被称为“实现”,但它实际上就是对某个方法的重写。因为从本质上来讲,这个过程就是把父类的一个没有实现过程的空方法(即抽象方法)重新编写为一个有具体实现过程的方法。

二、父类中的方法不适合子类
子类如果继承了父类的某个方法,但发现这个方法并不适合自己,就需要重写这个方法。最典型的例子就是表示字符串的String类继承了Object类的equals()方法。但Object类中的equals()方法是用来比较两个对象是否为同一个对象,String类则希望自己的equals()方法能够比较两个字符串的“内容”是否相同,于是在String类当中就重写了equals()方法。有兴趣的小伙伴可以自己去查看一下这两个类当中的equals()方法源码。

三、父类中的方法效率较低或算法陈旧
第三种情况就是:由于各种历史问题的原因,导致原先父类中定义的方法存在效率偏低或算法陈旧,以及线程不安全等情况,并且我们还不能修改父类方法的源代码。在这种情况下,子类就可以用更先进的实现过程来重写父类中的方法。刚才我们看到的Father类和Child类的例子就属于这种情况。

另外,我们还必须要强调一个原则,那就是:子类在重写父类方法的时候,不能更改父类方法的原宗旨。比如说:父类Father中的sum()方法是用来求累加之和的,子类Child在重写父类的sum()方法的时候,就不能把sum()方法改成求阶乘的运算。这个原则适用于所有情况的方法重写,请务必牢记。

接下来我们再来说说子类在重写父类方法的时候,必须遵守的那些语法规则。子类重写父类的方法,需要遵守“三同不降不多抛”的七字规则。

所谓“三同”就是指子类重写的方法要与父类中原方法的名称、参数和返回值都相同。如果方法名称不相同,将被编译器视为子类新扩展出的方法。同理,如果方法的参数不同,则被编译器视为子类新增加了一个“重载”关系的方法。如果返回值不同,则被编译器视为违反重写规则。

但是,关于“返回值相同”,这里需要说的更详细一点。通常情况下,都是父类的原方法声明某种类型的返回值,子类重写的方法也声明相同类型的返

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值