浅析JAVA中的内存结构、重载、this与继承
作者:521125LYC 发布时间:2023-09-24 19:15:07
一.对象在JVM的内存结构
JAVA内存管理由JVM来管理。
1)堆,所有new出来的对象(包括成员变量)
2)栈,所有局部变量(包括方法的参数)
3)方法区,class字节码文件(包括方法,静态数据)
1.引用变量指向null时,会发生空指针异常
public class student {
int age;
String name;
public student(int age,String name){
this.age=age;
this.name=name;
}
public static void main(String[] args) {
//(类)引用类型 引用变量创建对象(new出来的类中的构造方法)
student s= new student(18,"刘永超");
s=null;
System.out.println(s);
System.out.println(s.age);//发生异常,因为引用变量指向null
}
}
结果:java.lang.NullPointerException 2.引用类型划等号和基本类型划等号的区别: 一.引用类型划等号:
1…指向同一个对象
2.通过一个引用的修改对象中的数据会影响另一个对象中的数据
二.基本类型划等号:
1.赋值。
2.对一个变量的修改不会影响到另一个变量(例如int类型)
引用变量画“”和基本类型画”“区别:
引用类型画”==“:
1.判断两个引用变量(引用地址)是否指向同一对象
2.基本类型画等号:判断两边的值是否相等
代码演示:
public class student2 {
int age;
String name;
public student2(int a,String s){
age=a;
name=s;
}
public static void main(String[] args) {
student2 s=new student2(17,"liu");
student2 ss=s;
s.age=20;
ss.age=28;
System.out.println(s.age);
//s=ss 判断两个引用对象(引用变量)是否指指向同一对象
System.out.println(s==ss);
}
}
结果为 s.age=28 true;
成员变量与局部变量的生命周期:
成员变量:创建对象开始到被GC垃圾回收器处理掉为止。
局部变量从调用方法到方法就结束。
二.方法的重载
1).发生在同一类,方法名相同,参数列表类型和数量不同
2).方法的重载,和返回值没有关系
3).编译器在在编译时根据方法的签名自动绑定调用的方法
注:方法的签名:方法名+参数列表
代码的实现:
public class overloadDemo {
public void test(){
System.out.println("lala");
}
public void test(int a){
System.out.println("heihei");
}
public void test(String s){
System.out.println("xixi");
}
public void test(int a,String s){
System.out.println("caocao");
}
//public int test(){不是方法的重载,和返回值没有关系
//return 1;
//}
//构造方法
public overloadDemo (){
System.out.println("无参构造");
}
public overloadDemo(int a){
System.out.println("有参构造");
}
public static void main(String[] args) {
overloadDemo load=new overloadDemo();
load.test(5);
load.test(8, "liu");
}
}
如上代码,load.test(5)将调用public void test(int a){};
load.test(8,“liu”)将调用public void test(int a,String s){}。
三.this的使用:
1.this关键字在方法中,用于指向调用该方法的当前对象,简单的说,那个对象调用方法,this指的就是那个对象,严格来讲,在方法中需要通过this关键字指明当前对象。
2.在构造方法中,用来初始化成员变量的参数一般和成员变量取相同的名字,这样有利于代码的可读性,但次数必须通过this关键字来区别成员变量和参数(在这里不能省略this)
3.this就是指当前对象。
this的用法:
1.this.成员变量—访问当前对象成员变量
2.this.方法名—访问当前对象的方法(一般不用)
3.this()---------调用构造方法(必须写在此构造方法中的第一行)
代码演示:
public class thisDemo {
int age;
public void test(){
System.out.println(this.age);//此处可以省略this关键字
}
public void test(int age){
System.out.println("这是带有int类的test方法重载");
this.test();//此处也可以省略this,编译器会自己默认
}
public thisDemo(){
//this(20);
this(19,"liuyongcaho");//调用当前对象时int ,string类型的构造方法
this.age=18;
System.out.println("这是一个无参构造方法");
}
public thisDemo(int age){
this();
System.out.println(age);
}
public thisDemo(int age,String name){
System.out.println(age+" "+name);
}
public static void main(String[] args) {
thisDemo pdd=new thisDemo();
pdd.test(9);
}
}
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QA8e4G5v-1615567706657)(C:\Users\Thinkpad\AppData\Roaming\Typora\typora-user-images\image-20210312160858936.png)]
可以看出,在new对象时,会自行执行它的无参构造方法,执行完后再执行test(int a){}这个方法。
四:类的继承
1.作用:代码复用,减少代码重复
2.通过extends来继承
3.超类(父类),派生类(子类)共有的属性和行为
4.派生类继承超类后,派生类具有派生类+超类的共有属性。
5.一个超累可以拥有多个派生类,一个派生类只能有一个超类。
6.继承具有传递性
7.java中规定,在派生类的构造方法中必须先构造超类的构造方法(必须在派生类的第一行),在派生类中若没有调用超类的方法,则编译器默认提供super()来调用超类的无参构造方法,若超类自己写了构造方法,在派生类中不在默认提供super();
super的含义及使用:
1.super指代当前对象的超类对象
2.super必须放在构造方法中的第一行
3.super.成员变量-----访问超类成员变量
4.super()—调用的时超类构造方法。
代码演示如下: 父类:
/*
* 父类(超类)
*/
public class Person {
int age;
String name;
String gender;
public Person(int age,String name){
this.age=age;
this.name=name;
System.out.println(this.age+" "+this.name);
}
public void testperson(){
System.out.println("我是父类");
}
}
子类:
/*
* 子类(派生类)
* extends
*/
public class Teacher extends Person{
String subject;
public Teacher(){
//super();这是父类的无参构造方法
super(19,"刘德华");
System.out.println(this.age+" "+this.name);
}
//方法的重写
public void testperson(){
System.out.println("这是子类teacher的testperson方法");
}
public static void main(String[] args) {
Person y=new Teacher();//向上造型
y.testperson();
}
}
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zydw2DJx-1615567706663)(C:\Users\Thinkpad\AppData\Roaming\Typora\typora-user-images\image-20210312165717602.png)]
结果分析:
子类在创建对象时会执行子类的无参构造方法,而子类的构造方法中有父类的有参构造方法再执行子类中的testperson方法。
on方法");
}
public static void main(String[] args) {
Person y=new Teacher();//向上造型
y.testperson();
}
}
##### 运行结果:
[外链图片转存中...(img-zydw2DJx-1615567706663)]
##### 结果分析:
子类在创建对象时会执行子类的无参构造方法,而子类的构造方法中有父类的有参构造方法再执行子类中的testperson方法。
####
来源:https://blog.csdn.net/weixin_47600732/article/details/114715757
猜你喜欢
- ArrayList简介:ArrayList实现了List接口它是一个可调整大小的数组可以用来存放各种形式的数据。并提供了包括CRUD在内的多
- java 网络编程java.net 类 InetAddress 此类表示互联网协议 (IP) 地址。 会抛出异常 UnknownHostEx
- 1. pom.xml文件配置<?xml version="1.0" encoding="UTF-8&qu
- 为什么需要网关呢?我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做
- 概述 wsimport是jdk自带的命令,可以根据wsdl文档生成客户端中间代码,基于生成的代码编写客户端,可以省很多麻烦。先看两张截图:使
- 堆排序基本介绍1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),
- File类概述File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。要在
- 一、背景新做了一个的需求,需要在SpringBoot项目中引入了多个依赖,然后就感觉idea下载依赖包的时间很漫长,然后我就网上找了解决办法
- Logback 背景Logback是由log4j创始人设计的另一个开源日志组件,官方网站:http://logback.qos.ch。它当前
- 这篇文章主要介绍了JAVA如何按字节截取字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- Struts2简介Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts
- 要想使Java运行,我们可以设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换为它可以识别的指令序列,也称为Java字节码
- 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很
- 一、题目描述二、思路语法基础:StringBuilder 类似列表,可以更改元素。package Practice;public class
- 在实际工作中,重试重发请求处理是一个非常常见的场景,比如:1、发送消息失败。2、调用远程服务失败。3、争抢锁失败。这些错误可能是因为网络波动
- 一、 代码块的概念在探究对象初始化顺序之前,我们先通过代码来了解一下代码块的概念。class Test{ public stat
- 本文实例讲述了Java实现多个wav文件合成一个的方法。分享给大家供大家参考,具体如下:前面一篇介绍了java切割wav音频文件的方法,这里
- Spring bean配置单例或多例模式单例spring bean 默认是单例默认,在对应.xml文件中的配置是:<bean id=&
- 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导
- Android 自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册、取