目录
课前先导
学完本篇,我们就要进入面向对象的学习了,之前我们的代码都在一个类中完成,是Java代码的入门写法,我们今天的学习就是由一个类完成代码到多个类完成代码的过渡,很重要!
本篇是后面面向对象要用到的只是点,大家现在不懂的不必纠结,把这篇当做查询资料,在后面的学习中有什么不懂的来查询就可以了。
一、如何导入包
我们前面的学习内容总共有两个需要导包的类,Scanner类和Arrays类,他们都是由我们安装的JDK提供的java util包中的类,今天我们就来看看Java中其他的包以及怎么导入包
1、JDK提供的基本包
(1)java.lang:虚拟机自动引入
(2)java.util:提供一些实用类
(3)java.io:输入、输出
前面两个我们都见过和用过了,io包在我们后面学到io流的时候就见到了
2、如何导入包
导入包时,如果包里面还有子文件夹,是不导入子文件夹的
语法格式:
import 包名.类名;
(1)导入系统包;
import java.util.*: 导入java.util包中所有类 ,有它就不用其他的util导包语句了
(2)导入自定义的包
3、导包注意事项
(1)一个类同时引用了两个来自不同包的同名类 必须通过完整类名来区分;
(2)每个包都是独立的,顶层包不会包含子包的类;
(3)package和import的顺序是固定的
* package必须位于第一行(忽略注释行)
* 只允许有一个package语句
* 其次是import
* 接着是类的声明
二、成员变量与局部变量
1、成员变量
成员变量(全局变量)定义在类中方法外(某些结构外)的变量,能够作用在整个类中,可以用static修饰。(被static修饰的成员变量叫静态变量,没被static修饰的变量叫实例变量)
成员变量可以分为两种
(1)实例变量:指没有被 static 修饰的成员变量;
(2) 静态变量(或称为类变量):指被 static 修饰的成员变量。
2、局部变量
局部变量定义在方法或者某些结构中的变量,只能作用在方法中或者定义它的结构中,不可以用static修饰。
main方法也是一个方法,而且是用static修饰的静态方法 ,main方法里面的变量是局部变量
3、注意事项
(1)系统会给成员变量赋予一个默认值,局部变量必须先初始化(赋值)才能使用,系统不会给局部变量赋予默认值
这里报错是因为main方法是静态方法,静态方法只能调用静态变量和静态方法,我们给成员变量加上static
这里报错是因为局部变量是没有默认值的,我们没有给他赋值,它就没有值,就不能参加运算,我们给它赋个值
(2)同一个类中不能有同名的成员变量(全局变量),在同一个方法或者结构中,不能有同名的局部变量,不同的方法中可以有同名的局部变量
同一个类中定义相同的成员变量名会报错,在同一个类中不同的方法中(结构中)定义相同的局部变量名可以使用,因为 局部变量随着方法的调用而存在,随着方法调用的完毕而消失。
(3)同一个类中可以有同名的成员变量和局部变量,但是局部变量具有更高的优先级
我们先定义个成员变量,然后通过main方法输出
再在main方法中定义一个和成员变量同名的局部变量 ,然后输出
输出的是局部变量a。
4、成员变量和局部变量的区别
(1)在类中定义的位置不同
成员变量在类中方法外(某种结构外);
局部变量定义在方法中(某种结构中)。
(2) 初始化值不同
成员变量有默认的初始化值;
局部变量没有默认的初始化值,必须先定义,赋值之后才能使用。
(3)生命周期不同
成员变量随着对象的存在而存在,随着对象的消失而消失;
局部变量随着方法的调用而存在,随着方法调用的完毕而消失。
(4)在内存中的位置不同
成员变量是在堆内存中;
局部变量是在栈内存中。
三、访问权限修饰符
Java中的权限修饰符一共有四个,按访问权限的从大到小排列;分别是:
public 、protected 、默认(default) 、private;
英文单词: public 公共的、公众的 protected 受保护的 private 私有的
访问权限控制又分为:类的访问控制和类成员的访问控制
1、类的访问控制
能修饰类的访问权限修饰符只有两个:public 和 默认(default)
public访问权限修饰符:公有访问级别;
默认(default)访问权限修饰符:包级私有访问级别。
(1)public修饰的类
一个Java文件只能有一个public修饰的类,并且这个类的名称要和这个Java怎建的名称保持一致(就是我们平常创建的类),否则会报错。
(2)默认修饰符修饰的类
一个Java文件中可以有多个默认修饰符修饰的类(默认修饰符不要写default,什么都不写)
(3)不同修饰符修饰的类的区别
----> 一个Java文件中,除了可以定义public修饰的类之外,还可以定义0个或者多个默认修饰符(不要写default,什么都不写)的类
注意:一般来说,一个Java文件中只定义一个类
---->在同一个包中的public修饰的类中访问public和默认修饰符修饰的类
---->在同一个包中的默认修饰符修饰的类中访问public和默认修饰符修饰的类
---->在不同包中的public修饰的类中访问public和默认修饰符修饰的类
出问题了,访问默认修饰符修饰的类报错了,不是我没有导包,MyEclipse也没提示我导包,我们手动导包看一下
访问默认修饰符修饰的类还是报错 !并不是我们导包的问题。
---->在不同包中的默认修饰符修饰的类中访问public和默认修饰符修饰的类
访问默认修饰符修饰的类报错了,我们再手动导包
访问默认修饰符修饰的类还是报错 !
(4)类的访问控制总结
* 一个Java文件中,除了可以定义public修饰的类之外,还可以定义0个或者多个默认修饰符的类;
* public修饰的类可以在任何地方被访问;
* 默认修饰符修饰的类只能被同包的类访问。
2、类成员的访问控制
(1)public:公共权限,可以被任意类访问,不同包不同类依然可以访问
(2)protected: :受保护的权限
* 同包中的其他类可以访问其他类protected修饰的属性;
* 不同包中的类不能访问protected修饰的属性;
* 子类可以访问父类中默认修饰的属性
(3)默认修饰符:
* 同包中的其他类可以访问其他类默认修饰符修饰的属性
* 不同包中的类不能访问默认修饰符修饰的属性
* 子类不可以访问父类中默认修饰的属性
(4)private:私有权限
只能在本类中被访问访问
四、static静态修饰
我们main方法的语句和我们之前定义方法中都能看到static,今天就来了解一下。
英文单词: static 静止的、静态的
(1)static关键字可以修饰成员变量和成员方法,被static修饰的成员变量叫静态变量,被static修饰的方法叫静态方法。局部变量不可以被static修饰;
(2)static关键字主要用于内存管理,被static修饰的成员只会分配一次存储空间,不会因为类的加载而重新分配空间;
(3)static可以修饰变量、方法、代码块和内部类 ;
(4)作用域:static关键字属于类,而不是类的实例。
1、static的特性
(1)随着类的加载而加载(在类加载的同时就分配好了内存空间);
(2)优先于对象存在;
(3)被所有对象共享(可以在只赋一次值后,所有的对象都可以直接调用,共享这个值,或直接通过类名调用)。
2、static修饰的成员
(1)被static修饰的成员变量
称为类变量或静态变量;
可以被类内部的任意方法访问。
(2)static修饰的成员方法
称为类方法或静态方法;
可以被类内部的任何方法访问,但静态方法只能访问静态变量。
(3) 被static修饰的成员在面向对象中的特点
(1)被static修饰的成员会存储在数据共享区;
(2)被static修饰的成员变量的值只有一个,我们可以通过多个对象调用它;
(3)被static修饰的成员,有两种调用方式,除了可以通过对象名调用外,还可以通过类名调用它
类名.静态成员;
我们先定义一个属性类
我们先通过对象调用
看另一种用对象调用静态方法的格式 :静态变量只赋一次值
通过类名调用静态方法
3、实例变量与静态变量的区别
实例变量:
(1)每创建一个实例,Java 虚拟机就会为实例变量分配一次内存;
(2)在类的内部,可以在非静态方法中直接访问(静态方法只能访问静态变量);
(3)在本类的静态方法或其他类中则需要通过类的实例对象进行访问。
静态变量:
(1)在类的加载过程中完成静态变量的内存分配,Java 虚拟机只为静态变量分配一次内存,不会随着类的加载重新分配内存;
(2)在类的内部,可以在任何方法体内直接访问静态变量;
(3)在其他类中,可以通过类名访问该类中的静态变量。
在内存中的位置:
实例变量:随着对象的建立存放在堆内存中;
静态变量:随着类的加载存放在栈内存中。
生命周期不同:
类变量周期生命最长,随着类的消失而消失;
实例变量生命周期比类变量短,它是随着对象的消失而消失。
4、实例方法与静态方法的区别
静态方法(或称为类方法):指被 static 修饰的成员方法;
实例方法:指没有被 static 修饰的成员方法。
(1) 静态方法,属于类,而不属于类的对象;
(2)静态方法可以通过类名被直接调用,无需创建类的对象;
(3)静态方法中,不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法;
(4)静态方法中,可以直接访问所属类的静态变量和静态方法
(5)因为静态优先于对象存在,所以静态得方法中是不可以定义this、super关键字的
(6)实例方法,可直接访问所属类的静态变量、静态方法、实例变量和实例方法
5、静态代码块
用static修饰的代码块
static{
// java代码
}
(1)如果有多个静态代码块,按顺序加载;
(2) 每个静态代码块只会被执行一次。
我们先看在一个类中的写法
public class Demo17 {
//静态变量
static int num = 100;
//静态代码块
static{
num *= 2;
System.out.println("静态代码块一:"+num);
}
static{
num += 200;
System.out.println("静态代码块二:"+num);
}
static{
num /= 4;
System.out.println("静态代码块三:"+num);
}
//main方法
public static void main(String[] args) {
}
}
没有main方法程序是不执行的,main方法是程序执行的入口
我们上面这种写法是标准的,在开发工具MyEclipse中运行时会有提示,我们看一下标准用法
比较上面的代码,我们再定义一个静态方法 ,再别的类中调用
public class Demo17 {
//静态变量
static int num = 100;
//静态代码块
static{
num *= 2;
System.out.println("静态代码块一:"+num);
}
static{
num += 200;
System.out.println("静态代码块二:"+num);
}
static{
num /= 4;
System.out.println("静态代码块三:"+num);
}
//静态方法
public void show(){
System.out.println("静态方法");
}
}
我们在main方法中创建对象后直接运行,可以看到我们的运行结果是静态代码块,因为static修饰的成员是属于类的,随着类的加载而加载,我们创建Demo17类的对象时,加载了Demo17类,随着加载的还有它的静态成员。
这里我们创建了两个对象,类加载了两次,而静态代码只运行了一次说明每个静态代码块只会被执行一次。
我们再看一下怎么调用静态变量和静态方法
通过上图可以看到我们的代码用对象调用静态成员报黄了,因为static属于类,所以一般用类名调用,用对象调用也没错
今天这篇知识点还是比较乱,大家可以作为查询资料,在后面面向对象的学习中有什么不懂的可以查阅,我们现在就对这些只是混个眼熟,后面学习面向对象时能够知道是干嘛的就行。好了,今天的学习就到此结束了,我是一米八、有腹肌、低于半小时你报警的Loveletter,觉得内容不错的小伙伴可以点点关注,我们下篇博文见,再见!