【Java基本功】很多人经常忽视的Java基础知识点

*.Java文件

问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

  答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同。

为什么一个java源文件中只能有一个public类?

在java编程思想(第四版)一书中有这样3段话(6.4 类的访问权限):

  1.每个编译单元(文件)都只能有一个public类,这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出错误信息。

  2.public类的名称必须完全与含有该编译单元的文件名相同,包含大小写。如果不匹配,同样将得到编译错误。

  3.虽然不是很常用,但编译单元内完全不带public类也是可能的。在这种情况下,可以随意对文件命名。

总结相关的几个问题:

1、一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?

??答:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

2、为什么一个文件中只能有一个public的类

??答:编译器在编译时,针对一个java源代码文件(也称为“编译单元”)只会接受一个public类。否则报错。

3、在java文件中是否可以没有public类

??答:public类不是必须的,java文件中可以没有public类。

4、为什么这个public的类的类名必须和文件名相同

??答: 是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件。

Main方法

主函数:是一个特殊的函数,作为程序的入口,可以被JVM调用

主函数的定义:

public:代表着该函数访问权限是最大的

static:代表主函数随着类的加载就已经存在了

void:主函数没有具体的返回值

main:不是关键字,但是一个特殊的单词,能够被JVM识别

(String[] args):函数的参数,参数类型是一个数组,该数组中的元素师字符串,字符串数组。main(String[] args) 字符串数组的 此时空数组的长度是0,但也可以在 运行的时候向其中传入参数。

主函数时固定格式的,JVM识别

主函数可以被重载,但是JVM只识别main(String[] args),其他都是作为一般函数。这里面的args知识数组变量可以更改,其他都不能更改。

一个java文件中可以包含很多个类,每个类中有且仅有一个主函数,但是每个java文件中可以包含多个主函数,在运行时,需要指定JVM入口是哪个。例如一个类的主函数可以调用另一个类的主函数。不一定会使用public类的主函数。

外部类的访问权限

外部类只能用public和default修饰。

为什么要对外部类或类做修饰呢?

1.存在包概念:public 和 default 能区分这个外部类能对不同包作一个划分 (default修饰的类,其他包中引入不了这个类,public修饰的类才能被import)

2.protected是包内可见并且子类可见,但是当一个外部类想要继承一个protected修饰的非同包类时,压根找不到这个类,更别提几层了

3.private修饰的外部类,其他任何外部类都无法导入它。


  1. //Java中的文件名要和public修饰的类名相同,否则会报错
  2. //如果没有public修饰的类,则文件可以随意命名
  3. public class Java中的类文件 {
  4. }
  5. //非公共开类的访问权限默认是包访问权限,不能用private和protected
  6. //一个外部类的访问权限只有两种,一种是包内可见,一种是包外可见。
  7. //如果用private修饰,其他类根本无法看到这个类,也就没有意义了。
  8. //如果用protected,虽然也是包内可见,但是如果有子类想要继承该类但是不同包时,
  9. //压根找不到这个类,也不可能继承它了,所以干脆用default代替。
  10. class A{
  11. }

Java包的命名规则

以 java.* 开头的是Java的核心包,所有程序都会使用这些包中的类;

以 javax.* 开头的是扩展包,x 是 extension 的意思,也就是扩展。虽然 javax.* 是对 java.* 的优化和扩展,但是由于 javax.* 使用的越来越多,很多程序都依赖于 javax.,所以 javax. 也是核心的一部分了,也随JDK一起发布。

以 org.* 开头的是各个机构或组织发布的包,因为这些组织很有影响力,它们的代码质量很高,所以也将它们开发的部分常用的类随JDK一起发布。

在包的命名方面,为了防止重名,有一个惯例:大家都以自己域名的倒写形式作为开头来为自己开发的包命名,例如百度发布的包会以 com.baidu.* 开头,w3c组织发布的包会以 org.w3c.* 开头,微学苑发布的包会以 net.weixueyuan.* 开头……

