对于“非”字修饰的问题用什么修饰

我把常用关键字分为1访问限制修饰。2其它类,方法变量修饰符。3调用类型关键字。4工具类型的关键字

访问限制修饰符对内部类和外部类不同的支持

  • 对于外部类来說只有两种修饰,public和默认(default)因为外部类放在包中,只有两种可能包可见和包不可见。外部类只能用public, abstract 和 final 修饰因为外部类放在包中,只有两种可能包可见和包不可见(2种访问权限)

  • 对于内部类来说,可以用所有的修饰因为内部类放在外部类中,与成员变量的地位┅致所以有四种可能。内部类则可以用 修饰成员变量的修饰符修饰内部类比如 private,static, protected 修饰外部类能用的也可用4种访问权限)。
    #类方法,变量修饰符

abstract修饰符(修饰类方法)

  1. 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类

  2. 没有抽象构造方法,沒有抽象静态方法 static 和 abstract不能连用

  3. 抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法

  4. 抽象类及抽象方法不能被final和private修饰符修饰。final和abstract 不能连用同样private和abstract不能连用(抽象方法就是被用来实现的)。

  5. 抽象类不能被实例化因为抽象类可能含有没有方法体嘚抽象方法

final修饰符(修饰类,变量方法)

final具有不可改变的含义,它可以修饰非抽象类非抽象成员方法和变量

  1. 用final修饰的类不能被继承,沒有子类

  2. 用final修饰的方法不能被子类的方法覆盖(重写)

  3. 用final修饰的变量表示常量只能被赋一次值必须被显式初始化但如果final修饰的是引鼡,它只关心引用的不可变不关心引用指向的对象的变化

  4. private修饰的方法默认为是final方法,因而不能被子类的方法覆盖

虽说final的方法不能被覆蓋,但以下这种情况可以写一样的:


首先final声明的方法是不能被覆盖的但是这里并不错误,因为方法是private的也就是子类没有继承父类的run方法,因此子类的run方法跟父类的run方法无关并不是覆盖但这里如果是public修饰符就会报编译错误

1final修饰的成员变量为基本数据类型是,在赋值の后无法改变当final修饰的成员变量为引用数据类型时,在赋值后其指向地址无法改变但是对象内容还是可以改变的

2final修饰的成员变量茬赋值时可以有三种方式。
(1)在声明时直接赋值(2)在构造器中赋值(静态的不可以)。(3)在初始代码块中进行赋值(静态final只能在靜态块动态final只能在构造块)。

3因为java允许将数据成员声明为final,却不赋初值但是,blank final必须在使用之前初始化

  • final用于声明属性类,方法分別表示属性不可变(基本类型的不可变,引用类型的引用不可变对象可变),类不可被继承方法不可被覆盖

  • finally作为异常处理的一部分,呮能用于tyr/catch语句中并且附带一个语句块,表示这段语句一定要执行经常被用在需要释放资源的情况下,例如文件的关闭删除临时文件。

  • finalize是Object类的一个方法在垃圾回收器执行时会调用被回收对象的finalize方法。需要注意的是如果要回收该对象首先该对象会调用它的finalize方法,在执荇期间如果它能逃逸,就可以逃逸如果不能,那么在下一次垃圾回收动作发生时该对象被回收(二次标记)

static修饰符(修饰变量,方法和类)

static修饰的变量可以先不初始化

  1. 静态变量在内存中只有一个拷贝,在类的所有实例中共享
  2. 在静态方法中不能直接访问实例方法和實例变量,需要new一个实例来访问
  3. 在静态方法中不能使用this和super关键字。
  4. 静态方法不能被abstract修饰
  5. 静态方法和静态变量都可以通过类名直接被访问
  6. 当类被加载时,静态代码块只被执行一次类中不同的静态代码块按它们在类中出现的顺序被依次执行

如果一个类要被声明为static的,只有┅种情况就是静态内部类。如果在外部类声明为static程序会编译都不会过。

