• Java Object-Oriented:day11 【 final 】


    一 、关键字概念与四种用法

    final关键字代表最终、不可改变的。

    常见四种用法:

    1. 可以用来修饰一个类
    2. 可以用来修饰一个方法
    3. 还可以用来修饰一个局部变量
    4. 还可以用来修饰一个成员变量

    二、关键字用于修饰类

    1、父类

    含义:当前这个类不能有任何的子类。(太监类)
    注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没儿子。)
    package day11.demo01;
    
    /*
    当final关键字用来修饰一个类的时候,格式:
    public final class 类名称 {
        // ...
    }
    
    含义:当前这个类不能有任何的子类。(太监类)
    注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没儿子。)
     */
    public final class MyClass /*extends Object*/ {
    
        public void method() {
            System.out.println("方法执行!");
        }
    
    }

    2、不能使用一个final类来作为父类

    package day11.demo01;
    // 不能使用一个final类来作为父类
    public class MySubClass /*extends MyClass*/ {
        
    }

    3、测试类

    package day11.demo01;
    
    /*
    final关键字代表最终、不可改变的。
    
    常见四种用法:
    1. 可以用来修饰一个类
    2. 可以用来修饰一个方法
    3. 还可以用来修饰一个局部变量
    4. 还可以用来修饰一个成员变量
     */
    
    public class Demo01Final {
    
    }

    查询 API发现像 public final class String 、 public final class Math 、 public final class Scanner等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容。

    三、关键字用于修饰成员方法

    1、父类

    package day11.demo01;
    
    /*
    当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。
    格式:
    修饰符 final 返回值类型 方法名称(参数列表) {
        // 方法体
    }
    
    注意事项:
    对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。
     */
    public abstract class Fu {
    
        public final void method() {
            System.out.println("父类方法执行!");
        }
    
        public abstract /*final*/ void methodAbs() ;
    
    }

    注意事项:对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。

    2、子类

    package day11.demo01;
    
    public class Zi extends Fu {
        @Override
        public void methodAbs() {
    
        }
    
        // 错误写法!不能覆盖重写父类当中final的方法
    //    @Override
    //    public void method() {
    //        System.out.println("子类覆盖重写父类的方法!");
    //    }
    }

    四、关键字用于修饰成员

    1、一旦使用final用来修饰局部变量,那么这个变量就不能进行更改。“一次赋值,终生不变”

    测试类

    package day11.demo01;
    
    /*
    final关键字代表最终、不可改变的。
    
    常见四种用法:
    1. 可以用来修饰一个类
    2. 可以用来修饰一个方法
    3. 还可以用来修饰一个局部变量
    4. 还可以用来修饰一个成员变量
     */
    
    public class Demo01Final {
    
        public static void main(String[] args) {
            int num1 = 10;
            System.out.println(num1); // 10
            num1 = 20;
            System.out.println(num1); // 20
    
            // 一旦使用final用来修饰局部变量,那么这个变量就不能进行更改。
            // “一次赋值,终生不变”
            final int num2 = 200;
            System.out.println(num2); // 200
    
    //        num2 = 250; // 错误写法!不能改变!
    //        num2 = 200; // 错误写法!
    
            // 正确写法!只要保证有唯一一次赋值即可
            final int num3;
            num3 = 30;
    
        }
    
    }

    运行结果

    10
    20
    200

    2、对于基本类型来说,不可变说的是变量当中的数据不可改变

    测试类

    package day11.demo01;
    
    /*
    final关键字代表最终、不可改变的。
    
    常见四种用法:
    1. 可以用来修饰一个类
    2. 可以用来修饰一个方法
    3. 还可以用来修饰一个局部变量
    4. 还可以用来修饰一个成员变量
     */
    
    public class Demo01Final {
    
        public static void main(String[] args) {
    
    
            // 对于基本类型来说,不可变说的是变量当中的数据不可改变
            // 对于引用类型来说,不可变说的是变量当中的地址值不可改变
            Student stu1 = new Student("赵丽颖");
            System.out.println(stu1);
            System.out.println(stu1.getName()); // 赵丽颖
            stu1 = new Student("霍建华");
            System.out.println(stu1);
            System.out.println(stu1.getName()); // 霍建华
            System.out.println("===============");
    
        }
    
    }  

    学生类

    package day11.demo01;
    
    public class Student {
    
        private String name;
    
        public Student() {
        }
    
        public Student(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    运行结果

    day11.demo01.Student@10f87f48
    赵丽颖
    day11.demo01.Student@b4c966a
    霍建华

    3、对于引用类型来说,不可变说的是变量当中的地址值不可改变

    测试类

    package day11.demo01;
    
    /*
    final关键字代表最终、不可改变的。
    
    常见四种用法:
    1. 可以用来修饰一个类
    2. 可以用来修饰一个方法
    3. 还可以用来修饰一个局部变量
    4. 还可以用来修饰一个成员变量
     */
    
    public class Demo01Final {
    
        public static void main(String[] args) {
    
            // 对于引用类型来说,不可变说的是变量当中的地址值不可改变
            final Student stu2 = new Student("高圆圆");
            // 错误写法!final的引用类型变量,其中的地址不可改变
    //        stu2 = new Student("赵又廷");
            System.out.println(stu2.getName()); // 高圆圆
            stu2.setName("高圆圆圆圆圆圆");
            System.out.println(stu2.getName()); // 高圆圆圆圆圆圆
        }
    
    }

    学生类

    package day11.demo01;
    
    public class Student {
    
        private String name;
    
        public Student() {
        }
    
        public Student(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    运行结果

    高圆圆
    高圆圆圆圆圆圆

    五、关键字用于修饰成员

    对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。

    1. 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
    2. 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
    3. 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。

    /*
    对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。
    
    1. 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
    2. 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
    3. 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
     */
    public class Person {
    
        private final String name/* = "鹿晗"*/;
    
        public Person() {
            name = "关晓彤";
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
    //    public void setName(String name) {
    //        this.name = name;
    //    }
    }

    四种权限修饰符

    ll
    -rw-r--r-- 1 lah 197121 605  5月  9  2018 Demo01Main.java
    -rw-r--r-- 1 lah 197121 160  5月  9  2018 MyAnother.java
    -rw-r--r-- 1 lah 197121 163  5月  9  2018 MyClass.java
    drwxr-xr-x 1 lah 197121   0  5月  7 09:42 sub/
    $ ll sub/
    total 2
    -rw-r--r-- 1 lah 197121 208  5月  9  2018 MySon.java
    -rw-r--r-- 1 lah 197121 203  5月  9  2018 Stranger.java
    

    六、四种权限修饰符

    1、目录结构

    lah@DESKTOP-BKKR4I7 MINGW64 /c/OneDrive/java/src/day11/demo02
    $ ll
    total 10
    -rw-r--r-- 1 lah 197121 595  5月  7 11:42 Demo01Main.java
    -rw-r--r-- 1 lah 197121 146  5月  7 11:44 MyAnother.java
    -rw-r--r-- 1 lah 197121 151  5月  7 11:43 MyClass.java
    drwxr-xr-x 1 lah 197121   0  5月  7 11:45 sub/
    
    lah@DESKTOP-BKKR4I7 MINGW64 /c/OneDrive/java/src/day11/demo02
    $ ll sub/
    total 2
    -rw-r--r-- 1 lah 197121 134  5月  7 11:45 MySon.java
    -rw-r--r-- 1 lah 197121 147  5月  7 11:45 Stranger.java
    

    2、测试类

    package day11.demo02;
    
    /*
    Java中有四种权限修饰符:
                        public  >   protected   >   (default)   >   private
    同一个类(我自己)        YES         YES             YES             YES
    同一个包(我邻居)        YES         YES             YES             NO
    不同包子类(我儿子)       YES         YES             NO              NO
    不同包非子类(陌生人)      YES         NO              NO              NO
    
    注意事项:(default)并不是关键字“default”,而是根本不写。
     */
    public class Demo01Main {
    }
    MyAnother
    package day11.demo02;
    
    public class MyAnother {
        public void anotherMethod() {
    //        System.out.println(new MyClass().num);
        }
    }
    MyClass
    package day11.demo02;
    
    public class MyClass {
        public int num = 10;
    
        public void method() {
            System.out.println(num);
        }
    
    }
    

    3、不同包的子类

    MySon
    package day11.demo02.sub;
    
    public class MySon {
        public void methodSon() {
    //        System.out.println(super.num);
        }
    }
    Stranger
    package day11.demo02.sub;
    
    public class Stranger {
        public void methodStrange() {
            System.out.println(new MyClass().num);
        }
    }

    4、总结

    在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限

    public :公共的。
    protected :受保护的
    default :默认的
    private :私有的

     不同权限的访问能力

    可见,public具有最大权限。private则是最小权限。编写代码时,如果没有特殊的考虑,建议这样使用权限:

    成员变量使用 private ,隐藏细节。
    构造方法使用 public ,方便创建对象。
    成员方法使用 public ,方便调用方法。

    小贴士:不加权限修饰符,其访问能力与default修饰符相同

  • 相关阅读:
    Undergound Heaven [only_for_information]
    Essential Booklist of .Net Framework
    Thinkpad T4x 风扇转速档位控制
    Hot scene AGAIN!
    JavaScript使用技巧精萃
    今天项目中遇到的一个问题:判断新闻Id是否存在
    C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
    SQL操作全集
    关于UrlReferrer传值的几点注意
    在ASP.Net2.0中使用UrlRewritingNet实现链接重写(转)
  • 原文地址:https://www.cnblogs.com/luoahong/p/12837776.html
Copyright © 2020-2023  润新知