Java中局部内部类可以访问它所在方法中定义的final修饰(精)
Java程序设计中各种“内部类”的比较与应用探析

Java程序设计中各种“内部类”的比较与应用探析【摘要】在一个类的内部定义的类称为内部类,内部类可分为实例内部类、静态内部类、局部内部类等。
本文就内部类的应用给出类相应的分析。
【关键词】内部类;实例内部类;静态内部类;局部内部类在Java语言中,在一个类的内部定义的类称为内部类,内部类允许把一些逻辑相关的类组织在一起,并且控制内部类代码的可视性。
内部类按作用域可以分为成员内部类和局部内部类,其中成员内部类又可以分为实例内部类和静态内部类,下面就三者的比较与应用进行分析。
1 实例内部类、静态内部类和局部内部类的比较分析1.1 主要特征实例内部类的实例引用特定的外部类的实例;静态内部类的实例不与外部类的任何实例关联;局部内部类的可见范围是所在的方法。
1.2 可用的修饰符实例内部类可是使用访问控制修饰符(public、protected、private),abstract,final;静态内部类可以使用访问控制修饰符,static,abstract,final;局部内部类只能使用abstract或final来修饰。
1.3 可用访问外部类的哪些成员实例内部类可用直接访问外部类的所有成员;静态内部类只能直接访问外部类的静态成员;局部内部类可以直接访问外部类的所有成员,并且能访问所在方法的final类型的变量和参数。
1.4 拥有成员的类型实例内部类只能拥有实例成员;静态内部类可以拥有静态成员和实例成员;局部内部类只能拥有实例成员。
1.5 外部类如何访问内部类的成员外部类必须通过实例内部类的实例来访问;外部类中的静态成员可以通过其静态内部类的完整类名来访问;外部类必须通过局部内部类的实例来访问。
2 内部类的应用分析2.1 封装类型面向对象的核心思想之一是封装,把所有不希望对外公开的实现细节封装起来。
顶层类只能处于public和默认访问级别,而内部类可以处于public、protected、private和默认4种访问级别。
final 用法

final 用法1. 什么是 final?在编程语言中,final 是一个关键字,用于修饰类、方法和变量。
它表示该类、方法或变量是不可继承、重写或修改的。
final 的作用是为了保护代码的完整性和安全性。
2. final 修饰类使用 final 修饰一个类时,该类将变为最终类,不允许其他类继承它。
这意味着该类的方法和属性都不能被继承类重写或修改。
final class MyFinalClass {// ...}3. final 修饰方法使用 final 修饰一个方法时,该方法将变为最终方法,不允许子类重写该方法。
这在某些情况下非常有用,比如在父类中定义了一个算法的模板方法,不希望子类修改其中的某些步骤。
class MyParentClass {final void myFinalMethod() {// ...}}4. final 修饰变量4.1 final 修饰基本类型变量使用 final 修饰一个基本类型变量时,该变量的值将成为常量,不可修改。
一旦被赋值后,它将保持不变。
final int myFinalVariable = 10;4.2 final 修饰引用类型变量使用 final 修饰一个引用类型变量时,该变量的引用地址将成为常量,不可修改。
但是,该引用所指向的对象的内容是可以修改的。
final MyClass myFinalReference = new MyClass();myFinalReference.setValue(10); // 可以修改对象的属性5. final 的使用场景5.1 常量final 修饰的变量可以用作常量。
在程序中,我们经常需要定义一些不可变的常量,比如数学中的π,这样可以增加代码的可读性和可维护性。
final double PI = 3.14159;5.2 安全性final 可以提高代码的安全性。
当我们希望某个类、方法或变量的实现不被修改时,可以使用 final 关键字进行修饰,防止他人对其进行篡改。
黑马点招面试问题

1.静态变量和实例变量的区别局部变量不能用静态的,如果用了静态的,则不会从静态区消失* 静态变量也叫类变量成员变量也叫对象变量* A:所属不同* 静态变量属于类,所以也称为为类变量* 成员变量属于对象,所以也称为实例变量(对象变量)* B:内存中位置不同* 静态变量存储于方法区的静态区* 成员变量存储于堆内存* C:内存出现时间不同* 静态变量随着类的加载而加载,随着类的消失而消失* 成员变量随着对象的创建而存在,随着对象的消失而消失* D:调用不同* 静态变量可以通过类名调用,也可以通过对象调用* 成员变量只能通过对象名调用2.Interger和int的区别int是java提供的8种原始数据类型之一。
Java为每个原始类型提供了封装类,Integer 是java为int提供的封装类。
int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
3.谈谈你对面向对象的理解如何大象装进冰箱?面向过程:为了把大象装进冰箱,需要3个过程。
1) 把冰箱门打开(得到打开门的冰箱)2) 把大象装进去(打开门后,得到里面装着大象的冰箱)3) 把冰箱门关上(打开门、装好大象后,获得关好门的冰箱)每个过程有一个阶段性的目标,依次完成这些过程,就能把大象装进冰箱。
1:冰箱开门(冰箱)冰箱装进(冰箱, 大象)冰箱关门(冰箱)==换个写法(冰箱开门冰箱)(冰箱装进冰箱大象)(冰箱关门冰箱)2:冰箱关门(冰箱装进(冰箱开门(冰箱), 大象))==换个写法(冰箱关门 (冰箱装进 (冰箱开门冰箱) 大象))面向对象:每个动作有一个执行者,它就是对象。
1) 冰箱,你给我把门打开2) 冰箱,你给我把大象装进去(或者说,大象,你给我钻到冰箱里去)3) 冰箱,你给我把门关上依次做这些动作,就能把大象装进冰箱。
java中修饰符的限制范围

