JAVA-初步认识-第十二章-面向对象(包与包之间的访问)

一.

不同的包有很多,不同包之间的类该如何访问呢?之前没有包的时候都是默认包,当前这个目录就是默认包,它们都在同一个包里进行互相访问(不同类之间的访问,调用)。现在看不同包里类与类之间的访问又是怎样的?

上一节的自动生成的包中,包名的确定是根据程序中自己书写的名字,来确定的。比如下图这样的,写成package mypack;那么自动形成的包名就是mypackage,而且在运行时会交代形成包的位置(错误,是编译时形成)。

现在开始对实际的不同包里的类之间的交互,进行讲述。

(源代码的位置在哪儿?不同的包里)

现在有两个包,mypackage和packagea包,mypackage中调用了packagea包中的类。

那么先编译谁呢?先编译DemoA,没有DemoA,调用它的会失败。

以前谈论的时候,好像是直接编译PackageDemo类就可以,系统会去自动寻找要访问的类。

之前讲述的是真的,为什么现在又改变了呢?其实没改,以前是写在同一个包里,所以它会在当前这个包里去找访问的类,没有这个类,就找所在的.java文件(找到后,编译一下,再继续执行程序)。这个规律还是这个事儿。下图的程序在执行的时候,要找DemoA类文件,如果DemoA类文件在当前目录下没有,那么就要先找DemoA.java文件,可是这个以前确实有一点不一样的是,这个DemoA已经有所属了。

所以,你要用的类实际上是packagea.DemoA.class文件,如果没有这个类文件的话,它会找packagea目录下有没有DemoA.java文件。它根据你这个类名来寻找源文件名,(看来寻找时的原理确实没有变化,只是要根据位置做一个变化)

(我稍微有那么一点明白了,添加了包语句的程序,使用方法和以前稍有不同。现在被调用的类文件,名称必须是包名.类名,如果类文件仅是类名,那么就无法操作。如果没有对应的类文件,调用者还会到对应的包文件下,去寻找相应类名的类文件。这个类文件需要包名.类名的格式么?不需要,在源程序中需要,类文件的摆放位置需要按照这个规格来)

现在通过演示操作,来具体展示整个流程。

实操中,直接采用javac DemoA,得到的是当前目录下DemoA.class文件,但是PackageDemo类文件运行时无法使用它,因为名称不对。这里的DemoA类文件使用的是当前包.DemoA.class的名称,这样对不上了,运行自然失败。(但是编译还是可以的,形成当前目录下的DemoA.class文件)

现在要将其修改为能用的形式。其实之前说过怎么将其变为可用的形式,有两种:手动和自动。现在以自动的形式来操作,这里要还注意一点,javac –d . DemoA.java时,源代码的名称DemoA.java和程序里的类名存在微弱的关系。

经过自动编译后(手动操作也是这样的结果),在当前目录下形成一个packa的包,同时包里存在一个DemoA.class的类文件。

现在联想最早之前讲述过的例子,当前目录下有两个源代码,存在一个调用与被调用的问题。实际情况中,可以将二者都编译出来,最终运行调用类文件即可。也可以只编译运行调用源程序,它会在运行时,自动搜寻被调用的类文件,如果没有就找相应名称的源文件,将其编译,再调用的它的类文件。在包机制下,这个原理也同样是适用的。

在包的机制下,首先要注意的大前提是,在编译运行中源文件名和类文件名都有了扩展,虽然实际看上去名称没有变化,但实际上进行了扩充。

包出现后,类文件(也就是字节码文件)可以和java源文件分离。咱们只需要将类文件给别人用就行,不需要将源文件给别人用。现在提高使用难度,将编译的类文件完全提出去。

这就实现了源文件和类文件分离。现在接着调用程序的编译,运行。

编译出现了两个错误,找不到DemoA。

以前为什么不写,以前是在一个包里,现在分在不同的包里了。(在源程序书写时,就要明确调用类的所属。)

也就是要修改源程序

这才是正确的类名,现在继续编译执行,又是报错

这次显示包不存在,

在当前目录下没找到packa包

