内存管理,重载,重写,多态

1、对象实例化的内存管理
计算机运行java程序的时候,在内存中开辟一块栈(stack)空间,同时还开辟一块堆(heap)空间
堆内存:存储具体的实例化后的对象
在这里插入图片描述
栈内存:存储引用类型变量,还存储基本类型的对象
在这里插入图片描述
计算机还会开辟一块空间(heap堆类型),叫做方法区,用来存储类的基本信息(类名,属性,方法…),首先通过类装载器加载类的字节码文件,经过解析后放入方法区中。
在这里插入图片描述
在这里插入图片描述

2、重载:一个类中,方法名相同,参数不同(个数,类型,顺序),这种现象叫做方法的重载(不考虑访问控制修饰符以及返回值类型),这种现象体现了某一个功能的不同实现方式,重载的方法之间是可以相互调用的。
3、方法签名:就是一个方法的识别关键字,“方法名+参数列表”
3.1、 不可以在一个类中出现两个方法签名一摸一样的方法。
3.2、重载就是方法名相同,方法签名不相同的若干个方法。
3.2、方法签名和返回值以及访问控制修饰符无关。
4、方法的调用原则:java采用极尽简单的数据转换原则,调用方法时,如果找不到和传递的参数相匹配的方法,就往较大范围转换,“就近原则”
5、方法的参数传递原则:基本类型是基于数值的传递。引用类型是基于引用的地址的传递。
6、继承:用extends关键字来表示继承,子类继承父类之后就具备了父类所拥有的属性和方法,同时子类还可以有自己的扩展的属性和方法。Java只支持单一的继承关系,也就是说一个类只能有一个直接父类。
**子类的构造必须通过super来调用父类的构造,如果没有调用的话,编译器会默认的加上对于父类的无参的构造,如果父类这个时候没有无参构造,就会编译错误。思考为什么?

class A{
	int a;int b;int c=5;
	public A(int a,int b,int c) {
		。。。
	}
}
class B extends A{
	public B(int a, int b, int c) {
		super(a, b, c);
		// TODO Auto-generated constructor stub
	}
	}

原因:为了让父类的构造执行到(无论是有参还是无参),构造一般情况下是用来对属性进行初始化,这样才能妥善的处理父类的属性,子类使用这些属性才会有意义。**
7、向上造型:父类的引用指向子类的对象,一个子类的对象是可以赋值给它的父类的引用的。这个时候这个引用只能操作该对象在父类里面所拥有的属性和方法,对于子类扩展出来的属性和方法是没有办法操作的。

class A{
。。。
}
class B extends A{
		。。。
}
A a=new B() ;//向上造型

不太恰当的例子:在购买宠物之前,先准备一个动物的窝,等到买了宠物之后,无论是猫还是狗,都可以放进去(可以赋值),相应的如果事先准备的是一个狗屋,就只能存储狗类型。
8、子类的引用指向父类的对象(向下造型),需要强制转换,如果这个父类的引用指向的对象不是要进行强制转换的子类类型,就会抛出类型转换异常。
9、重写(覆盖):在子类当中定义的方法,和父类的方法同名同参,并且返回值类型相同(不考虑访问控制修饰符)。意义:父类只是规定了有这么一个功能,子类有自己的实现方式。
注意:
1)方法名必须相同
2)参数必须相同(个数,类型,顺序)
3)返回值类型必须相同
4)重写的方法的访问控制修饰符不能比父类更封闭
5)子类重写的方法抛出的异常不能更宽泛,可以抛出更少,或者不抛出
6)父类引用指向子类对象时,调用方法,是调用子类重写之后的方法。

多态:分两层含义。
1)方法的多态:重载机制,方法有多个状态。
2)对象的多态:向上造型机制,对象有多个状态。

练习:四种访问控制修饰符,分别修饰属性,或方法。
用不同的访问控制修饰符修饰后,在不同的位置来进行调用这个属性或者方法,有什么规律。
public protected default(不写) private
不同的位置:一个类内,相同包的不同类,不同的包,子类和父类之间。

发布了29 篇原创文章 · 获赞 1 · 访问量 682

猜你喜欢

转载自blog.csdn.net/weixin_44414413/article/details/102826119