java中修饰符的限制范围Java 是一种面向对象的编程语言,其中修饰符是用于限制代码可见性、修饰类、方法、变量等的重要机制。
掌握不同修饰符的限制范围和应用场景对于Java 开发者至关重要。
一、概述Java 修饰符Java 修饰符分为以下几种:1.访问修饰符:用于控制类、方法、变量的可见性,包括public、private、protected 和默认(friendly)四种。
2.非访问修饰符:包括final、volatile、transient、static、synchronized、native、const 和volatile 等。
二、限制范围的作用访问修饰符的限制范围如下:1.public:表示公共的,可以被任何类访问,包括其他包中的类。
2.private:表示私有,只能在本类中访问。
3.protected:表示受保护,可以被以下三种情况访问:a.同一个包中的类。
b.子类(继承关系)。
c.同一个包中的静态方法。
4.default(友好访问符):表示默认访问权限,相当于protected。
可以被同一个包中的类访问,但不能被其他包中的类访问。
三、不同修饰符的应用场景1.访问修饰符:- public:适用于需要与其他类共享的类、方法或变量。
- private:适用于类的内部实现,建议将私有方法设置为final,以防止子类覆盖。
- protected:适用于需要子类继承或扩展的类、方法或变量。
- default:适用于包内访问,但不希望被其他包访问的类、方法或变量。
2.非访问修饰符:- final:表示不可变,适用于常量、方法(防止被子类覆盖)和类(表示类不可继承)。
- volatile:表示变量在多个线程之间的可见性,适用于共享变量。
- transient:表示变量在垃圾回收时的处理,适用于生命周期较短的变量。
- static:表示静态,适用于静态方法、静态变量,以及类的初始化。
- synchronized:表示同步,适用于需要线程安全的方法或代码块。
Java中的关键字有哪些?