其实这个倒不难理解,编译是在E:\java0331\day12下进行的.java源文件编译,packageDemo.java源文件在编译时,需要调用packa.DemoA文件,但是在当前文件下没有packa包。这个包在c盘下,应该设置classpath,告诉虚拟机在什么路径下(对以前的set classpath知识有所遗忘。我的理解是这样的,在当前目录下,编译packageDemo.java源文件时,用到了packa.DemoA类,也就是说在当前目录下要寻找packa包中的DemoA类文件,如果没有的话,找到对应的DemoA.java也是可以的,可惜的是都不存在这样的包。这里突然产生一个疑问,需要的一定是DemoA的类文件,而不是.java源文件么?无论哪个文件都需要在程序中描写的那样,在对应的包下面。由于对应的包在c盘中,现在我们需要将c盘加入进来,也就是采用set classpath的方法。我个人觉着,set classpath是添加了一条搜索路径。那么类文件的产生位置和set classpath有关么?)。

记住,配置包的时候,你直接把包所在的目录配置到classpath中,不要配置类文件的,因为包和类是一个整体,(指向包所在的所属)

继续编译,还是出错,

报告中说,不是公共的,就是在说权限问题。

包里面定义一个类的话,如果这个类要在包里面被访问,必须要给它足够大的权限,一般权限访问不到。包里面的类,如果没有加public,就是在包里面被封装了,就是隐藏,不是说加了private才是隐藏。

注意一点的就是,加了public,源文件名和类名就要保持一致了。

在修改完这个之后,再次进行编译运行。

就是说DemoA类改为公有了,但是里面的show方法还没公有,还需要修改。默认权限不行,它也属于封装。

这时需要重新编译DemoA类,因为它进行过修改了。

这时候没有任何问题了,而且packageDemo类文件也存放在c盘myclass文件下。

现在才是真正了解权限的用法,包与包之间才体现出来,一个包里面无法体现出权限的用法。

二.

不同包里的类之间的继承问题。

新建一个packb的包,以及里面的类,

Packa包中的类继承了packb包中的类,这就是不同包里类之间的继承。

上面截图中的写法是错误的,DemoB是不存在的,都要有前缀的,现在和之前不一样了。

既然是继承,那么我们可以直接运行method()方法,因为继承了DemoB的一切。

编译的时候,源文件写成Demoa也是可以编译的,图中的packa包就是javac –d c:\myclass Demoa.java生成的。下面一句javac –d c:\myclass DemoA.java只是个形式。

这几幅图,重要的是两点,编译时在固定的地方形成文件夹,运行时加了前缀名。在包的机制下,大前提就是源代码中的书写很重要。

现在考虑另外一个问题,上面的截图是子类调用父类的方法是直接访问的,

这时又提出一个问题,a继承b调用method方法,和b自己调用method方法,得出的结果是一样的,都是DemoB method run,现在就是问两者形成的东西都是一样的,为什么还要继承?

上面说错了,说的是,packageDemo类不用继承Demob类,就可以直接创建Demob类对象,并直接调用其方法。就是通过创建外部类的对象,实现了访问外部类的方法。而DemoA类是通过继承,才获得了Demob的方法。现在问题就是继承还有什么,没有体现出差异来。

是不是子类,方法都可以拿过来用。那么,这继承的存在有些多余。现在进行一个权限的修改,不同包之间不允许你来访问,但是如果是继承关系,就同意访问。这种就是特殊权限,给不同包的子类使用的。Public的存在,谁都可以使用,有没有继承都无所谓。

加了protected的权限,只有不同包中的子类能够使用。你直接在不同包里创建其对象的话,无法获取其方法。

再次运行的结果如下,和之前的不太一样。

这protected是大家学习到的第四种权限,用的不多,但是必须要知道。只有继承了,这个功能才能去使用。换句话说,只有所属于这个体系,才能让你用。这个其实,也叫做封装。我不让跟我没关系的类,来访问我这个功能,这专门为我的子类所提供的。

包与包之间能用的权限只有两个,一个是public,另一个是protected,而protected只能给不同包中的子类使用。

时间: 2024-07-29 12:31:46

JAVA-初步认识-第十二章-面向对象(包与包之间的访问)的相关文章