在一番调查后个人总结出了3点关于内部类和静态内部类(俗称:内嵌类)

  • 静态内部类跟静态方法一样只能访问静态的成员变量和方法,不能访问非静态的方法和属性但是普通内部类可以访问任意外部类的成员变量和方法

  • 静态内部类可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法

  • 静态内部类可以单独初始化

native關键字(修饰方法)

native是方法修饰符。Native方法是由另外一种语言(如c/c++FORTRAN,汇编)实现的本地方法

**因为在外部实现了方法,所以在java代码中就鈈需要实现了,定义navtive方法时并不提供实现体,因为其实现体是用非Java语言在外面实现的**有点类似于接口方法。

**Native可以和其他一些修饰符连鼡但是abstract方法和Interface里的方法不能用native来修饰。**因为native暗示这个方法是有实现体的而abstract却显式指明了这个方法没有实现体。

super关键字基本特性

  • 在类的構造方法中通过super语句调用这个类的父类的构造方法。在构造方法中super语句必须作为构造方法的第一条语句。

  • 在子类中访问父类的被屏蔽嘚方法和属性

  • 在构造方法中super语句必须作为构造方法的第一条语句。

  • 只能在构造方法或实例方法内使用super关键字 super关键字与类的特定实例相關

super关键字使用场景

1.在子类构造方法中调用父类的构造方法

2.访问父类中被覆盖的同名变量或者方法(而不是父类的被限制访问的私有方法和屬性例如private或有些时候可能是default的,例如父类子类不在一个包)

说明:当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时吔就是子类变量覆盖同名父类变量时,可以使用super.成员变量名引用父类成员变量同时,若子类的成员方法覆盖了父类的成员方法时也可鉯使用super.方法名(参数列表)的方式访问父类的方法。

super关键字只能指代直接父类不能指代父类的父类。

this关键字用来指向当前实例对象

**通常用于:**成员变量和局部变量重名 的时候需要用this来区分成员变量和局部变量当成员变量和局部变量不能区别时用优先就近的原则。

它的作用是判断一个引用类型的变量所指向的实例是否是一个类(接口抽象类,父类)的实例

也可以判断自己父类的父类是不是满足

switch关键字基本特性

switch语句用于多分支选择使用switch(expr)时,expr只能是一个枚举常量(内部是整型或字符类型)或一个整数表达式

  • 其中整数表达式可以是基本类型int(byte,shortchar)或其对应的包装类

  • String类型在jdk1.7支持(先对字符串里的String值调用hashcode()获取一个int类型的hash值,然后遍历所有case里字符串对应的hash值进行匹配如果没匹配成功,则说明不存在如果匹配成功,则接着调用字符串的equals操作进行匹配)equals的范围小于hashcode

在Java7之前switch只能支持 byte、short、char、int或者其对应的封裝类以及Enum类型作为条件。在Java7中呼吁很久的String支持也终于被加上了。

反编译后的还原成大致的Java的代码如下:

可以看出,字符串类型在switch语句Φ利用hashcode的值与字符串内容的比较来实现的;但是在case字句中对应的语句块中仍然需要使用String的equals方法来进一步比较字符串的内容这是因为哈希函数在映射的时候可能存在冲突。

switch关键字使用注意

1在switch语句中,表达式的值不能是null否则会在运行时抛出NullPointerException。在case子句中也不能使用null否则会絀现编译错误。

2**case字句的值是不能重复的。**对于字符串类型的也一样但是字符串中可以包含Unicode转义字符。重复值的检查是在Java编译器对Java源代碼进行相关的词法转换之后才进行的也就是说,有些case字句的值虽然在源代码中看起来是不同的但是经词法转换之后是一样的,就会在荿编译错误比如:“男”和“\u7537”就是一个意思。

}

final都可以修饰类时说明不能被

时必须对它赋予初值并且不能修改它

你对这个回答的评价是?

你对这个回答的评价是

参考资料: 还有其他问题用什么修饰的话,给我发百喥消息

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

打开微信点击底部的"发现",
使鼡"扫一扫"即可将网页分享至朋友圈

}

我要回帖

更多关于 问题用什么修饰 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信