1.匿名对象
指在创建对象的时候,只有创建语句,没将对象地址赋值给某个变量
new Person();
1.1 特点
1、创建时,可直接使用,没有变量名
new Person().eat();
2、匿名对象在未指定其引用变量时,只可使用一次
new Person().eat();
new Person().eat();
再次调用eat(),需重新创建一个Person对象。
3、可作为方法接收的参数,方法返回值使用
return new Person();
Demo.method(new Person());
1.2 应用场景
1、方法只调用一次时;
2、作为参数进行传递时(无法在传参之前进行赋值等操作)。
2. 内部类
可写在其他类(外部类)的成员位置和局部位置。
内部类可访问外部类的成员,包括私有成员。
2.1 成员内部类
定义在外部类的成员位置,可用修饰类成员的修饰符修饰。
- 若用private,则无法再其他类中被访问
- 其余限定修饰符都可以。
- 若由static修饰
- 可用外部类名直接创建内部类的对象
- 外部类名.内部类名 变量名=new 外部类名.内部类名();
- 外部类名.内部类名.方法名();(前提是内部类的此方法也用static修饰)
- abstract final也可修饰,不多用
可通过外部类的对象进行访问。
class 外部类{
修饰符 class 内部类{
}
}
内部类无法被别的类看到,访问时需用全名。
访问:
外部类名.内部类名 变量名=new 外部类名.new 内部类()
要调用内部类的成员,需先创建外部类的对象,再用 . 调用。
2.2 局部内部类
定义在外部类方法中的局部位置
可通过调用方法进行访问
class 外部类{
修饰符 返回值 方法名(参数){
class 内部类{
}
}
}
局部内部类在声明之后才可访问。
访问:
在外部类的方法中,创建内部类对象,进行访问:
public class Party{
public void puffBall() {
class Ball{
public void puff() {
System.out.println("气球涨了");
}
}
new Ball().puff();
}
public static void main(String[] args) {
Party p=new Party();
p.puffBall();
}
}
运行结果:
2.3匿名内部类
无名字的局部内部类,是局部内部类的一种。
意义:
临时兴义某一指定类型的子类;
定以后即刻创建此类的对象
作用:
1、是创建某个类子类对象的快捷方式
new 父类或接口(){
//方法重写(子类 或者接口的实现类)
};
public abstract class Person{
public abstract void eat();
}
Person p=new Person() {
public void eat() {
System.out.println("吃饭了");
}
};
p.eat();
2、匿名内部类的对象,赋值给它的父类(向上转型)
使用匿名对象,将定义子类与创建子类对象两个步骤有一个格式一次性完成。
匿名内部类若不定义变量引用,则也是匿名对象
new Person() {
public void eat() {
System.out.println("吃饭了");
}
}.eat();
2.4 总结
内部类让然是一个独立的类,编译后会被编译成独立的.class文件,但前面会加上外部类的类名和$符号。
内部类不能用普通的方式访问,它是外部类的一个成员,它可自由访问外部类的任何成员。
成员内部类可以以导入形式访问:import ...外部类名.内部类名。或外部类名.内部类名。
3. 包
宗旨:把.java文件(java源文件)、.class文件(编译后的文件)以及其他resource文件(例如,.xml文件,.avi文件、.mp3文件、.txt文件等)有条理地进行一个组织,以供使用。
两个作用:
- 提供多层命名空间,解决命名冲突;
- 对类按功能进行分类,是项目的组织更清晰。
项目的分工也是以包为边界
类中声明的包必须与实际的class文件所在的文件夹情况相一致,否则程序运行时会找不到类
包名全部采用小写,多层包之间用 . 连接
类中包的声明格式为:package 包名.包名...包名;
声明包的句子必须放在有效代码的第一行
在访问类的时候,为了能够找到该类,必须使用含有包名的类全名(包名.类名):java.util.Scanner;
若在java.lang包中,可省略包名
同一个包下,访问时可省略包名
不同包,只可访问public修饰的类
导入包:import 包名.类名;
*:代表的是通配符,import java.util.*代表导入util下的所有类,但是未导入util子包中的类
不同包之间的类相互访问:
- 使用类的全名
- 使用关键字import导入包
4. 修饰符
4.1 哪些修饰符可修饰哪些部分
是否可修饰 | 类 | 成员变量 | 成员方法 | 构造方法 |
public | √ | √ | √ | √ |
default | √ | √ | √ | √ |
protected | 无意义 | √ | √ | √ |
private | 别类不可用,无意义 | √ | √ | √(不可创建象) |
abstract | √ | 无 | √(无方法体) | 要初始化对象 |
static(成员) | √ | 创建对象时调用,不用类名调用 | ||
final | √(不可被继承) | √(常量) | √(不可重写) |
常见规则:
- 用public 修饰类
- 用private修饰成员变量,有get、set方法
- 用public 修饰方法
- 用public修饰构造方法(单例模式的构造方法为私有)
4.2 访问修饰符
同一类中 | 同一包中(子类与无关类) | 不同包的子类 | 不同包中的无关类 | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
default | √ | √ | ||
private | √ |
- 仅在本类中访问,用private
- 本包中的类,default
- 本包中的类和其他包中的子类,protected
- 所有包中的所有类,public
若类用public修饰,则类名必须与文件名相同。
一个文件中只能有一个用public修饰的类。
可以对类或类中的成员(字段以及方法) 加上访问修饰符。
- 类可见表示其它类可以用这个类创建实例对象。
- 成员可见表示其它类可以用这个类的实例对象访问到该成员;
如果子类的方法重写了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。
- 这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里氏替换原则。
5. 代码块
局部代码块定义在方法或语句中
只需关注作用域
5.1 构造代码块
定义在类中成员位置
特点:
1、优先于构造方法执行
构造代码块用于执行所有度一向均需要的初始化动作
2、每创建一个对象均会执行一次构造代码块
5.2 静态代码块
定义在成员位置,使用static修饰的
特点:
1、优先于主方法执行
优先于构造代码块执行
当以任意形式第一次执行该类的时候执行
2、该类不管创建爱你多少个对象,静态代码块只执行一次
3、可用于给静态变量赋值,用来给类进行初始化、
5.3 类
用到时再加载
加载时,会执行静态代码块(一次)
再执行main()方法
再在构建对象new时,执行构造代码块以及构造方法