一、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. Mybatis案例升级版——小案例大道理

    纯Mybatis案例升级版——小案例大道理 前言: 这几天看了一本书<原则>,在上面看到了一句话叫“每个人都把自己眼界的局限当成世界的局限”,大学生是

  2. tabBar的内部控件

    大体来说tabBar的内部其实除了UITabBarButton还有两个UIImageView 1.两个UIImageView是我们访问不到的,_UITabBarBackgroundView继承自UII ...

  3. HDU 1173 采矿

    采矿 题解:如果给你一条线段(左右端点设为A,B), 那么在这条线上的任意一点到A B距离之和是一个定值, 然后如果再这条线段内在任意确定一个定点C, 那么这条线段上再任意取一个点,这个点到 A B ...

  4. HDU2276 Kiki & Little Kiki 2 矩阵快速幂

    Kiki & Little Kiki 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  5. Java集合:LinkedList (JDK1.8 源码解读)

    LinkedList介绍 还是和ArrayList同样的套路,顾名思义,linked,那必然是基于链表实现的,链表是一种线性的储存结构,将储存的数据存放在一个存储单元里面,并且这个存储单元里面还维护了 ...

  6. 云开发数据库VS传统数据库丨云开发101

    云开发数据库与传统数据库的不同 在小程序·云开发中,最核心的便是三大组件:数据库.云存储和云函数,从今天开始,我们将开始隔日更的专栏文章,云开发101,在第一周,我们将从最最核心的数据库开始说起. 云 ...

  7. Java Web总结(二)-- 上传和下载

      在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接 ...

  8. equals、==、hashCode

    equals和==的区别 ==主要用来比较基本数据类型,而equal主要用来比较对象是否相等.equal是Object的方法. 如果两者都用来比较对象的相等性,那么如果两个引用地址相同,那么==就返回 ...

  9. vim编辑器的使用详解

    在Linux江湖,最常用到的编辑器非vim莫属,vim的功能很强大. 1.   vim简介 在Linux世界中,最长用到的而且功能比较强大的是Vim编辑器.Vim编辑器是在内存缓冲区中处理数据. vi ...

  10. 增删改查——DBUtils

    利用QueryRunner类实现对数据库的增删改查操作,需要先导入jar包:commons-dbutils-1.6.利用QueryRunner类可以实现对数据步骤的简化. 1.添加 运用JDBC工具类 ...