修饰符-----final详解

package com.uncle.public_test;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

/**
 * 描述一个类
 * 	修饰符 特征 class  类名{
 * 		属性	权限  特征  类型  名字
 * 		方法	权限  特征  返回值  名字  参数  异常  执行体
 * 		构造方法	权限  名字  参数  异常  执行体
 * 		程序块	执行体
 *        }
 *
 * 修饰符
 * 	权限修饰符
 * 	   public		公共的
 * 	   protected	受保护的
 * 	   默认不写		默认的
 * 	   private		私有的
 * 	特征修饰符
 * 	   final		最终的  不可更改的
 * 	   static		静态的
 * 	   abstract		抽象的
 * 	   native		本地的
 * 	   *transient	瞬时的  短暂的------>序列化
 * 	   *synchronized	同步的	线程问题
 * 	   *volatile		不稳定的
 * ======================================================
 *
 * 	权限修饰符
 * 	public	公共的	本类   同包  子类  当前项目中任意类的位置只要有对象都可以访问
 * 	protected	保护的	本类   同包  子类(通过子类对象在子类范围内部访问)
 * 	默认不写	默认的	本类   同包
 * 	private	私有的	本类
 *
 * 	1.能修饰什么   2.范围如何
 * 	权限修饰符可以用来修饰   类本身   和类中的成员(除程序块)
 * 	权限修饰符用来修饰类的时候只有两个可以用(public  默认不写)
 * 	权限修饰符都可以用来修饰类中其他成员
 *
 * ===========================================================
 * 	Java类和类之间的关系
 * 		继承   关联   依赖
 *
 * 	Java面向对象的四个特征
 * 		继承   封装   多态   (抽象)
 *
 * 	封装 : 将一些数据或执行过程  进行一个包装
 *  	目的 : 保护这些数据 或 执行过程的安全
 * 		写登录流程--->main  一段代码
 * 		写登录方法--->login(name,pass)
 * 		方法本身就算是封装   封装了执行的过程  保护过程的安全  隐藏了执行细节   增强复用性
 * 		好多的方法和属性---->类   类也算是一个封装
 * 			ArrayBox
 * 			私有属性elementData  size
 * 			--->add  get  remove  size
 * 			ensureCapacityInternal    grow   copyOf    rangeCheck
 * 		对属性本身的封装:
 * 			属性私有(封装在类中)
 * 			提供操作属性相应的方式(公有的方法)
 * 		以后强烈建议大家属性不要公有的---->非常不安全
 * 		既然以后大家都这样操作属性  属性及其操作属性的方法都有其命名的规约
 * 		age------>    setAge        getAge
 * 		myAge-->    setMyAge   getMyAge
 * ====================================================================
 * 	特征修饰符
 * 		1.可以修饰什么
 * 		2.修饰以后有什么特点
 *
 * 		final	最终的   不可更改的
 * 		修饰变量
 * 			如果在定义变量时没有赋初始值
 * 			给变量一次存值的机会(因为变量在栈内存空间内 没有默认值 如果不给机会 就没法用啦)
 * 			一旦变量被存储了一个值 若用final修饰后 则不让再次改变 ----> 相当于常量啦(值没法动)
 * 			注意变量类型是基本类型还是引用类型
 * 			如果修饰的变量是基本数据类型  则变量内的值不让更改---常量
 * 			如果修饰的变量是引用数据类型  则变量内的地址引用不让更改---对象唯一
 * 		修饰属性
 * 			全局变量  存储在堆内存的对象空间内一个空间
 * 			属性如果没有赋值  有默认值存在的
 * 			属性用final修饰后  必须给属性赋初值  否则编译报错
 * 			特点与修饰变量一致
 * 			注意变量类型是基本类型还是引用类型
 * 			如果修饰的变量是基本数据类型  则变量内的值不让更改---常量
 * 			如果修饰的变量是引用数据类型  则变量内的地址引用不让更改---对象唯一
 * 		修饰方法
 * 			方法是最终的方法  不可更改
 * 			子类继承父类的方法   将父类的方法重写(覆盖)
 * 			final修饰的方法  要求不可以被子类重写(覆盖)
 * 		修饰类本身
 * 			类是最终的 不可以更改
 * 			(太监类 无后) 此类不可以被其他子类继承
 * 			通常都是一些定义好的工具类
 * 			Math   Scanner   Integer   String
 */
