Java内部类手机专卖店_Java(20)内部类
內部類
一個定義在另一個類里面的類稱為內部類。內部類可以分為四種形式:成員內部類,
成員內部類
內部調用外部的屬性和方法
成員內部類可以無條件訪問外部類的所有成員屬性和方法。
其他類(例子中的RunC類)訪問一個內部類的形式有三種:
Outter.Inner outin=new Outter().new Inner();
Outter out=new Outter();
Outter.Inner in=out.new Inner();
public Inner getInnerInstance(){return Inner};
Outter out=new Outter();
Outter.Inner in=out.getInnerInstance();
public class Outter {
private String name = "Krystal";
private int age = 20;
private Inner innerInit=null;
public void outterFun(){
System.out.println("外部類的方法");
}
public Inner getInnerInstance(){
if(innerInit==null){
innerInit=new Inner();
return innerInit;
}else{
return innerInit;
}
}
class Inner {
void fun() {
//內部類無條件訪問外部類的所有成員屬性和方法,不需要聲明
outterFun();
System.out.println(name);
System.out.println(age);
}
}
}
class RunC {
public static void main(String[] args) {
//第一種方式:
Outter.Inner outin=new Outter().new Inner();
outin.fun();
// //第二種方式:
// Outter out=new Outter();
// Outter.Inner in=out.new Inner();
// in.fun();
// //第三種方式:
// Outter out=new Outter();
// Outter.Inner in=out.getInnerInstance();
// in.fun();
}
}
/*運行結果為:
外部類的方法
Krystal
20
*/
外部調用內部的屬性和方法
成員內部類可以無條件訪問外部類的所有成員屬性和方法,但是外部想訪問內部就沒那么簡單了。首先要創建一個成員內部類的對象,然后通過該對象訪問。
其他類(例子中的RunC類)訪問一個外部類的方式跟平時一樣,正常調用即可。
public class Outter {
Inner in=new Inner();
void outterFun(){
System.out.println(in.salary);
in.innerFun();
}
class Inner {
public void innerFun() {
System.out.println("內部類的方法");
}
private long salary=25000;
}
}
class RunC {
public static void main(String[] args) {
Outter ot=new Outter();
ot.outterFun();
}
}
/*運行結果為:
25000
內部類的方法
*/
局部內部類
局部內部類是定義在一個方法內或者一個作用域內的類。局部內部類的訪問權限僅限于方法內或者作用域內。
class Outter{
private String name="krystal";
public void outterFun(){
class Woman{
int age=18;
}
//方法內定義的局部內部類的成員屬性和方法只能在該方法內使用
System.out.println(new Woman().age);
}
//Woman w=new Woman();--->編譯報錯
}
class RunC{
public static void main(String[] args) {
Outter out=new Outter();
out.outterFun();
}
}
//運行結果: 18
匿名內部類(常用)
首先來了解以下什么叫做匿名類,匿名類就是沒有名稱的類,匿名類的名稱由java的編譯器給出,格式形如:外部類名稱+$匿名類順序。
既然匿名類沒有名稱,沒有名稱就不能被其它地方引用,不能被實例化,所以匿名類只能用一次,也不能由構造器。
匿名類可以繼承父類的方法,也可以重寫父類的方法。
匿名類必須繼承一個父類或者實現一個接口。創建語法格式如下:
new 父類構造器(實參列表) | 實現接口()
{
//匿名內部類的類體部分
}
匿名類可以訪問外部類的成員屬性和方法,匿名類的類體不可以聲明static變量或static方法。
了解了匿名類之后,那么放在一個類內部的匿名類就是匿名內部類。
案例1:通過繼承實體類創建匿名內部類
class Outter{
public String name="krystal";
void show(){
System.out.println("我叫"+name);
}
}
class RunC{
public static void main(String[] args) {
//通過實體類創建匿名內部類,相當于創建一個該類的子對象
Outter out=new Outter(){
//匿名內部類可以重寫父類的方法:
@Override
void show() {
System.out.println("我叫Jimmy");
}
};
out.show();
//匿名內部類可以繼承父類的屬性和方法:
System.out.println(out.name);
//查看編譯器分配給匿名內部類的名稱
System.out.println(out.getClass());
}
}
/*運行結果為:
我叫Jimmy
krystal
class RunC$1
*/
案例2:通過實現接口創建匿名內部類
interface OutF{
public double getPrice();
public String getName();
}
class RunC{
public static void main(String[] args) {
OutF oF=new OutF() {
@Override
public double getPrice() {
return 153.45;
}
@Override
public String getName() {
return "shit";
}
};
System.out.println(oF.getName());
System.out.println(oF.getPrice());
System.out.println(oF.getClass());
}
}
/*運行結果為:
shit
153.45
class RunC$1
*/
靜態內部類
靜態內部類是定義在一個類內且加了static關鍵字的類。靜態內部類不能訪問外部類的非靜態成員變量和方法,因為外部類的非static成員必須通過具體的對象來訪問,如果靜態內部類可以訪問非static的外部類成員,就破壞了這一原則。
class staClass{
private String cls_id;
static class Innersta{
void fun(){
// System.out.println(cls_id);
// 報錯Non-static field 'cls_id' cannot be referenced from a static context
}
}
}
總結
以上是生活随笔為你收集整理的Java内部类手机专卖店_Java(20)内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java利用递归画杨辉三角_用java程
- 下一篇: java三段式if_Java几种常用的断