嗨,又见面了,我是你的老师父,那大家前面可能遇到各种各样的问题,但是大家不要着急,可以留言大家共同来讨论,来解决,闭门造车是学不好编程的,大家要相信自己,也要相信共同学习的小伙伴,同样也要相信你的老师父,多多沟通是很重要的。
那大家看到这一篇说明大家已经很努力了,也希望大家能继续跟下去,如果有必要我可以抽时间出视频,因为工作和家庭原因,暂时实在是没精力做视频,所以大家先看文章吧!推荐大家一本书教父级别的书《Java编程思想》,这本书适合有一定编程基础的人,但是大家可以买来先看看。
上一章留了个作业,还记得不?
“你的老师父开车去买橘子”需要创建水果类、人类、交通工具类,来完成这个场景,打印出这句话来!
那我来给大家实现一下,看跟大家写的是不是一样
1、首先新建三个类:
水果、人类、交通工具类。
2、之后每个类写代码如下
水果类:
交通工具类:
人类
车和水果类比较简单,因为就一个属性和一个构造方法,属性就是车的类型和水果的名字。
那人类就比较复杂了,因为人要去开车去买水果,那首先他得有车,所以你造人的时候也就是新建对象的时候,不仅要告诉他叫什么,还得告诉他有哪辆车。
因为买橘子呢是个动作,买完才是他的,所以有个买水果的动作,需要把橘子给他,他才能有。所以这是buyFruit()这个动作。
那他说话呢,想说什么就直接System.out.println()出来就好了,代码中是让他说:谁开什么车去买什么。所以最后say的时候打印结果如下:
好了作业做完了,有问题留言评论或者私信吧!
那今天咱们讲点新东西。
什么是“包名”
开始之前还是得说个例子!
咱们这几天一直在造人、造人和造人,那那么多Person类,有的有名字有性别,有的又只有名字,那我是不是代码删了写,写了又删?有没有办法这个同样的Person类都存在呢?
那有人一激灵说这还不好说,多建几个类不就好了?
好,我给你试试啊,你看着:
诶?File already exists?什么意思?文件已经存在!
是的,因为你已经有了Person了啊。
那怎么办?
我问你,你在电脑上两个相同的文件放在一起是不是也是会提示是否要覆盖?那你如果不覆盖,只能改名字了。还有个方法,就是放在不同文件夹中,是不是?
那java项目中也是可以分不同文件夹的。只不过java中类的文件夹不叫文件夹,叫“包名”
英文单词:package,那package还有个意思就是打包的意思,所以你可以理解为这个文件加,就是打了一个包裹,就跟快递包裹似的,你买了好多东西,不同商家是不同的包裹,每个包裹放的东西是不同类别的。
java中也是这个意思,包中放的基本上都是同一类的东西。比如放汽车类,有Car,有Bus,有MiniBus,有Taxi是不是
好了,说这么多,其实就是一个文件夹而已!记住在Java中叫做包。
那说说这个包怎么建?
首先命名规范:
1、不同路径通过点(.)来分割,比如下图的这个目录/cn/craaaaazy,包名的话就是cn.craaaaazy了
2、由字母、数字下划线组成,不能以数字开头
3、全部小写
4、一般使用域名反写来命名包,为了保证包名唯一性,一般是用域名反写来做包名的,比如下图:
这个就是域名反写起的包名,其实是两个文件夹,一个是cn,另外一个文件加是craaaaazy,那你去这个项目目录看,其实是两个文件夹。
注意:
一般路径会这么些E:\lib\cglib 或者这么写/root/bin
但是java这个编码工具中,是通过英文的点(.)来作为路径分隔符的比如上边两个路径如果做为java的包的话,在开发工具中会显示成lib.cglb或者root.bin
在编辑工具中有个办法把文件夹都展开,看我操作:点击这个设置按钮,把第二个选项的这个对钩去掉:
那看下边这个是不是已经展开了
这样你也可以在cn中创建类文件了。
那说了这么半天,怎么用呢?
相信大家都会建类了。我还是说下吧。想要把类建在哪个包中,就直接在包名上右键,然后一顿选,选New,选Java Class,后边的操作我还用说吗?就是填入类名,就确定就行了。看下图
看我一通操作,建了这么多类,当然,文章开头的例子,我是在一个我已经建好的包中写的。
那上图右边代码部分,看看注释说明。
首先代码是Person类,这个类在cn.craaaaazy这个包中。
1、package关键字:
首先第一行要写上package 你这个类的包名,当然这个编辑器很强大,自动就给创建好了。
记住这个其实是目录,但是java是通过点(.)来做分割的这是JVM编译器决定的。
例如:package cn.craaaaazy; // 注意这最后是有分号的。
2、导入类
什么是导入?
说这个问题之前先问大家,类和文件的概念大家清楚不?我给大家截个图:
看到没,右边是这个包的实际文件目录
那右边目录中的java后缀的文件,这就是咱们项目中的你看到的这些类,他们其实是文件!
打开这两个文件看看
一般文件名和类名都是一样的,就像上边的Person,那也有特殊的,比如下边这个
Test.java文件中包含两个类,Water和Tea,他们和文件名不同。注意:这两个类不能写public关键字,因为public的类必须要和文件名保持一致!
那大家应该知道文件名和类名不一定要一样,一个文件中是可以写多个类的。大家可能在想,那这跟我导入类有什么关系?
那我解释下导入的概念吧,举个例子,大家喝水用水杯喝,那如果水杯没有水,是不是喝不到?你得把水倒入水杯,水杯才有水是不是?
那如果我想喝茶呢?是不是要再把茶放进去?是的,没错。
倒入水、茶叶的过程其实跟Java的导入一样。你可以把文件看做是水杯,那类就是茶叶和水,看Test.java文件中Test.java就可以看做水杯,那Tea和Water就是茶和水。这是茶和水本身就在水杯的情况。
那如果茶和水开始并没有在水杯呢?看下图
那你怎么喝茶水?
那这个时候你就得倒进去啊?在Java中就是通过import导入的
导入其实和直接写在java文件中是一样的,编译器最后都会把他们写在一起。
那我还是用Person这个类来讲import吧。
三种导入类方式
a、通过import 导入完整的类路径
在你使用比如Bus类的时候,要通过import关键字导入这个类
怎么写呢,就是这个类的完整路径,同样也是(.)分割的
比如:
import cn.craaaaazy.car.Bus; // 注意这最后也是有分号的
b、通过import 导入包路径
比如你使用了某个包的所有类,你可以这样写
import cn.craaaaazy.fruit.*;
那cn.craaaaazy.fruit是一个包名,这个包中存放了所有的水果类,如果我都要用,那我得一个一个把类导入进来(在以前没有自动导入这么强大的编辑工具的时候,工作是相当乏味的!)
那如果不一个一个导入进来就需要使用通配符了,这个通配符就是星号(*)。
这样一个是省去了很多麻烦,另外也降低了代码量。
c、通过完整路径的方式使用类
比如我使用了work包中的这个Person类,其实是没办法通过import再把Person类导入进来了,刚才讲水杯、茶叶和水的时候说来着,import导入类的过程其实和直接写在Java中是一样的,所以,你如果把work.Person导入进来,那其实就是在这个类中又写了个Person,那编译器其实是不知道你要用哪个Person的,所以,不能直接通过import导入!
那我要用怎么办?
可以在你用的时候,写上完整的类路径,比如
work.Person person = new work.Person("小名", transport);
那这样其实没有导入类就可以用了。
那基本讲完了,其实使用就是这么简单。细心一点,一定要细心,好好看我代码。不行就复制粘贴。
如果遇到问题,一定要留言评论,还是那句话,我这是给12岁以上小朋友讲的,尽最大努力讲的简单明白。所以例子会很多,但是大家也是需要细心的,因为代码这个东西,一个标点符号都会造成运行不起来,但是大家也别气馁,慢慢习惯就好了,大家只要敲上一个月代码,这些就都不是事儿了。好了,大家加油。