JAVA关键字final修饰类,Java入门之认识final关键字、权限修饰符和内部类

一、final关键字

为什么要使用 final 关键字?

通过继承我们知道,子类可以重写父类的成员变量和方法。final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改。

1.被修饰的类,不能被继承。但是其成员变量和方法如果未被final修饰,仍然可以被修改。

//final修饰类

final classFinally1 {private int a = 1;public intgetA(){return this.a;

}public int setA(inta){this.a =a;return this.a;

}

}class Finally2 extends Finally1{} 无法被继承

public classTestFinally{public static voidmain(String[] args){final Finally1 f1 = newFinally1();

System.out.println(f1.getA());

System.out.println(f1.setA(2));//修改a = 2;

System.out.println(f1.getA());

}

}

Finally2 无法继承 Finally1。

37e64ca5ea4f33a9cdfa5c64f2372875.png

2.被修饰的方法,不能被重写。

1 classFinally1 {2 private int a = 1;3 public final intgetA(){4 return this.a;5 }6 public int setA(inta){7 this.a =a;8 return this.a;9 }10 }11 class Finally2 extendsFinally1{12 public int getA(){ //编译无法通过

13 System.out.println("getA无法被重写");14 }15

16 }

上面代码中,Finally2 子类继承 Finally1 父类,并重写了getA()方法,导致编译无法通过。

fa34ca5a5847235d7e79693122e04b08.png

3.被修饰的变量(无论是成员变量还是局部变量),只能赋值一次,不能被重新赋值。

//final修饰变量

final classFinally1 {final private int a = 1;public intgetA(){return this.a;

}public int setA(inta){this.a = a; //a的值无法被修改,这里会报错

return this.a;

}

}

8807544a1dfecb52e33a797036317062.png

普通类型和引用数据类型都符合上面的规则。但是值得注意的是,引用数据类型虽然不能被修改(内存地址),但是对象的局部变量仍然可以被修改。

//final修饰 引用数据类型变量

interfaceFinally1{public default void method(inta){int b =a;

System.out.println(b);

}

}class Finally2 implements Finally1{ //实现finally1接口

}public classTestFinally {public static voidmain(String[] args){final Finally1 f2 = newFinally2();

f2= new Finally2(); //f2不可以被重新赋值新的对象

f2.method(1); //引用数据类型的局部变量仍然可以被修改

}

}

fdb63f980b7a92f6797ca6d667ff06c5.png

二、权限修饰符

Java中提供了四种访问权限修饰符:

public:公共权限。表示全部都可以访问。

protected:受保护的权限。不同包中的无关类无法访问。

default:默认权限(不写时默认使用default)。不同包中的子类和无关类无法访问。

private:私有权限。表示只能在当前类中访问。

0d96fdd5d56a4ddd1441f50e1b31a85d.png

建议(酌情考虑):

成员变量使用 private,隐藏细节。

构造方法使用 public,方便创建对象。

成员方法使用public, 方便方法调用。

三、内部类

一个类中包含另一个类,后者位于前者类中方法外,所以被称为内部类。

内部类可以直接访问外部类的成员,包括私有成员。

外部类要访问内部类成员,必须建立内部对象。

classPerson {private int a = 1;classHeart{public voidprintln(){

System.out.println(a);//内部类访问外部类私有成员

}

}

}public classTest{public static voidmain(String[] args){//创建外部类对象

Person p = newPerson();//创建内部类对象

Person.Heart h = p.newHeart();//调用内部类方法 必须创建内部类对象

h.println();

}

}

关于匿名内部类:其实是内部类的简化写法。它的本质是一个带具体实现的匿名子类对象。匿名内部类要求必须继承一个父类或者实现一个父接口。

classPerson {private int a = 1;public voidprintln(){

System.out.println(a);//内部类访问外部类私有成员

}

}public classTest{public static voidmain(String[] args){

method(newPerson(){public voidprintln(){

System.out.println("我是匿名内部类的成员方法");

}

});//匿名内部类

}public static voidmethod(Person p){

p.println();

}

}

温馨提示

如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。

如果本文帮助了您,也请评论关注,作为对我的一份鼓励。

如果您感觉我写的有问题,也请批评指正,我会尽量修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值