static(静态),final,包,权限修饰符以及内部类
1. static静态的,是一个关键字,用来修饰成员变量或者成员方法;
特点如下:
1> 被static修饰的成员,属于类成员,是类的一部分.
2> 被static修饰的成员变量,属于共享数据,一个地方改变了,在另外的地方访问也就变了.
修饰成员变量的格式: static 数据类型 变量名;
修饰成员方法的格式: public static void method(参数){...}
如何使用static修饰的内容:
方式一: 使用类名称类访问;
类名称.成员变量
类名称.成员方法();
方式二: 使用对象名访问;(不推荐的)
对象名.成员变量
对象名.成员方法();
注意点:
被static修饰的内容属于类的一部分,应该使用类名称访问
2. 在多态的体现形式下,访问静态内容和非静态内容的特点:
非静态内容:
成员变量: 编译看左边, 运行看左边
成员方法: 编译看左边, 运行看右边
静态内容:
成员变量: 编译看左边, 运行看左边
成员方法: 编译看左边, 运行看左边
3. 什么是静态代码块呢?
被static修饰的代码块称为静态代码块.
格式:
static{
}
特点:
1> 只要静态代码块所在的类被使用(不管以什么样的形式)马上就会执行, 并只会执行一次
2> 静态代码块一般可以用来加载驱动驱动信息,比如: 数据库驱动
构造代码块: 只要创建对象就会执行,一般情况下可以给final成员变量去赋值.还可编写构造方法中共有的代码
构造方法: 只要创建对象就会执行, 创建对象的时候调用
一一福利:说出下列代码的执行顺序
public class A {
static{
System.out.println("A: Animal === 静态代码块");
}
{
System.out.println("B: Animal == 构造代码块");
}
public A(){
System.out.println("C: Animal == 构造方法");
}
}
public class B extends A {
static{
System.out.println("D: Cat === 静态代码块");
}
{
System.out.println("E: Cat == 构造代码块");
}
public B(){
System.out.println("F: Cat == 构造方法");
}
}
public class Demo {
public static void main(String[] args) {
new B();
}
}
答案: ADBCEF 执行顺序执行流程: 父类静态代码块-->子类静态代码块-->父类构造代码块-->父类构造方法-->子类构造代码块-->子类构造方法
4. final: 最终的,最后的, 关键字, 用来修饰类,成员变量, 成员方法, 局部变量;
修饰之后的内容特点如下:
修饰类:
被final修饰的类,可以有父类,但是没有子类(太监类)
格式: public final class 类名{...}
修饰成员变量:
被final修饰的成员变量,是一个常量,需要在定义的时候赋值,或者是构造代码块,或者构造方法中赋值.
格式: final 数据类型 变量名 = 赋值; (只能赋值一次)
修饰成员方法:
被final修饰的成员方法,不能被重写;
格式: public final void method(参数){...}
修饰局部变量:
1> 基本数据类型: 表示里面的值不能被改变了(只能赋值一次)
final 数据类型 变量名 = 赋值;
2> 引用数据类型: 表示地址值不能重新指向, 但是内容可以改变;
5. 什么是包呢?
就是电脑上的一些文件夹, 用来分类管理代码的.
如何使用一个包,或者是声明一个包?
需要使用到关键字: package
格式: package 包名.包名.包名....包名;
特点: 必须写在有效代码的第一行;注释不算
如何使用一个包? 说白了使用的就是包里面的类.
有两种方式:
1> 使用这类的全路径, 包含包名,比如: java.util.Scanner;
2> 使用关键字import导入要使用的类所在的包.// 快捷键: ctrl + shift + o
注意点:
1> 如果要使用的类和当前的类在同一个包下面,使用不需要导入包
2> 如果要使用的类在java.lang包下面使用不需要导入包, 比如String,StringBuilder
3> 如何要使用的类在java.lang包的子包下面,使用需要导入包.
4> 同一个包中不允许出现相同的类名, 在不同的包中可以出现同名的java文件
6. 在java中修饰成员的关键字有四个,他们修饰之后的可见范围如下:
大小关系: public > protected > default > private
public protected default(默认不写) private
同包,同类 YES YES YES YES
同包,不同类 YES YES YES NO
不同包,子类 YES YES NO NO
不同包,非子类 YES NO NO NO
注意点
经常使用的两个权限修饰符, public最大权限, private最小权限.
7. 什么是内部类: 就是在一个类的里面,在定义一个类
一般用来描述事物之间的所属关系, 比如: 汽车事物里面需要描述发动机,可以使用内部类.
比如: 怀宝宝的动物
成员变量: 定义在类的里面,方法的外面
局部变量: 定义在方法的里面
内部类的分类:
成员内部类: 定义在内的里面,方法的外面
局部内部类(匿名内部类): 方法的里面
成员内部类的定义:
public class 外部类{
// 成员变量
// 内部类
public class 内部类{
// 内部类的成员变量和成员方法
}
}
举个例子:
描述一个身体里面有一个心脏类;
内部类的特点:
1> 在内部类中(里面)可以访问,外部类的任意内容
2> 如何创建一个内部类对象呢?
格式: 外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
3> 在外部类中,不能访问内部类的任何内容.
如何在内部类中,出现了和外部类同名的成员变量该如何去访问?
格式: 外部类名.this.成员变量
8. 内部类
分成两种:
成员内部类:
局部内部类: 定义在方法里面
匿名内部类的格式:
接口/抽象类 变量名 = new 接口/抽象类(){
// 重写抽象方法
};
格式解释:
1> 等号的右边大括号{}, 表示定义了一个匿名的内部类.
2> 等号右边的new 接口(), 表示创建了匿名内部类的一个对象
3> 等号左边,使用接口去接收了,匿名内部类的对象;// 多态
作用:
没有学习匿名内部类之前,如果要想使用接口或者抽象类,必须创建实现类,或者子类,才能使用
有了匿名内部类之后,可以简化了.
补充:* 类/接口作为方法的参数和返回值:
* 不管是JDK提供的类/接口,还是自定义的类/接口,都可以作为方法的参数和返回值
* 链式编程, 条件: 需要方法有返回值