Java类和对象、自定义包、static、代码块、方法重写

目录

1.类和对象

2.this指针

3.对象的构造和初始化

3.1默认初始化

3.2就地初始化

3.3构造初始化

3.4IDEA快速填充

3.5使用this简化

3.6初始化的总结

4.包的引入

4.1包的概念

4.2导入包中的类

4.3自定义包

5.static修饰

6.代码块的划分

7.方法重写


1.类和对象

使用对象的引用加上点号就可以对于这个属性进行访问;

我们首先是需要定义一个类,这个对象实际上就是类的实例化,我们可以把这个类理解为我们的建筑图纸,对象就是依据这个图纸建设出来的高楼大厦,对于这个类里面的成员变量和成员函数,我们的这个实例化的对象里面都是有的;就如同我们的这个图纸里面有的内容,我们的这个高楼大厦里面也是包含的,因为我们的这个高楼大厦就是依据这个图纸建设的啊;

我们对象加上点就表示这个对象的这个属性值,new就是进行类的实例化的过程,一个类是可以实例化多个对象的,每一个对象,包含相同的属性和方法;

2.this指针

我们的这个this指针是怎么引出来的呢,就是我们的这个形参的名字和我们的成员变量的名字是一样的时候,我们的this指针就指向当前的这个对象,我们的下面的这个是一个日期的类;

this.yaer表示的就是这个对象的year成员变量,year就是这个里面的传递过来的形参,这个就可以区分我们的形参和成员变量;

当然,如果我们的形参和成员变量的名字不一样的时候,我们这个时候是很容易进行区分的,因此这个时候我们就可以不写这个this指针,而且实际情况下,我们大部分情况下都不会写这个this指针,因为一般我们的形参和成员变量不会一样,当然即使是我们不写,这个this指针也是存在的;

3.对象的构造和初始化

3.1默认初始化

这个就是直接来一个和我们的类名字一样的函数,就是构造函数,这个可以显示的写出来,也可以不写,但是即使我们不写出来,创建对象的时候这个构造函数也是会被调用的;

这个时候我们的int就会被默认初始化为0,bollean类型的数据会被默认初始化为false,这个都是默认的操作,如果我们不进行任何的干预;

3.2就地初始化

就是我们在创建对象的时候进行初始化,这个就是创建对象的同时进行初始化,我们把这个叫做就地初始化;

3.3构造初始化

构造的时候赋值,这个相当于C++里面的这个自定义构造函数,本质都是一样的;

这个和上面的区别就是我们的就地初始化就是在定义成员变量的时候进行初始化,构造初始化是在写构造函数的时候进行初始化;

3.4IDEA快速填充

按照下面的这个步骤,我们就可以快速的构建出来带参数的构造函数,最后一不会让我们选择这个函数有几个参数:我们可以选一个,也可以选多个,因为这个构造函数也是函数,也是支持这个重载的;

3.5使用this简化

这个的意思:我们的下面是有一个无参数的构造函数和一个有三个参数的构造函数,这个时候,我们在这个无参的构造函数里面,就可以使用这个this(1900,1,1)相当于就是去调用这个有参的构造函数进行初始化;

这个前提是我们的这个无参的构造函数里面如果是有多行代码,我们的这个thsi的这一行必须写在第一行,否则就会报错;

第二个就是我们的有参函数和无参函数不可以成环,就是本来我已经调用你了,然后你又调用我,这个就是成环,这个也是不被允许的;

下面的这个代码就是对于上面的这个进行进一步说明,两个函数的调用形成了递归调用,这个时候就会报错;

3.6初始化的总结

其实上面的这个什么默认初始化。就地初始化都是分出来的,其实没有必要搞得这么多的类型,我们就只需要知道这个默认的构造函数,以及我们可以写参数的自定义构造函数;

因为学习过这个C++里面的这个类和对象,因此这个里面并不难理解,因为两个的核心思想就是一样的,我们只需要进行迁移即可;

4.包的引入

4.1包的概念

包的全称叫做软件包,是为了让我们程序猿更好的对于创建的类进行管理;

包的这个机制很好的体现了我们的类和对象的封装性,我们可以通过这个包实现对于类和接口的组织和管理;

4.2导入包中的类

下面的是两个导入包里面的类的方法,但是第一种会更加繁琐一些,第二个更加简单一些:

第一个就是上面的这个样子的,我们直接指出来我们要导入的类属于哪个包里面。上面导入的这个Date这个类就是属于我们的java.util这个包里面,但是这样写比较繁琐,因为我们每一次使用都要把前面的这个包的名字写一遍,因此我们可以使用下面的这个import写法:

下面的这个import就是我们在第一行直接指出来这个类属于那个包,这样再类里面我们就可以直接使用了;


如果想要导入这个java.util的其他的类,这个时候我们就可以使用*这个方法:

 这个*实际上就是一个通配符,这个通配符表示的是所有,例如我们之前学习这个sql语句的时候从这个表里面选择所有的内容,这个时候就是select * from之类的这个语句,在我们学习这个linux的时候,想要从一个很大的文件系统里面对于这个文件里面进行筛选,这个时候使用*.txt表示的就是所有的以txt结尾的文件,这个也是相同的用法;熟悉git的朋友可能就更清楚了,这个git里面有一个gitignore文件,这个文件里面内容就是用来,对于我们上传的文件进行筛选的,这个文件我们可以修改的,例如这个.mlx文件就是一类文件,这类文件就会在上传的时候被过滤掉;