组织机构的域名后缀一般为 org,公司的域名后缀一般为 com,可以认为 org.* 开头的包为非盈利组织机构发布的包,它们一般是开源的,可以免费使用在自己的产品中,不用考虑侵权问题,而以 com.* 开头的包往往由盈利性的公司发布,可能会有版权问题,使用时要注意。

import的使用

Java import以及Java类的搜索路径 如果你希望使用Java包中的类,就必须先使用import语句导入 语法为:


  1. import package1[.package2…].classname;
  2. package 为包名,classname 为类名。例如:
  3. import java.util.Date; // 导入 java.util 包下的 Date 类
  4. import java.util.Scanner; // 导入 java.util 包下的 Scanner 类
  5. import javax.swing.*; // 导入 javax.swing 包下的所有类,* 表示所有类

注意:

import 只能导入包所包含的类,而不能导入包。 为方便起见,我们一般不导入单独的类,而是导入包下所有的类,例如 import java.util.*;。

Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*;),其中定义了一些常用类,如 System、String、Object、Math 等,因此我们可以直接使用这些类而不必显式导入。但是使用其他类必须先导入。

前面讲到的”Hello World“程序使用了System.out.println(); 语句,System 类位于 java.lang 包,虽然我们没有显式导入这个包中的类,但是Java 编译器默认已经为我们导入了,否则程序会执行失败。

java类的搜索路径 Java程序运行时要导入相应的类,也就是加载 .class 文件的过程。 假设有如下的 import 语句:

import p1.Test;

该语句表明要导入 p1 包中的 Test 类。 安装JDK时,我们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为 .;%JAVAHOME%\lib,而 JAVAHOME 又为 D:\Program Files\jdk1.7.071,所以 CLASSPATH 等价于 .;D:\Program Files\jdk1.7.071\lib。

如果在第一个路径下找到了所需的类文件,则停止搜索,否则继续搜索后面的路径,如果在所有的路径下都未能找到所需的类文件,则编译或运行出错。

你可以在CLASSPATH变量中增加搜索路径,例如 .;%JAVA_HOME%\lib;C:\javalib,那么你就可以将类文件放在 C:\javalib 目录下,Java运行环境一样会找到。

用户自己写的类可以通过IDE指定编译后的class文件的输出目录,appclassloader会到指定目录进行类的加载

下面是一个import两种访问权限的类的实例:


  1. package com.javase.Java中的类.一个包;
  2. public class 全局访问 {
  3. }
  4. package com.javase.Java中的类.一个包;
  5. class 包访问权限 {
  6. }
  7. package com.javase.Java中的类;
  8. //import可以导入基础包以及公开的类,需要使用类名的全路径
  9. //并且在导入某个包.*时,是不会把子包的类给导进来的,这样可以避免导入错误。
  10. //注意
  11. //import com.javase.Java中的类.一个包.包访问权限;
  12. //这个导入会报错,因为这个类没有用public修饰,无法用import导入。
  13. import com.javase.Java中的类.一个包.全局访问;//可以导入。

原文地址:https://www.cnblogs.com/xll1025/p/10258114.html

时间: 2024-08-28 14:16:24

【Java基本功】很多人经常忽视的Java基础知识点的相关文章

「Java基本功」一文读懂Java内部类的用法和原理

内部类初探 一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限).内部类主要有以下几类:成员内部类.局部内部类.静态内部类.匿名内部类 二.内部类的共性 (1)内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . (2)内部类不能用普通的方式访问. (3)内部类声明成

一道简单的 Java 笔试题,但值得很多人反思

面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要最终给Leader一句“这个人技术还行/很好/非常好”,就行了.至于其它能力.综合水平,由别人把关.为此,在挑选唯一的一道笔试题时,我特别地上心. 首先,我不敢用网上那些广为流传的,比如Leetcode.<程序员面试宝典>里的题——这些都太难了!正儿八经做,其实很少有人能在1小时内完美做出来,除非之前遇

任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合(java版),很多人小时候都玩过

