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关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...
随机推荐
- E-Explorer_2019牛客暑期多校训练营(第八场)
题意 n个点,m条边,u,v,l,r表示点u到点v有一条边,且只有编号为\([l,r]\)的人能通过,问从点1到点n有哪些编号的人能通过 题解 先对\(l,r\)离散化,用第七场找中位数那题同样的形式 ...
- ZOJ - 3870-Team Formation二进制,位运算
传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870 题意:找出一个数列中的两个数,所有通过异或和使得结果同时大于 ...
- HDU2222Keywords Search AC_自动机
http://blog.csdn.net/niushuai666/article/details/7002823 #include <iostream> #include <cstd ...
- AC自动机 建立nlogn个AC自动机
String Set Queries 题意:给你3种操作,1.加入一个串到集合中. 2.删除集合中的某一个串 3.查询集合中的字符串在给定的字符串种出现几次.(同一个串可重复) 解法:建立多个AC自动 ...
- JOBDU 1199 找位置
题目1199:找位置 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2645 解决:1286 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 ...
- codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)
题目链接:http://codeforces.com/contest/811/problem/E 题意:给定一个行数为10 列数10w的矩阵,每个方块是一个整数, 给定l和r 求范围内的联通块数量 所 ...
- git之坑2
今天遇到的问题,git拉代码拉不了了,开发同事将他的家目录下的.ssh目录权限给改成777 造成pull push代码报错. 截图如下: 原因是哪个哥们把根目录的权限全部改为了777 解决方法,将他的 ...
- 15 个有用的 MySQL/MariaDB 性能调整和优化技巧
MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...
- Python 之父的解析器系列之六:给 PEG 语法添加动作
原题 | Adding Actions to a PEG Grammar 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公 ...
- redis在windows下安装设置密码及主从数据库
redis在windows下安装设置密码及主从数据库 1.安装 下载解压后,如图所示: 2.配置. 打开redis.windows.conf文件,在此处设置端口和ip: 这里设置持久化: 在这里设置密 ...