对于课上相关问题的研究和解答(四)

这次的Java问题主要围绕“类与对象”来展开说明,我们一起去看看我的探究成果吧!
首先需要强调的是,类包含了一组对象的共同行为和属性,而对象是类的实例化,当然,类也是具有层次结构的,普通的类,一般会有父类和子类;
而对于用final定义的类,是不具有继承性的;被adstract定义的类,被称为“抽象类”,只能继承,不能实例化,其中可以定义变量和方法,但方法仅有方法名,没有方法体!!!!!!!

举例来说,就是,自行车的图纸,可以被称为一组类;而由这张图纸生成的自行车,就是对自行车类的实例化

问题一:编写类的模板

类都是有一定的模板可寻的,就比如,在类的模板里面,变量名一般会使用private定义;而方法一般会使用public定义,这样做的目的主要由两个:

1、使用private定义变量,是为了保护相关的数据不会被随意修改,具有一定的安全性
2、而使用public定义变量,会有这样的疑问-->有的类里面有set和get方法,同样也可以访问到私有数据,为什么变量用private,而方法用public呢?------可以这么解释,用public定义set和get方法,是为了让外界可以按照我们自己定义的路径去访问,而不是随意访问,有序也安全

举例:

在定义实体类时,通常通过使用private变量+public的set和get两个方法来定义一个属性

小结:通过对象变量调用对象主要有两种方法:1、直接调用类的方法;2、存取类的字段

问题二:直接创建对象并赋值与使用new创建对象的区别

答案肯定是两者并不是相同的,主要原因有如下几点:

1、直接定义的话,即表示只是创建了**一个**对象;而使用new的话,则表示创建了多个对象,会被多次调用,创建出不同的对象;
2、然后,直接定义,出来的是类对象;而用new定义,出来的是实例对象
3、就内存方面来说的话,用new并没有创建出一个对象,需要等到被调用时,才能够被正确赋值,目前变量值为null;而直接定义的话,其变量值就是赋的值

问题三:引用数据类型(对象变量)与原始数据类型

举例说明的话,我们平时很熟悉的String类型,就是引用数据类型,String和String类型作比较的话,需要用.equals比较;因为==比较的是他们两者之间的地址,而.equals比较的是他们的内容

注意:Java要求必须显式初始化变量,否则,这个变量会在我们不知情的情况下,直接调用其他的未知的数值!!!

特殊值null:代表一个对象变量不引用任何对象

在使用new创建的对象变量后,不再使用时,JVN会自动将其回收(被称为“垃圾回收”)

问题四:理解赋值的含义

赋值指的是,将相应的内存地址的值赋给另一个对象,而不是简单地将内容赋值给其他对象

问题五:this的对象引用

就比如,在类调用自身的方法或者变量时,会自动将其认为是this.方法名()或者this.变量名(即为调用自身的东西)

问题六:final可以用来定义常量对象

举例:final MyClass obj=new MyClass();
就表示常量对象;常量对象不能指向另一个对象,但可以修改对象

问题七:对象判等

原始数据类型可以使用==进行内容的判等;但引用数据类型不可以这样做,必须要使用.equals()进行实现内容的判等,否则会直接比较地址的值


运行上述程序,会得到false的结果,可见比较的是地址值

解决方法:

即,使用new创建对象时,比较内容的话,必须使用.equals进行比较

问题八:.equals方法的来源

需要知道的是,每个类都是继承自Object类的,他也算是所有类的“鼻祖”了吧!

其中的.equals方法,就是继承自Object类的奥!

重写.equals方法

重载.equals方法

问题九:一个值得注意的特殊方法

首先,它的方法名与类名相同,也算是构造方法,还是带参构造方法,且没有返回值;
其次,在使用new创建对象时,会直接调用该方法,从而获得在该构造方法中的各种功能和实例
最后,需要注意的是,在Java类中没有声明创建出一个构造方法时,Java类中会主动提供一个默认构造方法,无参、无返回值、不显示;
但是,若是一旦有了声明,那Java类就不会再提供那个默认构造方法,使用时,需要重新构造;
注意:在使用类名new一个构造方法时,例如:MyClass mm=new MyClass();------>前面的MyClass是类名,后面的MyClass是Java类中的那个默认构造方法名

举例:

在Java类中已经定义了一个带参的构造方法,就无法在还未声明无参默认构造方法时,继续调用默认构造方法了,需要重新声明

问题十:多构造函数(相当于方法重载)

一个java类中可以有多个构造方法,方法名相同,可以共存,也可以相互调用;

问题十一:类的初始化块(了解即可)

问题十二:对同一个字段进行赋值操作,最终是哪一块为先?

示例:

由此可知,在使用默认构造方法时,初始化块和oublic定义的变量,哪一个排在后面,就使用哪一个数值;
而类的初始化块不接受任何参数,一旦被调用就会执行,可以用于封装那些必须被执行的代码

问题十三:访问静态数据

可以使用对象名或者类名来访问静态数据,但还是更加推荐类名来访问啦!

我们已知类的初始化代码块,在左括号前面添加一个static即可被称作类的静态初始化代码块

总结规律:

1、静态初始化代码块仅仅**执行一次**
2、在调用子类时,会先调用并输出父类的静态代码块中的内容
3、调用子类,必先调用父类

注意:类的静态方法只能访问类的静态成员变量

若是要求类的静态方法访问非静态成员变量呢?如下图所示:

直接报错!无法访问

问题十四:包装类

包装类的多个类型在之前的博客中已经详细说明列出,这次就不列出来了,也是不难的。

举例:

(咳咳,换成大写的,就是装箱;小写的,就是拆箱了)

那么,Integer类的装箱和拆箱是怎样实现的呢?

上述图片中,展现的是自动装箱和自动拆箱的示例;
而下面的图片,就很好地展现了装箱和拆箱的基本过程:


主要用到了Integer.valueOf()和intValue()两个方法

问题十五:一段神奇的代码

附上图片:

两段代码看起来一模一样,为何会出现两种结果呢??

问题十五的解决:

查看相关版本

反编译界面:记得将.class文件和.java文件放在同一个目录下面哦!

咱就是说,IDEA里面-->Ctrl+shift+i,可以直接查看JDK源码奥!

源码还没有看懂,先挖个坑,过一会儿再来填!

目前来看,应当是当作了String类型,使用.equals进行比较,就不会报错,所以,比较啥的操作,还是尽量使用.equals进行比较吧!

学业顺利呀!

posted @ 2022-10-01 12:12  yesyes1  阅读(19)  评论(0编辑  收藏  举报