类,对象及继承关系概述

本文介绍了面向对象编程的基本概念,包括类与对象的定义,封装的重要性,以及继承和多态的概念。通过实例展示了如何进行方法覆盖以及静态绑定与动态绑定的区别。面向对象编程适合解决大规模问题,提供了更好的可靠性和重用性。
摘要由CSDN通过智能技术生成

类,对象及继承关系概述

(OOP)面向对象程序设计是当今主流的程序设计范型,由于Java是面向对象的,所以熟悉OOP才能很好地使用Java;传统的结构化程序设计通过一系列过程(即算法)求解问题,这个方法首先要确定如何操作数据,然后再决定如何组织数据结构,而OOP相反,其将数据放在第一位,然后再考虑操作数据的算法。总的来说面向对象适合解决规模较大问题,而面向过程可能对于规模较小的问题更加理想。

					 面向过程与面向对象对比

在这里插入图片描述

1.类与对象简述

类:类似于现实中一类事物所具有的属性的集合,是构造对象的模板
对象:是这一类事物中的某个个体,例如汽车属于一个大类,那么奔驰汽车就是这一类事物的实例化。

我们可以将类想象成制作小甜饼的模具,将对象想象成小甜饼!

封装:这是处理对象的重要概念,从形式上看,即将数据(实例字段)和行为(方法)组合在一个包里,并对对象的使用者隐藏具体方式,其关键在于不能让类中的方法访问其他类的实例字段,封装给对象赋予“黑盒”特征,这提高了可靠性和重用性。

2.继承

即“is a”,基本思想是基于已有的类创建新的类,继承已存在的类复用这些类的方法,而且增加新的方法和字段,使得新类适应新的情况。
关键字 extends;例如:

public class Manager extends Employer{
  add methods and fields
  }

方法覆盖:超类中的某些方法对子类不一定适用,此时需要新方法来覆盖超类的方法。

public class Manager extends Employee{	
	public double getSalary()
	{
		return salary+bonus//error
		
		double salary=getSalary();
		return salary+bonus;//error

	double salary = super.getSalary();//right
	return salary+bonus;//right
	}
}

经理的工资为员工基本工资加上奖金,可一方面从Employee继承的salary为私有变量,子类无法访问;另一方面如果调用getSalary(),则程序会陷入死循环;Java中提供了关键字super来专门调用超类的方法。(super还可调用超类构造方法,类似super(x1,x2),这里不仔细叙述)

多态

Java中对象变量是多态的,一个student类型变量既可以引用student类型对象,也可以引用student类的子类的对象。

public class student{
public string name;
public student(string n){
	name = n;
}
//方法重载
public student(){}

public void study(){
	System.out.println(name);	
	}
}

public class UNstudent extends student{
	public void study(){
		System.out.println("子类重写"}
public static void main(String[] args){
	student un =new UNstudent();//多态
	un.name="张三";
	un.study();
}
静态绑定与动态绑定

讨论这两个概念呢首先明确两个问题
1.当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用的是父类的方法还是子类的重写方法呢(尤其是存在向上类型转换的情况)?
2.当一个类中存在方法名相同但参数不同(重载)的方法,程序在执行的时候该如何辨别区分使用哪个方法呢?

静态绑定
即方法或变量在编译前就已经与类绑定了。
被static,final,private修饰的和构造方法是静态绑定

private修饰:此类方法不能被继承,子类无法访问父类的private方法,只能通过super访问

final修饰:可以被子类继承,但不能被重写,故当子类中调用final方法时,其实调用父类中的final方法。

static修饰:可以被继承,不能被重写,但可以被隐藏。当子类对象向上类型转换为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法

构造方法:构造方法也是不能被继承的(因为子类是通过super方法调用父类的构造函数,或者是jvm自动调用父类的默认构造方法),因此编译时也可以知道这个构造方法方法到底是属于哪个类的。

动态绑定:
当虚拟机创建子类对象的时候,会创建一个类的方法列表,同时包含父类的方法列表。同时虚拟机会参数引用的实际地址,找到创建的这个子类对象,查询方法列表,如果在子类对象中找到这个方法,就直接调用。
如果没找到,就去查询父类方法,调用父类的方法。

总结:
Java中方法时static,final,private修饰时是静态绑定,变量也是静态绑定,其余是动态绑定。
在向上转型时,动态绑定是先从子类方法表中找,没有就找父类,而静态绑定相反,先从父类开始找。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值