一、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关键字、权限修饰符和内部类的更多相关文章

  1. java学习笔记12(final ,static修饰符)

    final: 意思是最终的,是一个修饰符,有时候一个功能类被开发好了,不想被子类重写就用final定义, 用final修饰的最终数据成员:如果一个类的数据成员用final修饰符修饰,则这个数据成员就被 ...

  2. Java基础学习笔记四 Java基础语法

    数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...

  3. java基础学习笔记四(异常)

    Java中的异常 Exception 如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象. 从大体来分异常为两块: 1.error---错误 : 是指程序无法处理 ...

  4. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  5. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  6. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  7. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  8. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  9. Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

    final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对 ...

随机推荐

  1. E-Explorer_2019牛客暑期多校训练营(第八场)

    题意 n个点,m条边,u,v,l,r表示点u到点v有一条边,且只有编号为\([l,r]\)的人能通过,问从点1到点n有哪些编号的人能通过 题解 先对\(l,r\)离散化,用第七场找中位数那题同样的形式 ...

  2. ZOJ - 3870-Team Formation二进制,位运算

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3870 题意:找出一个数列中的两个数,所有通过异或和使得结果同时大于 ...

  3. HDU2222Keywords Search AC_自动机

    http://blog.csdn.net/niushuai666/article/details/7002823 #include <iostream> #include <cstd ...

  4. AC自动机 建立nlogn个AC自动机

    String Set Queries 题意:给你3种操作,1.加入一个串到集合中. 2.删除集合中的某一个串 3.查询集合中的字符串在给定的字符串种出现几次.(同一个串可重复) 解法:建立多个AC自动 ...

  5. JOBDU 1199 找位置

    题目1199:找位置 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2645 解决:1286 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 ...

  6. codeforces 811 E. Vladik and Entertaining Flags(线段树+并查集)

    题目链接:http://codeforces.com/contest/811/problem/E 题意:给定一个行数为10 列数10w的矩阵,每个方块是一个整数, 给定l和r 求范围内的联通块数量 所 ...

  7. git之坑2

    今天遇到的问题,git拉代码拉不了了,开发同事将他的家目录下的.ssh目录权限给改成777 造成pull push代码报错. 截图如下: 原因是哪个哥们把根目录的权限全部改为了777 解决方法,将他的 ...

  8. 15 个有用的 MySQL/MariaDB 性能调整和优化技巧

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  9. Python 之父的解析器系列之六:给 PEG 语法添加动作

    原题 | Adding Actions to a PEG Grammar 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公 ...

  10. redis在windows下安装设置密码及主从数据库

    redis在windows下安装设置密码及主从数据库 1.安装 下载解压后,如图所示: 2.配置. 打开redis.windows.conf文件,在此处设置端口和ip: 这里设置持久化: 在这里设置密 ...