目录
final
代表不可修改的内容
修饰对象:
类:不可被继承。
方法:不可重写。
变量:不可修改。
1、局部变量
只能被赋值一次
两种情况下的判断正误:
final int c = 0;
for (int i = 0; i < 10; i++)
{
c = i; System.out.println(c);
}
for (int i = 0; i < 10; i++)
{
final int c = i;
System.out.println(c);
}
第一种写法会报错,而第二种相当于每次循环重新申明一个新变量。
2、局部变量之引用类型
被final修饰后,只能指向一个对象,地址不能更改,但不影响内部成员变量的赋值
public class FinalDemo2 {
public static void main(String[] args) {
// 创建 User 对象
final User u = new User();
// 创建 另一个 User对象
u = new User(); // 报错,指向了新的对象,地址值改变。
// 调用setName方法
u.setName("张三"); // 可以修改
}
}
3、成员变量
成员变量的初始化。有两种方式。
注意:被final修饰的变量,通常大写。
public class User {
final String USERNAME = "张三";
private int age;
}
public class User {
final String USERNAME ;
private int age;
public User(String username, int age) {
this.USERNAME = username;
this.age = age;
}
}
权限
内部类
一个类定义在另一个类中
成员内部类
定义在类中方法外的类
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类
Car
中包含发动机
类
Engine
,这时,
Engine
就可以使用内部类来描述,定义在成员位置。
class Car { //外部类
class Engine {
//内部类
}
}
访问
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,必须要建立内部类的对象。
public class Person {
private boolean live = true;
class Heart {
public void jump() { // 直接访问外部类成员
if (live)
{
System.out.println("心脏在跳动");
} else {
System.out.println("心脏不跳了");
}
}
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
}
注:
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的
.class
文件,但是前面冠以外部类的类名
和
$
符号 。
比如,
Person$Heart.class
匿名内部类
是内部类的简化写法。它的本质是一个
带具体实现的 父类或者父接口的 匿名的
子类对象
。
开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作,
1.
定义子类
2.
重写接口中的方法
3.
创建子类对象
4.
调用重写后的方法
我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快
捷方式。
使用方法:
public abstract class FlyAble{
public abstract void fly();
}
使用方法1:
使用方法2:
使用方法3: