作者:w手机用户2736240235dOD | 来源:互联网 | 2023-10-10 21:04
一final关键字1.final的使用对象final可以修饰类:那么该类就不能被继承(太监类)final可以修饰方法:那么该方法就不能被重写final可以修饰变量:a.成员变量那么
一 final关键字
1.final的使用对象
final可以修饰类: 那么该类就不能被继承(太监类)
final可以修饰方法: 那么该方法就不能被重写
final可以修饰变量:
a.成员变量
那么该成员变量只能赋值一次,创建对象之后不能再次赋值
可以直接在定义成员变量时赋值,也可以在构造方法中给成员变量赋值
b.局部变量
那么该局部变量只能赋值一次,
可以先定义后赋值,也可以定义的同时赋值,但是只能赋值一次
c.引用类型变量
那么该引用类型变量所保存的地址值不能改变,而不是地址中的内容不能改变
二 权限修饰符
一般我们这样使用权限修饰符:
成员变量使用 private ,隐藏细节。
构造方法使用 public ,方便创建对象。
成员方法使用 public ,方便调用方法。
tip:不加权限修饰符,其访问能力与default修饰符相同
修饰成员变量
public 无论在哪个类中,创建了本类对象之后都可以直接使用
protected 在本类,本包其他类,以及其他包的子类中可以直接使用
default 只能在本类,本包的其他类中可以直接使用
private 只能在本类中使用
修饰成员方法
public 无论在哪个类中,都可以直接调用成员变量
protected 在本类,本包其他类,以及其他包的子类中可以直接调用
default 只能在本类,本包其他类中直接调用
private 只能在本类中调用
修饰构造方法
public : 无论在那个类中都可以创建对象
protected和default是一样,因为构造方法子类是无法继承
只能在本类和本包其他类中使用
private: 只能本类中创建对象(一般用于单例设计模式)
tip:局部变量不能使用权限修饰符(无意义)
三.内部类
1.1成员内部类
在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类 Car 中包含发动机类 Engine ,
这时, Engine 就可以使用内部类来描述,定义在成员位置。
class 外部类 {
//成员变量
class 内部类{
}
}
1.2访问特点
1.内部类可以直接访问外部类的成员,包括私有成员。
2.外部类要访问内部类的成员,必须要建立内部类的对象。
创建内部类对象格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
或
外部类型 外部类对象名 = new 外部类();
外部类型.内部类型 内部对象名 =外部类对象. new 内部类();
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;
}
}
public class TestPerson {
public static void main(String[] args) {
/* 创建内部类对象 方式一: Person.Heart heart = new Person().new Heart(); heart.jump();*/
//方式二:
Person p = new Person();
Person.Heart heart1 = p.new Heart();
//调用内部类方法
heart1.jump(); //输出:心脏在跳动
//调用外部类方法
p.setLive(false);
heart1.jump(); //输出: 心脏不跳了
}
}
2.1局部内部类
局部内部类:
public class 外部类{
//成员变量
//成员方法
public void show(){
class 内部类{
}
}
}
2.2访问特点
特点1: 局部内部类只能在局部使用
特点2: 局部内部类中可以无条件访问外部类的成员
3.匿名内部类
3.1前提
匿名内部类必须继承一个父类或者实现一个父接口。
3.2格式
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
3.2.3.使用方式
定义接口
public abstract class FlyAble{
public abstract void fly();
}
创建内部类,并调用
public class InnerDemo1 {
public static void main(String[] args) {
/* 1.等号右边:定义并创建该接口的子类对象 2.等号左边:是多态,接口类型引用指向子类对象 */
FlyAble f = new FlyAble(){
public void fly() {
System.out.println("我飞了~~~");
}
};
// 将f传递给showFly方法中
showFly(f);
}
public static void showFly(FlyAble f) {
f.fly();
}
}
以上可以简化如下:
public class InnerDemo2 {
public static void main(String[] args) {
/* 创建匿名内部类,直接传递给showFly(FlyAble f) */
showFly( new FlyAble(){
public void fly() {
System.out.println("我飞了~~~");
}
});
}
public static void showFly(FlyAble f) {
f.fly();
}
}