public class PublicTest {
    private String name;
    private String sex;

    public PublicTest() {

    }

    public PublicTest(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public final void eat() {
        System.out.println("吃");
    }

    protected void sleep() {
       System.out.println("睡觉");
    }

    private void kiss() {
        System.out.println("kiss");
    }

}

  • final图解
    在这里插入图片描述

  • 看好下面代码块第一行的包名,有助于更加深入了解权限修饰符的作用

package com.uncle.public_test.src.packa.innera;

import com.uncle.public_test.src.packa.TestA;

public class TestInnerA {
    public static void main(String[] args){
        TestA ta = new TestA();
        ta.testPublic();
        //ta.testProtected();
        //ta.testDefault();
        //ta.testPrivate();私有的
    }
}

package com.uncle.public_test.src.packa;

public class TestA {

    public static void main(String[] args){
        TestA ta = new TestA();
        ta.testPublic();
        ta.testProtected();
        ta.testDefault();
        ta.testPrivate();
    }

    public void testPublic(){
        System.out.println("我是TestA类中的public修饰符方法");
    }
    protected void testProtected(){
        System.out.println("我是TestA类中的protected修饰符方法");
    }
    void testDefault(){
        System.out.println("我是TestA类中的默认不写修饰符方法");
    }
    private void testPrivate(){
        System.out.println("我是TestA类中的private修饰符方法");
    }

}

package com.uncle.public_test.src.packa;

public class TestAA {
    public static void main(String[] args){
        TestA ta = new TestA();
        ta.testPublic();
        ta.testProtected();
        ta.testDefault();
        //ta.testPrivate();私有的
    }
}

package com.uncle.public_test.src.packb;
import com.uncle.public_test.src.packa.TestA;

public class TestB extends TestA{

    public void testB(){
        this.testPublic();
        this.testProtected();
    }
    public static void main(String[] args){
        //TestB tb = new TestB();
        //tb.testPublic();
        //tb.testProtected();
        TestA ta = new TestA();
        ta.testPublic();
    }
}

package com.uncle.public_test.src.person;

public class Person {

    //属性
    public String name;
    private int age;
    public String sex;

    //方法
    //设计一个方法  用来取得age属性的值
    //   提供条件?不需要   返回值? 获取的age的值
    public int getAge(){
        //if
        return this.age;
    }
    //设计一个方法  用来给age属性赋值
    //   提供条件?  age的值    返回值?void
    public void setAge(int age){
        if(age<0){
            System.out.println("对不起 您还没出生呢 请给正确的年龄范围");
            this.age = -1000;
            //抛出异常
        }else if(age>130){
            System.out.println("对不起 您已经升仙啦 请给正确的年龄范围");
            this.age = -1000;
            //抛出异常
        }else {
            this.age = age;
        }
    }
}

package com.uncle.public_test.src.person;

public class Test {
    public static void main(String[] args){
        //创建类的过程是在Java中描述的过程
        //1.创建对象
        Person p = new Person();
        //2.对象的引用 . 调用属性
        p.name = "郑中拓";
        p.setAge(18);
        p.sex = "男";

        System.out.println("今年"+p.getAge());

    }
}

package com.uncle.public_test.src.test;

import com.uncle.public_test.src.packb.TestB;

public class TestMain {
    public static void main(String[] args){
        TestB tb = new TestB();
        tb.testPublic();
        //tb.testProtected();
    }
}

package com.uncle.public_test.src.test_final;

public class Animal {
    public void eat(){
        System.out.println("动物的吃饭方法");
    }
}

package com.uncle.public_test.src.test_final;

public class Person extends Animal{//extends-->扩展

    public void eat(){
        System.out.println("子类重写(覆盖)父类的吃饭方法");
    }
}

package com.uncle.public_test.src.test_final;

public class TestFinal {

    private final String name = "";
    public void testNum(final int[] a){
        a[0] = 10;
    }

    public static void main(String[] args){
        Person p = new Person();
        p.eat();

//        TestFinal tf = new TestFinal();

        //final int a;//声明变量   内存开辟栈内存空间
        //a = 1;//赋值   常量区取得一个常量  复制一份存入a空间内
        //a = 10;//改变变量的值

        /*
        final int[] x;
        x = new int[]{1,2,3};
        x = new int[5];
        x[0] = 10;
        x[0] = 100;
        */
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值