1. 解释下主函数:
public static void main(String[] args){}
public
:表该函数访问权限最大
static
:表该函数随着类的加载便存在
void
:表主函数无具体返回值类型
main
:非关键字,但可以被JVM识别
(String[] args)
:函数的参数是一个字符串类型的数组
主函数是固定格式的,被JVM识别,且只识别这个。
args
是数组对象,虚拟机调用主函数时,传入的是new String[0]
2. 构造函数
作用:给对象初始化 。
多个构造函数以重载形式出现
2.1. 构造函数在写法上与一般函数不同的地方在于:
- 函数名与类名一致
- 无返回值类型
- 无需return语句
2.2. 对象一创建即调用与之对应的构造函数,比如生活中小孩一出生就会哭。
2.3. 若类未定义构造函数,系统就会默认给该类加一个空参数的构造函数,如果开发人员自定义了构造函数,就不会有这个默认的了。
2.4. 构造函数和一般函数在运行上的不同?
构造函数:对象一建立就执行,进行初始化。一个对象建立,构造函数只会运行一次
一般函数:调用时才执行,是给对象添加对象具备的功能。一个对象建立,一般方法可被对象调用多次
(如:婴儿会吃饭,但并非一直不停地吃。)
2.5. 何时定义构造函数?
分析事物时,该事物存在具备一些特性或行为,则将这些内容定义在构造函数中。
3. 构造代码块
构造代码块是给对象进行初始化
对象一建立就执行,且优先于构造函数执行
与构造函数的区别:
- 构造代码块给所有对象进行初始化。
- 构造函数给对应对象初始化。
4. 静态static
静态变量也称为类变量
静态函数随着类的加载而加载,故静态函数可直接被类调用。
静态方法为共享数据,存储在方法区中
静态虽好,只能访问静态。非静态可访问静态
4.1. static 的特点:
- 随着类的加载而加载,消失而消失,所以生命周期最长
- 优先于对象存在,静态先存在,对象后存在
- 被所有对象共享
- 可直接被类名调用
4.2. 静态使用注意事项:
- 静态方法只能访问静态成员,非静态方法既可以访问静态成员也可以访问非静态成员
- 静态方法中不可以定义this,super关键字,因静态优先于对象存在
- 主函数为静态函数
4.3. 静态的利与弊:
- 利:对象的共享数据进行单独空间存储,节省空间,无必要每个对象一份,可直接被类名调用
- 弊:生命周期过长,访问出现局限性(静态虽好,只能访问静态)
4.4. 如何使用静态?
- 何时定义类变量?
当对象中出现共享数据时,该数据用静态修饰,对象中的特有数据要定义成非静态存于堆内存中, - 合适定义静态变量?
当功能内部未访问到非静态数据时
4.5. 静态代码块
static { 静态代码块中的执行语句 }
特点:随着类的加载而执行,只执行一次,用于给类进行初始化。
4.6. 静态函数应用
建立一个ArrayTools的类来实现对数组的操作,由于并未封装特有数据,因此可将函数定义成静态,然后通过类名来调用,另外为避免被创建对象应该讲构造函数私有化。
5. 实例变量和类变量的区别:
5.1. 存放位置:
- 类变量随着类的加载而存在于方法区中
- 实例变量随着对象的建立而存在于堆内存中
5.2. 生命周期:
- 类变量的生命周期最长,随类的消失而消失
- 实例变量随对象的消失而消失
6. 成员变量和局部变量
- 作用范围:
成员变量作用于整个类,局部变量作用于函数或语句中 - 在内存中的位置
成员变量存在堆内存中,因为对象存在而在内存中存在;局部变量存在于栈内存中。
7. 说明下句的内存空间是如何开辟的:
ShowSpaceCreate p = new ShowSpaceCreate("zhang" , 20)
- 因new用到了ShowSpaceCreate.class,所以先找到该类文件加载到堆内存中
- 执行该类中static代码块,若有,则是给该类初始化
- 在堆内存中开辟空间,分配内存地址
- 在堆内存中建立对象的特有属性,并进行默认初始化
- 对属性进行显示初始化
- 对对象进行构造代码块初始化
- 对对象进行构造函数初始化
- 将内存地址赋给栈内存中的p变量。
8. 匿名对象
new Car().run();
未给对象取名,new完直接调用方法
用法:
- 当对对象的方法只调用一次时,可用匿名简化
若对一个对象进行多个成员调用则必须命名 - 可将匿名对象作为实际参数传递,如:
show (new Car());
9. 内部类
将一个类定义在另一个类里面,里面的这个类就是内部类
**9.1. ** 访问特点:
- 可直接访问外部类成员,包括私有的
私有成员只能在类内部使用,内部类在类的内部;
之所以可以直接访问外部类成员,是因为内部类持有一个外部类引用。
格式:外部类.this.外部类成员
- 外部类要访问内部类成员需要创建内部类的对象。
**9.2. **内部类在成员位置上时可被访问修饰符修饰
如:
private
将内部类在外部类中进行封装。
static
使内部类具备静态特性,此时只能访问外部类中的静态成员。
**9.3. **在外部其他类中直接访问static内部类的非静态成员:
new OuterClass.Inner().function();
**9.4. **在外部其他类中直接访问static内部类的静态成员:
OuterClass.Inner().function();
<a>注意:</a>
当内部类成员定义了一个静态成员,则该类必须也为静态类
当外部类静态方法访问内部类,则该内部类为static的。
**9.5. ** 局部内部类
局部内部类不可以被成员修饰符修饰:private ,static
局部内部类可以直接访问外部类中成员,因为还持有引用,但不可以访问所在局部中的变量,常量可以。
**9.6. ** 匿名内部类
定义匿名内部类的前提是:内部类必须是继承或者实现一个接口。
格式:
new 父类或接口(){定义子类内容}
匿名内部类即一个匿名子类对象,而这个类有点胖,可以理解成为带内容的对象
匿名内部类定义的方法最好不要超过三个。
10. final修饰符
final可以修饰类、变量和方法,分别表示类不能被继承;变量值不可改变,其实就是常量;函数不可被重写。
局部内部类只能访问该局部中被final修饰的量。
网友评论