在Java编程中有一句关于对象的说法,即万事万物皆对象。例如现实生活中的人、车、狗等等都可以看为是一个个的对象。拿一条狗举例,它的属性/状态有:名字,品种,颜色等,它的行为有:跑、跳、吃摇尾巴等等。那么换为Java软件中对象,类中属性就是状态,行为通过方法去体现。
包 package
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。每个类都在包下。
作用
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
命名与路径
- 包的名称都使用小写字母,避免与类或接口的命名冲突。
- 可以通过.使包出现层级,便于分类。
- com.dj.util 那么这个包的路径就是com/dj/util。
包的声明
- 包的声明使用package关键字。例如:package 包路径;
- 包声明必须在源文件(类、接口等)的第一行,并且一个源文件只可以拥有一个包的声明。
- 如果没有声明包的源文件,Java会自动的将它放入到无名包(unnamed package)中。
import关键字(导包)
当A包中的某一个类想使用另一个包中的某个类中的方法时,就需要使用import将该类导入到本类中,才可以调用。
注意:
- 导包时的包路径必须写到文件名(不带后缀)。
- 导包时最后以*结尾表示,对应包下的所有类都被导入了。
- Java中同包下的类之间相互调用可以不用导包。
- 一个类可以导入N个包。
- java.lang是一个特殊包,它包下的内容是Java最基础与核心的内容,在Java程序运行时会自动的把lang包下的内容导入,所以我们在使用java.lang下的内容都无需我们手动的去导包。例如,基本数据类型,与String类都在该包下,所以我们在调用时无需导包。
引用类型的使用
与基本数据类型不同,引用数据类型的变量定义有一个相对固定的步骤或格式。
定义步骤:
- 导包:使用import导包,在类的所有代码之前导包(找到要使用的类型),java.lang包下的所有类无需导入,可以直接使用。
- 创建对象:引用类型 变量名 = new引用类型();
- 调用:变量名.方法名();
键盘输入 Scanner类
Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入。
使用步骤:
- 导包:import java.util.Scanner;
- 创建对象实例:Scanner input = new Scanner(System.in);
- 调用方法:
nextInt():接收一个整数。 int age = input.nextInt();
next():接收一个字符串。 String name = input.next();
随机数 Random类
生成随机数需要使用到引用类型随机数Random类。
使用步骤:
- 导包:java.util.Random;
- 创建对象实例:Random random = new Random();
- 调用方法:
字符串 String类
String类是一个特殊的引用类型,它在java.lang包下,所以我们在使用它时可以不用导包,并且可以不用new的方式来获取它的实例。
String实例的创建方式:
- String str = "hello world";
- String str = new String("hello world");
自定义数据类型/引用数据类型/类class
任何编程语言想要将现实生活中的事务抽象成代码,就需要使用自定义数据类型(类)来定义和描述。
在Java中,class(类)也是一种数据类型,自定义数据类型也叫做引用数据类型。由我们自己创建和描述,并非Java事先为我们提供好的数据类型。
类声明
类在类声明出来后必须使用,不使用Java不会出现语法错误,但是声明出来不使用的话,这样的类是没有意义的,同时也会造成程序的负担。
语法:
修饰符 class 类名{}
注意:
- 必须使用class关键字。
- 类名必须和文件名保持一致。
- 类中的内容必须在{}内。
类使用
语法:className 变量名 = new clasName();
步骤:
- 自定义数据类型与其它引用数据类型在创建/实例化方式上相同。都需要进行导包。
- 使用new关键字进行类(对象)的实例化。
- 调用方法或访问属性。
类的组成
类class作为Java面向对象的一个模板,它描述一类对象的行为和状态。类可以看成是Java面向对象的模板。
属性/变量(状态)
变量类型
全局变量:类中的属性、方法外的变量,都可以看为全局变量。这种变量可以被类中所有的方法、构造方法和特定类的语句块访问。
局部变量:在类中方法内或特殊代码块内定义的变量被称为局部变量。这种变量只能在本方法内被使用。
全局变量
局部变量
变量作用域
- 全局变量可以在本类中任意方法或代码块内使用。
- 局部变量之内在被定义的方法内或特殊代码块内使用。
方法(行为)
软件的本质是为我们提供了解决日常事务的许多功能。在Java当中通过方法的方式来完成这些功能。即Java中的某个方法提供了某种功能,供我们解决问题。例如Scanner、Random。
我们可以将一个完整功能的代码组织成一个方法,在再次完成相同的功能时,便可以直接以整体的方式调用该功能,而不需要再将具体实现过程完整重复编写一遍。
什么是方法
- 方法是解决一类问题的步骤的有序组合。
- 方法包含于类或对象中。
- 方法在类中被创建,在其它地方被使用。
方法的构成
命名规则:
- 必须以字母,_,$开头。
- 不能以数字开头。
- 小驼峰法则,见名识意。
方法声明:
修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值;
}
修饰符:可选的、定义了该方法访问类型。
返回值类型:方法需要返回到结果,返回值类型可以是:基本数据类型,引用数据类型,数组,集合、自定义数据类型等。但没有返回值的情况可以使用void关键字。
方法名:是方法的实际名称,供调用时使用。
参数类型:调用方法时传入的参数类型。可以是基本数据类型,引用数据类型、数组、集合等。
参数名:是一个变量,用于接收在方法被调用时传入的数据。参数的个数可以是多个,也可以不包含任何参数。
方法体:方法体包含具体的语句代码,定义该方法的功能。
return:用户方法结束方法以及返回对应的数据。
返回值:被return返回的值,该值会返回给方法的调用者,返回值必须与返回值类型相同。
方法使用/调用
所有被声明出来的方法,都是为了被调用。没有被调用的方法,声明出来是没有意义的。
调用步骤:
- 创建对应方法对象(类)的实例。
- 对象名.方法名(对应参数);
注意
- 方法都是在类中被定义的。
- main方法是类中一个特殊的方法,作为程序的入口被jvm调用。
- 在本类中的方法可以互相调用,无需创建对象。
- 方法必须先定义在使用。
- 方法的定义顺序和调用无关。
方法的优点
- 使程序变的简短而清晰。
- 有利于程序的维护。
- 可以提高程序开发效率。
- 提高了代码的重用性。
构造方法/构造器(必有)
每个类中都有构造方法,在本类被创建(实例化)时都会调用对应的构造方法。
构造方法分为:
- 有参构造方法。
- 无参构造方法(默认)。
构造方法语法:
- 构造方法的方法名必须和类名相同。
- 1个类中可以同时存在多个不同的构造方法。
- 如果定义了有参的构造器,默认无参的构造器就失效。如需无参构造器,需要创建无参构造器。
构造方法作用:
- 一般常用来初始化类中的属性值。
- 类中某些功能需要在类被创建/实例化时必须使用。
使用this关键字可以区分全局变量和局部变量之间发生的名称冲突。
构造方法和普通方法区别:
- 语法:构造方法直接修饰符 类名(){}。
- 调用:构造方法在 new 的时候被调用。普通方法在new之后通过.方法名()被调用。
- 方法名:构造方法必须和类名保持一致,普通方法随意起名字。
修饰符
修饰符用来定义变量、类、方法等,通常放到语句的最前面。
访问修饰符
公共的public对所有的类可见
受保护的protected对同一包内的所有类和子类可见。
默认的default在同一包内可见。
私有的private私有的,同一类内可见。
修饰符 | 当前类 | 同一包内 | 子孙类 | 其他包 |
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
非访问修饰符
final
- 用来声明常量。
- 被final修饰的类不可以被继承。
- 被final修饰的方法不可以重写。
static
- static修饰的变量为静态变量,局部变量不能使用static修饰。
- static修饰的方法为静态方法,只可以使用静态的全局变量。例如主程序 main方法。
- 类中的静态方法不需要实例化就可以调用。