Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类
一、final关键字
为什么要使用 final 关键字?
通过继承我们知道,子类可以重写父类的成员变量和方法。final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改。
1.被修饰的类,不能被继承。但是其成员变量和方法如果未被final修饰,仍然可以被修改。
//final修饰类
final class Finally1 {
private int a = 1;
public int getA(){
return this.a;
}
public int setA(int a){
this.a = a;
return this.a;
}
}
class Finally2 extends Finally1{} 无法被继承
public class TestFinally{
public static void main(String[] args){
final Finally1 f1 = new Finally1();
System.out.println(f1.getA());
System.out.println(f1.setA(2));//修改a = 2;
System.out.println(f1.getA());
}
}
Finally2 无法继承 Finally1。
2.被修饰的方法,不能被重写。
class Finally1 {
private int a = 1;
public final int getA(){
return this.a;
}
public int setA(int a){
this.a = a;
return this.a;
}
}
class Finally2 extends Finally1{
public int getA(){ //编译无法通过
System.out.println("getA无法被重写");
} }
上面代码中,Finally2 子类继承 Finally1 父类,并重写了getA()方法,导致编译无法通过。
3.被修饰的变量(无论是成员变量还是局部变量),只能赋值一次,不能被重新赋值。
//final修饰变量
final class Finally1 {
final private int a = 1;
public int getA(){
return this.a;
}
public int setA(int a){
this.a = a; //a的值无法被修改,这里会报错
return this.a;
}
}
普通类型和引用数据类型都符合上面的规则。但是值得注意的是,引用数据类型虽然不能被修改(内存地址),但是对象的局部变量仍然可以被修改。
//final修饰 引用数据类型变量
interface Finally1{
public default void method(int a){
int b = a;
System.out.println(b);
}
}
class Finally2 implements Finally1{ //实现finally1接口 }
public class TestFinally {
public static void main(String[] args){
final Finally1 f2 = new Finally2();
f2 = new Finally2(); //f2不可以被重新赋值新的对象
f2.method(1); //引用数据类型的局部变量仍然可以被修改
}
}
二、权限修饰符
Java中提供了四种访问权限修饰符:
- public:公共权限。表示全部都可以访问。
- protected:受保护的权限。不同包中的无关类无法访问。
- default:默认权限(不写时默认使用default)。不同包中的子类和无关类无法访问。
- private:私有权限。表示只能在当前类中访问。
建议(酌情考虑):
- 成员变量使用 private,隐藏细节。
- 构造方法使用 public,方便创建对象。
- 成员方法使用public, 方便方法调用。
三、内部类
一个类中包含另一个类,后者位于前者类中方法外,所以被称为内部类。
- 内部类可以直接访问外部类的成员,包括私有成员。
- 外部类要访问内部类成员,必须建立内部对象。
class Person {
private int a = 1;
class Heart{
public void println(){
System.out.println(a); //内部类访问外部类私有成员
}
}
}
public class Test{
public static void main(String[] args){
//创建外部类对象
Person p = new Person();
//创建内部类对象
Person.Heart h = p.new Heart();
//调用内部类方法 必须创建内部类对象
h.println(); }
}
关于匿名内部类:其实是内部类的简化写法。它的本质是一个带具体实现的匿名子类对象。匿名内部类要求必须继承一个父类或者实现一个父接口。
class Person {
private int a = 1;
public void println(){
System.out.println(a); //内部类访问外部类私有成员
}
}
public class Test{
public static void main(String[] args){
method(new Person(){
public void println(){
System.out.println("我是匿名内部类的成员方法");
}
});//匿名内部类 }
public static void method(Person p){
p.println();
}
}
温馨提示
- 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
- 如果本文帮助了您,也请评论关注,作为对我的一份鼓励。
- 如果您感觉我写的有问题,也请批评指正,我会尽量修改。
Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类的更多相关文章
- java学习笔记12(final ,static修饰符)
final: 意思是最终的,是一个修饰符,有时候一个功能类被开发好了,不想被子类重写就用final定义, 用final修饰的最终数据成员:如果一个类的数据成员用final修饰符修饰,则这个数据成员就被 ...
- Java基础学习笔记四 Java基础语法
数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...
- java基础学习笔记四(异常)
Java中的异常 Exception 如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象. 从大体来分异常为两块: 1.error---错误 : 是指程序无法处理 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...
随机推荐
- A-The power of Fibonacci_2019牛客暑期多校训练营(第九场)
题意 求\(\sum_0^n{Fb}_i^m \mod (1e9)\) 题解 模1e9时的斐波那契数列循环节太大,考虑把模数质因数分解成\(2^9\cdot5^9\),此时循环节变成768和78125 ...
- 模板汇总——treap
1. 旋转treap. 思想:一颗权值BST + 一颗 随机数 最小堆. BZOJ - 3224 代码: #include<bits/stdc++.h> using namespace s ...
- java hdu A+B for Input-Output Practice (III)
A+B for Input-Output Practice (III) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32 ...
- 你该用HTTP2了
更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. HTTP版本简史 HTTP/0.9: (1991年)基于GET请求的文本传输协议 HTTPS: (1994年)安全的 ...
- Event Loop js 事件循环初理解
浏览器环境 执行栈 所有的 JS 代码在运行是都是在执行上下文中进行的.执行上下文是一个抽象的概念,JS 中有三种执行上下文: 全局执行上下文,默认的,在浏览器中是 window 对象 函数执行上下文 ...
- vue基础技术点列表(一)
一. vue编写需要注意的细节1.vue初始化实例时使用首字母大写,在添加全局配置时也要首字母大写(如添加组件Vue.component("",{template:"&q ...
- 【深入浅出-JVM】(77):SPI
概念 Service Provider Interface 规则 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名 接口实现类在cl ...
- 简单说一下你对http和https的理解
http是一种超文本传输协议,传输的数据都是未加密的,也就是显示在明面上的,是现在互联网上应用最为广泛的一种网络协议,相对来说不太安全,但是所需成本很小.http一般的端口号为80. https则是具 ...
- C++ 基础中的基础 ---- 引用
C++ 基础中的基础 ---- 引用 引用的概念:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量.比如: int n ...
- Python—字符串和常用数据结构
目录 1. 字符串 2. 列表 2.1 列表的增删改查 2.2 列表的切片和排序 2.3 生成式语法 3. 元组 4.集合 5. 字典 5.1 字典的增删改查 5.2 字典的常见操作 序言:这一章我们 ...