虽然这个*可以省去很多的问题,但是我们还是建议直接指定,下面的这个就是使用*出现的一个问题(两个类的名字冲突,该如何进行选择)

上面的这个编译报错就是因为我们的这个两个包里面都是有这个date这个类的,因此在进行导入的时候,他就不知道我们程序猿到底想要导入哪一个类,因此这个就会出现报错的情况,我们如果想要解决这个报错,我们就可以使用这个具体的:就是进行import之后,我们用到的时候进行具体的指定,这个就不会报错(如下图所示)

4.3自定义包

我上面创建的这个包是分层显示的,就是类似于一个树状的结构。但是最开始这个系统默认的这个设置可能就不是这个样子的,因为我们的这个自定义包实际上会在这个我们的电脑的这个文件夹里面进行创建,我们点击这个package之后,我们就写这个com.baidu.www,实际上这个就是一个文件之间的包含的关系,就是这个com文件夹里面有一个baidu的文件夹,baidu文件夹里面有一个www文件夹;

如果使用这个默认的IDEA设置,这个里面的com,baidu,www的层架结构可能就不会显示出来,我们可以按照下面的这个步骤把对应的这个勾选取消掉,就是这个compact middle packages这个,他的这个原来的是勾选上的,我们把这个取消掉,这个时候我们的com,baidu,www就是像树状一样进行显示的;

如果想要查看这个具体的文件层级结构,我们可以按照下面的这个方式进行查看,这样我们就可以真正的在自己的这个电脑的文件夹里面看到我们呢的自定义的包包;

包的层级结构:我们需要知道这个包的层结结构,即使是我们的自定义的包,这个也是有自己的层级结构的,像下面的这个www就是和test3,test4同属以一个级别的,就是这三个都是属于baidu这个包里面的,但是我们的这个test,test2就是属于com.baidu.www这个包里面的,因此,他们的这个范围是不一样的;

下面的这个string brand这个没有任何的权限设置,但是这个属于我们的test包,因此这个可以在自己的这个类里面进行访问,像这个test3,test4都是无法进行访问的,这个就是包的访问权限(在自己的这个包里面的类可以访问,其他的不可以访问,不同的包里面的类的名字可以不一样,这个就是C++里面的这个命名空间,两个就是一个意思,本质没有差别)

我们可以使用下面的方式验证上面的结论:我们在baidu这个目录下面建立一个test类,这个时候不会报错,但是我们在这个www下面去建立一个类,这个时候就会报错,这个就是包的作用域的限制导致的,不同的包里面的这个类的名字可以一样,但是一个包里面的名字不可以是一样的;

5.static修饰

这个其实不难理解:

static修饰成员变量:这个成员变量属于类域的,不是某一个对象的,而是创建类的时候就存在了,这个成员变量就是共有的;

static修饰成员方法:这个成员方法也是属于这个类的,不依赖于任何一个对象而存在;

static修饰的静态成员方法里面不可以使用我们的非静态成员变量;

也不可以使用我们的非静态的成员方法(因为非静态方法有this指针,但是我们的static修饰的方法没有this指针)

6.代码块的划分

下面的这个就是一个普通的代码块:

下面的这个是另外的两个类型:实例化代码块和静态代码块,其中两个的区别就是静态的代码块的前面加上我们的关键字static;

实例化代码块只有在我们创建对象的时候才会被执行,静态代码块:无论我们创建多少个对象,我们的这个静态的代码块只会被执行一次,如果一个类里面有多个静态的代码块,这个时候就会按照这个先后顺序依次执行;

7.方法重写

就是我们自己创建一个对象,我们想要打印这个对象的相关的属性内容,这个时候就可以使用一下对于方法的重写

下面的这个就是我们的类的相关的信息:

接着我们调用自定义构造函数:创建一个对象,想要打印这个对象;

下面的这个是一个调用的过程(这个和我们上面使用的案例不一样,但是这个调用的过程是一样的,因此这个时候,我们可以看到这个最后是走到了这个toString这个位置,但是打印的结果却是一个类的全路径名+@+一个地址,我们想要的是这个相关的属性,这个时候,我们就可以进行方法的重写,重写的方法就是我们的toString方法)

我们可以通过下面的方式进行重写,这个不需要我们自己写:

下面的这个操作是在我们的类的文件进行的;首先右键,找到generate,然后选择这个toString这个方法,然后把这个里面所有的成员变量全部勾选(这个第三个步骤可能会不一样,因为这个具体取决于我们的成员变量的数量);

然后我们就可以看到我们的这个tostring方法已经被重写了,这个已经写在我们的这个类里面去,这个时候我们再次执行,这个就会调用我们重写的这个方法,override表示的就是这个方法是被重写的,打印结果就是相关的这个对象的属性信息;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值