第一章 包
1.1 包
包在操作系统中其实就是一个文件夹。包是用来分门别类的管理技术,不同的技术类放在不同的包下,方便管理和维护。
在IDEA项目中,建包的操作如下:
这个咱们在基础班就谈到过。
包名的命名规范:
路径名.路径名.xxx.xxx
// 例如:com.itheima.oa
包名一般是公司域名的倒写。例如:黑马是www.itheima.com,包名就可以定义成com.itheima.技术名称。
包名必须用”.“连接。
包名的每个路径名必须是一个合法的标识符,而且不能是Java的关键字。
以后开发项目javabean类经常会写在一个叫domain包里
1.2 导包
什么时候需要导包?
情况一:在使用Java中提供的非核心包中的类时
情况二:使用自己写的其他包中的类时
什么时候不需要导包?
情况一:在使用Java核心包(java.lang)中的类时
情况二:在使用自己写的同一个包中的类时
1.3 使用不同包下的相同类怎么办?
假设demo1和demo2中都有一个Student该如何使用?
代码示例:
//使用全类名的形式即可。 //全类名:包名 + 类名 //拷贝全类名的快捷键:选中类名crtl + shift + alt + c 或者用鼠标点copy,再点击copy Reference com.itheima.homework.demo1.Student s1 = new com.itheima.homework.demo1.Student(); com.itheima.homework.demo2.Student s2 = new com.itheima.homework.demo2.Student();如下图:
强调一下什么是全类名
全类名: 包名+类名(非常重要的概念)后面我们会多次用到全类名
不知道大家还记不记得我在java基础班的第二节课在使用idea时讲了一个自动导包设置,在这里就体现出来了,idea会自动寻找这个类,并在代码上方自动加一行导包的语句。这个当时在基础班讲idea的安装使用时做了一些基本设置,其中就有自动导包设置。它的作用就在这里。
第二章 权限修饰符
2.1 权限修饰符
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,我们之前已经学习过了public 和 private,接下来我们研究一下protected和默认修饰符的作用。
public:公共的,所有地方都可以访问。
protected:本类 ,本包,其他包中的子类都可以访问。
默认(没有修饰符):本类 ,本包可以访问。
注意:默认是空着不写,不是default
private:私有的,当前类可以访问。
public > protected > 默认 > private
3.3 不同权限的访问能力
public | protected | 默认 | private | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中的类 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
为了方便大家理解,我在这里还是做一个例子吧。但是public和private由于之前就接触过来,就不再测试他俩:
先来说默认情况:(以下情况都指的是在不同包中)
如图所示,父类中变量a的权限为默认类型,但是在其他包的子类是不能用的
如果改为protected,如下:
改为protected类型后,发现可以访问了。但是只能在子类中访问。如果不在子类中呢?
再看:
发现又不能访问了,则protected修饰的成员,只能在它的所继承的子类中访问 。
既然protected都只能在继承的子类中才能访问。那么默认类型的就更不能在其他类中访问了
可见,public具有最大权限。private则是最小权限。
编写代码时,如果没有特殊的考虑,建议这样使用权限:
成员变量使用
private
,隐藏细节。构造方法使用
public
,方便创建对象。成员方法使用
public
,方便调用方法。
小贴士:不加权限修饰符,就是默认权限
在以后的开发中,基本只会用到public和private两个关键字,其余两个基本用不到。了解即可。
小结:
第三章 final关键字
3.1 概述
学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。
如果有一个方法我不想别人去改写里面内容,该怎么办呢?
Java提供了final
关键字,表示修饰的内容不可变。
-
final: 不可改变,最终的含义。可以用于修饰类、方法和变量。
-
类:被修饰的类,不能被继承。
-
方法:被修饰的方法,不能被重写。
-
变量:被修饰的变量,有且仅能被赋值一次。
-
3.2 使用方式
3.2.1 修饰类
final修饰的类,不能被继承。
格式如下:
final class 类名 { }代码:
final class Fu { } // class Zi extends Fu {} // 报错,不能继承final的类
查询API发现像 public final class String
、public final class Math
、public final class Scanner
等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。
3.2.2 修饰方法
final修饰的方法,不能被重写。 格式如下:
修饰符 final 返回值类型 方法名(参数列表){ //方法体 }代码:
class Fu2 { final public void show1() { System.out.println("Fu2 show1"); } public void show2() { System.out.println("Fu2 show2"); } } class Zi2 extends Fu2 { // @Override // public void show1() { // System.out.println("Zi2 show1"); // } @Override public void show2() { System.out.println("Zi2 show2"); } }
3.2.3 修饰变量-局部变量
-
局部变量——基本类型 基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下:
public class FinalDemo1 { public static void main(String[] args) { // 声明变量,使用final修饰 final int a; // 第一次赋值 a = 10; // 第二次赋值 a = 20; // 报错,不可重新赋值 // 声明变量,直接赋值,使用final修饰 final int b = 10; // 第二次赋值 b = 20; // 报错,不可重新赋值 } }
思考,下面两种写法,哪种可以通过编译?
写法1:
final int c = 0; for (int i = 0; i < 10; i++) { c = i; System.out.println(c); }写法2:
for (int i = 0; i < 10; i++) { final int c = i; System.out.println(c); }
根据 final
的定义,写法1报错!写法2正确,为什么通过编译呢?因为每次循环,都是一次新的变量c。这也是大家需要注意的地方。
3.2.4 修饰变量-成员变量
成员变量涉及到初始化的问题,初始化方式有显示初始化和构造方法初始化,只能选择其中一个:
-
显示初始化(在定义成员变量的时候立马赋值)(常用);
public class Student { final int num = 10; }
-
发现final修饰成员变量不赋值要报错, 因此用final修饰成员变量时,一定要赋值。而修饰局部变量却不会报错。如下:
-
-
构造方法初始化(在构造方法中赋值一次)(不常用,了解即可)。
注意:每个构造方法中都要赋值一次!
public class Student {
final int num = 10;
final int num2;//报错!!final修饰的成员变量必须手动赋值!!
public Student() {
this.num2 = 20;
// this.num2 = 20;
}
public Student(String name) {
this.num2 = 20;
// this.num2 = 20;
}
}
被final修饰的常量名称,在C语言里相当于const修饰的变量,称之为常变量。一般都有书写规范,所有字母都大写。