发表于: 2020-10-01 00:21:15
1 1456
今天完成的事情:
遇到的问题:
Java学习——super 与 this 关键字的区别(https://blog.csdn.net/qq_32331073/article/details/77097809)
- this:当前对象
- super:直接父类对象
- this():当前类的无参构造方法,也可以指定有参的如:this(a)
- super():直接父类的无参构造方法,也可以指定有参的如:super(a)
super和this的异同(https://www.jianshu.com/p/6249db3794f6):
super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
1.调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2.super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3.super()和this()均需放在构造方法内第一行。
4.尽管可以用this调用一个构造器,但却不能调用两个。
5.this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6.this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7.从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
指针(https://blog.csdn.net/dengpeng0419/article/details/47452027):在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
Java中的引用
在Java中的引用类型,是指除了基本的变量类型之外的所有类型,所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失), 基本的变量类型只有一块存储空间(分配在stack中), 而引用类型有两块存储空间(一块在stack中,一块在heap中), 方法形参的值传递(引用)是指形参和传进来的参数指向同一个值的内存(heap)中。
实际上java语言并不是没有指针,而是对指针进行了伪装:使用上泛化、强化和简单化,概念上淡化和弱化。
C++中可以有对象类型的变量和对象指针类型,两者的区别如下: Object oo = Object(); Object * oop = new Object(); 也就是说当使用new方式时,是动态为对象分配内在并将地址赋给oop这个指针变量。
JAVA中只有一种相关类型:对象类型,可是它的表现形式却是这样的: Object oo = new Object(); 比较一下,原来它就是使用了C++的动态内在分配方式创建了一个对象,并把地址返回给了oo变量,也就是说oo本质上就是一个指针变量。
引申一下:JAVA中的对象类型本质上应该叫做 对象指针 类型。那么传统的对象类型呢?在JAVA里已经不见了踪影!既然没有了传统的对象类型,那么 对象指针变量 前面的*也就可以不要了。对象指针变量也就可以简称为对象变量了,反正也不会和其它概念混淆! 所有的对象变量都是指针,没有非指针的对象变量,想不用指针都不行,这就是指针的泛化和强化。 不叫指针了,就叫对象变量,这就是概念上的淡化和弱化。 没有了指针的加减运算,也没有了*、->等运算符,这是对指针的简单化。
1.JAVA强调所有的对象赋值和传递都是引用,解释如下:
Object a=new Object(); 并不是将新生成的对象赋给a,a是对新生成对象的引用。
Object a=new Object(); Object b; b=a; b并不是一个新对象,它是对a对象的引用。
其实,a是指针,b也是指针,将a的值赋给b,也就是将a所存储的地址赋给b,b自然指向了a所指向的对象。
想到了多个引用,一个对象
2.而两个对象的相等比较不是比较两个对象的值是否相同,是比较两个对象是不是相同的引用。解释如下:
Object a=new Object(); Object b=a; a==b为真,两个对象引用相同。
String a=new String(“abc”); String b=new String(“abc”); a==b为假,两个对象引用不同。这里是两个地址不同
其实,==的意义并没有变。a是指针,b也是指针,a、b存储的都是地址,当两个变量存储了同一个对象的地址时,这两个地址当然相等,a==b自然是真。当两个变量存储了不同对象的地址,这两个地址值当然不同,a==b自然为假。
如图所示
Java的关键字:对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等。
为什么this或者super要放到第一行?
this() super()是你如果想用传入当前构造器中的参数或者构造器中的数据调用其他构造器或者控制父类构造器时使用的,在一个构造器中你只能使用this()或者super()之中的一个,而且调用的位置只能在构造器的第一行,在子类中如果你希望调用父类的构造器来初始化父类的部分,那就用合适的参数来调用super(),如果你用没有参数的super()来调用父类的构造器(同时也没有使用this()来调用其他构造器),父类缺省的构造器会被调用,如果父类没有缺省的构造器,那编译器就会报一个错误。
实际就是调用了B(){...},而在B(){...}中编译器自动加上了super();这样就相当于两次调用了super();也就是说对父类进行了两次初始化。而在实例化一个对象时,一个构造方法只能调用一次,这说明this和super不能同时存在一个构造方法中。同时因为系统没有在第一行发现this()或super()调用,就会自动加上super(),如果没有将this()和super()放在第一行就会产生矛盾。因为总有一个super()在第二句上。所以该程序不能通过编译!!!
基本类型传参
在方法内,无法修改方法外的基本类型参数
转去弄JDBC去了,一直失败,有些语法还是看不懂,。师兄建议看视频去学习
明天计划的事情: 休息一天
收获:了解了super和this关键字的区别,在从super关键字和this关键字延申了一下下面的概念,比如指针,构造器等。对JDBC有了一定的了解
评论