目录
Java 内部类
Java 一个类中可以嵌套另外一个类,语法格式如下:
class Outer { // 外部类
// ...
class Inner { // 内部类
// ...
}
}
要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
内部类类型:
- 非静态内部类
- 私有的内部类
- 静态内部类
非静态内部类
非静态内部类是一个类中嵌套着另外一个类。 它有访问外部类成员的权限, 通常被称为内部类。由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。
package com.lele.day7_23;
public class out {
protected static int num = 99;
class in01{
int num = 11;
public void print01() {
int num = 22;
System.out.println(num);
System.out.println(this.num);
System.out.println(out.this.num);
}
}
}
package com.lele.day7_23;
import com.lele.day7_23.out.in01;
public class OutInTest {
public static void main(String[] args) {
// 创建普通内部类对象
in01 in1 = new out().new in01();
in1.print01();
System.out.println(in1.num);
}
}
私有的内部类
内部类可以使用 private 或 protected 来修饰,如果你不希望内部类被外部类访问可以使用 private 修饰符:
package com.lele.day7_23;
public class out {
protected static int num = 99;
//私有内部类
private class in03{
public void print03() {
System.out.println("print03......");
}
}
public static void main(String[] args) {
out out1 = new out();
out.in03 in3 = out1.new in03();
in3.print03();
}
}
静态内部类
静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问它:
package com.lele.day7_23;
public class out {
protected static int num = 99;
//静态内部类
static class in02{
public void print02() {
System.out.println(num);
}
}
}
package com.lele.day7_23;
import com.lele.day7_23.out.in02;
public class OutInTest {
public static void main(String[] args) {
// 创建静态内部类对象
in02 in2 = new out.in02();
in2.print02();
}
}
final关键字
① 修饰一个类 当前类不能被继承(太监类)
② 修饰一个方法 不能覆盖重写
③ 修饰一个局部变量 局部变量就不能更改,“一次赋值,终生不变”
④ 修饰一个成员变量
面试题:为什么String使用final关键字修饰?
String类的不可变性带来的好处总结主要有两点:
因为String类的不可变性,才能使得JVM可以实现字符串常量池;字符串常量池可以在程序运行时节约很多内存空间,因为不同的字符串变量指向相同的字面量时,都是指向字符串常量池中的同一个对象。这样一方面能够节约内存,另一方面也提升了性能。
因为String类的不可变性,从而保证了字符串对象在多线程环境下是线程安全的。如果String类是可变的,那么会引起很严重的安全问题。我们在很多情况下都是直接通过字符串传递数据,比如数据库的用户名密码、网络编程中的ip和端口,因为字符串是不可变的,所以它的值不能被修改,如果字符串是可变的,那么可以通过改变引用地址指向的值去修改字符串的值,从而导致安全漏洞
static关键字
1、修饰成员变量
2、修饰成员方法
3、静态代码块
4、修饰类【只能修饰内部类也就是静态内部类】
5、静态导包
package com.lele.day7_23;
public class staticTest {
//修饰成员变量
private static int id;
//修饰成员方法
public static void print() {
System.out.println("Hello Word !");
}
static {
System.out.println("static Hello Word !");
}
//修饰内部类
static class A{
}
}
静态导包 静态导包格式:import static
这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法
静态内部类 静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:
1、它的创建是不需要依赖外围类的创建。 2、它不能使用任何外围类的非static成员变量和方法。
static静态代码块
static静态方法 static修饰的方法也叫做静态方法
注意:构造方法不是静态方法!
静态变量和实例变量的概念
静态变量: static修饰的成员变量叫做静态变量【 类变量】,静态变量是属于这个类,而不是属于是对象。
实例变量: 没有被static修饰的成员变量叫做实例变量,实例变量是属于这个类的实例对象。
还有一点需要注意的是:static是不允许用来修饰局部变量,不要问我问什么,因为java规定的!