“全栈2019”Java多线程第四十二章:获取线程与读写锁的保持数

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十二章:获取线程与读写锁的保持数 下一章 "全栈2019"Java多线程第四十三章:查询是否有线程在等待读写锁 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

Java编程思想---第十二章 通过异常处理错误(中)

第十二章  通过异常处理错误(中) 12.4 创建自定义异常 我们不必拘泥于Java中已有的异常类型,Java提供的异常体系不可能预见所有的错误,所以可以自己定义异常类来表示程序中可能会遇到的特定问题:要自己定义异常类,必须从已有的异常类继承,最好是选择意思相近的异常类继承,建立新的异常类最简单的方法就是让编译器为你产生默认构造器,所以这几乎不用写多少代码: class SimpleException extends Exception { } public class InheritingEx

JAVA-初步认识-第十二章-面向对象(包的概述)

一. 包的知识点是面向对象最后的知识点. (都是对类的操作,那java源文件呢?) 什么是包?包有什么用? 介绍一下起源,同一个文件夹里面有两个.java的源程序.它们里面各自有一个class Demo类,在源文件编译的时候,分别会产生Demo类.但由于在同一个文件夹,因此只出现了一个Demo类.为了使两个Demo类都能够存在,下面开始介绍包的概念. 类文件的同名是很正常,但是内容都不一样.这样存储时,该怎么操作?要将两个类文件分开来存放,这就是包.包在文件夹,或者文件系统当中,或者window

JAVA-初步认识-第十二章-面向对象(导入import)

一. 讲到现在发现,有包不如没包,源程序中书写类名要写很长(类名的前缀包很多时).类文件的层次结构太多,包太多,显得很麻烦. 如果不愿意写这么长的名字,我们有一些解决办法.我们可以通过一个关键字来做这件事情,让你能实现相同的功能. 上图就是导入DemoA的包,我觉着导入就意味着将位置由所属的其它包,变为了本包的位置.这样可以更为方便的使用. 如果其他包里还有其他的类也要使用,那就继续往里面导入. 有人说,这样很麻烦,可以用简单的方法,就是通配符.统统都匹配的符号. 用*来代替所有. 现在pack

JAVA-初步认识-第十二章-面向对象(Jar包)

一. Java的程序我们已经把它封装在包里面了,java的程序很多的情况下,包很多的情况下,我们把它塞成一个文件.这样显得更为方便. 这个压缩工具有什么好处?可以把多个目录合成一个文件. Java中也有一个这样的打包工具,就是jar.可惜的是,jar并不是图形化界面的工具,它是DOS的工具. 怎么来操作jar工具, 有一个源程序就叫做JarDemo.java,现在对它进行编译.到目前实施的编译,都是带有包机制的. 最后运行了一下,类文件,没有问题,可以正常地输出结果.(这里要注意的就是在运行类文

Java(第十二章)

第十二章 一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同) 2.1 成员变量,有默认值 在当前类直接通过成员变量名调用:在其他类中,通过该类的对象名.属性(成员变量)名调用:成员变量名称在同一个类中是唯一的. 2.2 局部变量,没有默认值,必须先赋值再使用 局部变量,只能在当前的方法中使用,其他方法和其他类不能调用:在同一个方法中名称是唯一的,

张季跃 201771010139《面向对象程序设计(java)》第十二周学习总结

张季跃 201771010139<面向对象程序设计(java)>第十二周学习总结 第二部分:实验部分 1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: (2) 掌握Java GUI中2D图形绘制常用类的API: (3) 了解Java GUI中2D图形中字体与颜色的设置方法: (4) 了解Java GUI中2D图像的载入方法. 2.实验内容和步骤 实验1: 导入第9章示例程序,测试程序并进行代码注释. 2.实验内容和步骤 实验1: 导入第10章示例程序,测试

Java 第十二章 继承 笔记

Java 第十二章  继承 笔记 一.使用继承:     1)方便修改代码     2)减少代码量 二.super 继承object 类:super 访问父类的无参构造:super 指的是object 的无参构造.     例:子类调用父类:super.属性 / super.方法    注意:子类不能继承父类私有属性:得用set.get方法来调用:    super只能写在代码块的第一句:super只能调用非私有的方法:    super只能出现在子类的方法和构造方法中. 三.不能被继承的父类成