目录 需求: 需求该如何分析呢,怎么划分成小需求呢? 如何把小需求编排成完整需求: 学有所得 学会分析需求,由哪些组成(规则,逻辑等); 能把的需求分解成很多子需求.或孙需求.或童孙需求,直到每个需求很清晰可实施地为止 学会把各种子孙需求,通过组合编排,最终成为一个完整的大需求解决方案 需求 需求:任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合:通过初步分析,我们可以得到如下规则: 规则:1.任意1-10中的4个数字: 2.使用加减乘除计算得出24; 3.在任何一次计算中不能出

为什么编程入门很多人都会推荐Java?

选择java有很多的理由,最耀眼的理由无非就是这些: 1. Java常年霸占世界编程语言排行榜第一 什么是世界编程语言排行榜呢? 世界编程语言排行榜也称TIOBE排行榜,是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网有经验的程序员.课程和第三方厂商的数量.排名使用著名的搜索引擎(诸如Google.MSN.Yahoo!.Wikipedia.YouTube以及Baidu等)进行计算. 2. JAVA流行时间非常长,1995年,JAVA发布,距今已有24年,在这24年里Java诞生了

Java开发牛人十大必备网站

以下是我收集的Java开发牛人必备的网站.这些网站可以提供信息,以及一些很棒的讲座, 还能解答一般问题.面试问题等.质量是衡量一个网站的关键因素,我个人认为这些网站质量都很好.接下来,我会跟大家分享我是如何使用这些网站学习和娱乐的.或许你会认为有些网站适合任何水平的开发者,但是我认为:对于Java开发牛人来说,网站的好坏取决于如何使用它们. 1.Stackoverflow Stackoverflow.com 可能是编程界中最流行的网站了,该网站有成千上万个好问题和答案.学习API或者编程语言,通

Java Mail多人群发与多附件发送

最近公司的项目用到了Java Mail来发送注册邮件,不过,开发的时候都是使用封装好的JAR,以前也不是很了解Java Mail的使用原理.网上很多代码都是只有一部分,看一看也跑不起来,今天正好有时间,自己写了一个实现,放在了自己的工具JAR里.闲话不多说,我的项目是使用Gradle构建的,依赖的引用如下: //JavaMail compile('javax.mail:mail:1.4.7') 相当于Maven的groupId,artifactId,version 构建后应该引用了两个JAR:.

你需要知道的10位Java开发牛人

1.James Gosling 1983 年,Gosling 获得了加州大学的计算机科学学士学位.1990 年,他获得了卡内基梅隆大学的计算机科学博士学位,师从 BobSproull.在攻读博士期间,他自己开发了一款 emacs,叫 Gosling Emacs(Gosmacs),在大学的这段时间,他还开发了一个多处理器版本的 Unix,以及数个编译器和邮件系统,之后才加入 Sun 公司. 1984 到 2010 年间,Gosling 一直在 Sun 公司工作.他被公认为 Java 之父. Ora

【Java二十周年】我比Java大10岁

1991年,我7岁,刚刚步入学堂不到半年.而计算机在那个年代也是一个新奇的事物.可就在那样的环境中,Java已经有了萌芽.那一年,SUN公司启动绿色计划,打算发展一种可以在任何消费电子产品上运行的软件.但由于C++自身有很多不足,所以项目组决定自行开发一种新的语言Oak.最初,Oak应用于机顶盒,但是在当时市场不成熟的情况下,项目失败了.但Oak却得到了SUN领导的赏识,于是: 1995年3月23日,在对Oak进行小规模改造后Java语言诞生了,并广泛应用于互联网领域. 一年后,在1996年,我

集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序的条码控件Java Barcode Package

Java Barcode Package控件是一款条码生成控件,包含所有的JavaBean,Applets,Servlets和类库可以使用于装有Java虚拟机的任何平台,包括Windows?, Linux, MacOS, Unix, Solaris, HP/UX, AS/400 和OS/390,用于集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序. 具体功能: 可在任何装有Java虚拟机的操作系统上生成条形码. 此产品的开发者授权是永久的且免收版权费用的. 支持ID