Java中的关键字有哪些?1)48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。
1.访问修饰符的关键字(3个)public(公有的):可跨包protected (受保护的):当前包内可⽤private (私有的):当前类可⽤2.定义类、接⼝、抽象类和实现接⼝、继承类的关键字、实例化对象(6个)class (类):public class A(){}花括号⾥是已实现的⽅法体,类名需要与⽂件名相同interface (接⼝):public interface B(){}花括号⾥有⽅法体,但没有实现,⽅法体句⼦后⾯是英⽂分号“;”结尾 abstract (声明抽象):public abstract class C(){}介于类与接⼝中间,可以有,也可以没有已经实现的⽅法体implements (实现):⽤于类或接⼝,实现接⼝public class A interface B(){} extends (继承):⽤于类继承类public class A extends D(){}new (创建新对象):A a=new A();A表⽰⼀个类3.包的关键字(2个)import (引⼊包的关键字):当使⽤某个包的⼀些类时,仅需要类名,即可⾃动插⼊类所在的包package (定义包的关键字):将所有相关的类放在⼀个包类以便查找修改等4.数据类型的关键字(9个)byte (字节型):8bitchar (字节型):16bitboolean (布尔型):--short (短整型):16bitint (整型):32bitfloat (浮点型):32bitlong (长整型):64bitdouble (双精度):64bitvoid (⽆返回):public void A(){}其他需要反回的经常与return连⽤5.条件循环(流程控制)(12个)if (如果) :if(条件语句{执⾏代码}如果条件语句成⽴,就开始执⾏{}⾥⾯的内容else (否则,或者) :常与if连⽤,⽤法相同:if(...){...}else{...}while (当什么时候):while(条件语句){执⾏代码}for(满⾜三个条件时):for(初始化循环变量;判断条件;循环变量值{}switch (选择结构):switch(表达式){case常量表达式1:语句1;...case常量表达式2;语句2;default:语句;}default就是如果没有匹配的case就执⾏它,default并不是必须的。
java中final关键字的用法

java中final关键字的用法
Java中的final关键字可以用于修饰类、方法和变量,其作用为:
1. final修饰的类不能被继承
final关键字可以用于修饰类,被修饰的类不能被继承。
这样做的目的是为了防止其他类对该类进行修改,保证该类的稳定性和安全性。
2. final修饰的方法不能被重写
final关键字可以用于修饰方法,被修饰的方法不能被子类重写。
这样做的目的是为了保证该方法的行为不会被修改,避免出现意外的错误。
3. final修饰的变量为常量
final关键字可以用于修饰变量,被修饰的变量为常量,一旦被赋值后就不能再次修改。
这样做的目的是为了保证该变量的值不会被修改,避免出现意外的错误。
4. final修饰的成员变量必须在声明时或构造函数中初始化
final关键字修饰的成员变量必须在声明时或构造函数中初始化,否则会编译错
误。
这样做的目的是为了保证该变量的值不会被修改,避免出现意外的错误。
5. final修饰的引用变量不能改变其引用的对象
final关键字修饰的引用变量不能改变其引用的对象,但是可以改变对象的属性值。
这样做的目的是为了保证该引用变量指向的对象不会被修改,避免出现意外的错误。
总之,final关键字的作用是为了保证程序的稳定性和安全性,避免出现意外的错误。
Java程序设计复习题

一、选择题:1.运行Java程序需要的工具软件所在的目录是 A 。
A.JDK的bin目录 B.JDK的demo目录 C.JDK的lib目录 D.JDK的jre目录2.下列关于Java语言特点的叙述中,错误的是 A 。
A.Java是面向过程的编程语言 B.Java支持分布式计算C.Java是跨平台的编程语言 D.Java支持多线程3. Java的核心包中,提供编程应用的基本类的包是 A 。
A.ng B.java.util C.java.applet D.java.rmi4.下列关于Java对import语句规定的叙述中,错误的是 C。
A.在Java程序中import语句可以有多个B.在Java程序中import语句可以没有C.在Java程序中import语句必须有一个D.在Java程序中import语句引入在所有类定义之前5.在编译Java程序时,用于指定生成.class文件位置的选项是 B。
A.-g B.-d C.-verbose D.-vonarn6.下列关于构造方法的叙述中,错误的是 C 。
A.Java语言规定构造方法名与类名必须相同B.Java语言规定构造方法没有返回值,但不用void声明C.Java语言规定构造方法不可以重载D.Java语言规定构造方法只能通过new自动调用7.下列叙述中错误的是 D 。
A.Java Application与Applet所用编译命令相同B.通常情况下,Java Application只能有一个main()方法C.Java Applet必须有HTML文件才能运行D.Java Applet程序的.class文件可用Java命令运行8.处理对象传输的接口是 A。
A.Serializable B.Cloneable C.ItenListener D.ActionListener9.在读取二进制数据文件的记录时,为了提高效率常常使用的一种辅助类是 C 。
A.InputStream B.FileInputStream C.BufferInputStream D.BufferedReader 10.下列事件监听器中,无法对TextField对象进行事件监听和处理的是 D 。
final和static的用法

final和static的用法final和static的用法final的用法•修饰类:被final修饰的类不能被继承。
这样可以确保类的完整性和安全性,避免被其他类修改或扩展。
•修饰方法:被final修饰的方法不能被子类重写。
这样可以确保方法的行为不会被修改,提高程序的稳定性和可靠性。
•修饰变量:被final修饰的变量称为常量,只能被赋值一次,之后不能再更改。
常量的命名通常使用全大写字母,多个单词之间用下划线分隔。
static的用法•修饰成员变量:被static修饰的成员变量属于类,而不是对象。
所有的对象共享同一个static变量的值,在内存中只会有一份拷贝。
•修饰方法:被static修饰的方法称为静态方法,可以直接通过类名调用,不需要创建对象。
静态方法只能访问静态成员,不能访问非静态成员。
•修饰代码块:被static修饰的代码块称为静态代码块,用于在类加载时执行一些初始化操作。
静态代码块只会在类加载时执行一次,且先于静态方法和构造方法执行。
•修饰内部类:被static修饰的内部类称为静态内部类,与外部类没有绑定关系,可以直接通过类名访问。
静态内部类不能访问外部类的非静态成员。
•修饰导入语句:在导入语句中使用import static可以导入静态成员,使得可以直接使用静态成员的名称,而不需要通过类名访问。
final和static的结合使用•final修饰的变量可以与static修饰的变量结合使用,称为静态常量。
静态常量在内存中只有一份拷贝,并且不能被修改。
•final修饰的方法可以与static修饰的方法结合使用,称为静态方法。
静态方法可以直接通过类名调用,而且不能被子类重写。
以上是final和static的一些基本用法和结合使用的情况。
它们在Java编程中非常常用,能够提高程序的效率和安全性。
通过合理使用final和static,我们可以更好地控制类的继承关系、变量的不可修改性和方法的可靠性。
final修饰类的例子final class MyClass {// class implementation}在这个例子中,被final修饰的类MyClass不能被继承。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public class LocalInnerClassTest{
public static void main(String[] args{
Outer obj=new Outer(; //生成一个外部类对象
SuperInner si=obj.outer(; //调用外部类中的outer(方法,返回一个SuperInner类型对象赋值给si
si.m1(; //调用被覆盖的方法m1(,输出:Inner's m1( 20
}
}
/**
*定义一个接口SuperInner,内部定义一个抽象方法m1(,无返回类型
*/
interface SuperInner{
public void m1(;
}
/**
*定义一个类Outer,内部只定义一个方法outer(,返回类型为SuperInner
*/
class Outer{
public SuperInner outer({
int a=10; //方法中定义一个局部变量a,并赋值为10
final int b=20; //再定义一个final局部变量b,初始化为20
class Inner implements SuperInner{ //在outer(方法中定义一个局部内部类Inner,实现接口SuperInner
public void m1({ //类中只有一个覆盖接口SuperInner的方法m1(
System.out.println("Inner's m1("+a; //编译报错
System.out.println("Inner's m1( "+b; //编译通过,输出:Inner's m1( 20 }
}
return new Inner(;
}
}
我们先从主方法开始看代码的执行顺序,先生成一个Outer类对象obj,obj调用本类中方法outer(;程序开始跳到outer(方法内执行程序语句,先后生成局部变量a和b,再定义一个局部内部类Inner,返回一个SuperInner类型的对象。
将返回的SuperInner类型对象地址传给SuperInner类型对象si。
si再调用m1(方法,因为已经在局部内部类中覆盖了接口中的m1(方法,所以将调用局部内部类中的m1(方法,程序跳到局部内部类中m1(方法内执行程序语句,先输出一段字符串和a,结果编译报错,先将这条程序语句隐藏,执行下面的语句,你会发现编译通过而且输出Inner's m1( 20!
为什么会这样呢?大家都知道局部变量仅仅在一个范围内有效,在方法调用完就被内存释放,在Outer类对象obj调用outer(方法时,a和b才产生,调用结束后被内存释放,那么b这个值也就不复存在了,为什么还会输出20呢?难道局部变量被final修饰就不会被内存释放而保留?
其实有部分操作对于程序员是透明的,那是JAVA语言开发者的小把戏,在定义a和b 时
JVM(JAVA虚拟机做了程序员看不到的操作,他将b拷贝了一份给局部内部类,也就是说JVM在局部内部类中定义了一个final int b=20;这个操作程序员是不知道的!当调用m1(方法时输出的20并不是原来outer(方法中定义的b,而仅仅是JVM拷贝的一个副本。
那么为什么a没被打印出呢?那是因为JVM并没有拷贝它,因为没有final修饰,说明它可以被修改,如果把a 改为a++,此时JVM就不知道拷贝a还是a++了,所以对于无final修饰的局部变量JVM是不会拷贝传给局部内部类的,自然无法打输出!。