目浴錄
深入瞭解Java類 (嵌套類、內部類以及JavaBean)
一、嵌套類的分類
靜態嵌套類 | static修飾;必須通過對象來訪問其包圍類的成員 |
---|---|
非靜態嵌套類(內部類) | 內部類可以訪問它的外部類的所有變量和方法,並且可以像外部類的其他非靜態成員那樣以同樣的方式直接引用他們 |
二、內部類
I 代碼展示
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class 嵌套類與內部類 { //外部類
String string = new String("hello");
static String string1 = new String("hello");
String name = new String("Nick");
public static void main(String[] args) {
// Dog.shout(); 非法,編譯無法通過:不可直接調用靜態內部類的成員
Dog dog = new Dog();
dog.shout();//可以通過創建類的對象進行訪問
int b=dog.earamonut; //通過創建的對象訪問內部類的公有成員
int a =dog.nouseamount;//通過創建的對象訪問內部類的私有成員
嵌套類與內部類 o = new 嵌套類與內部類();
o.test();
CloseFrameTest closeFrameTest = new CloseFrameTest();
}
//一、外部類中定義內部類
static class Dog{//外部類中定義的內部類 靜態
private int nouseamount = 1;
public int earamonut = 2;
public void shout(){//靜態成員方法
System.out.println("汪汪汪!");
//System.out.println(string); 非法,編譯無法通過:不能直接訪問外部類的非靜態成員
System.out.println(string1);//可以訪問外部類的靜態成員
System.out.println("我有 "+nouseamount+" 個鼻子");//可以訪問本內部類中的變量和方法
}
}
class Inner1 {//內部類1 非靜態
public int a = 1;
private int b = 2;
int c = 3;
public void display(){
System.out.println("MY name is " + name);//可以訪問外部類的成員
}
}
void test(){//外部類的方法
Inner1 inner1 = new Inner1();
inner1.display();
//System.out.println(a); 非法,編譯無法通過:不可直接訪問內部類的任何成員
System.out.println(inner1.a);//通過創建的對象來訪問內部類的成員
Inner2 inner2 = new Inner2();
inner2.tranfer();
}
class Inner2{//內部類2 非靜態
Inner1 inner1 = new Inner1();
public void tranfer(){
//System.out.println(a); 非法,編譯無法通過:不可直接訪問同等級內部類的任何成員
//System.out.println(Inner1.a);
inner1.display();//通過創建的對象來訪問同等級內部類的方法
System.out.println("sum = " + inner1.a + inner1.b + inner1.c);////通過創建的對象來訪問同等級內部鱷梨的變量
}
}
//二、方法中定義內部類
int out_x = 100;//外部類變量
public void test1(){//外部類方法test1
class InnerOne{
String x = "x";
void display(){
System.out.println(out_x);//可以直接訪問外部變量
}
}
InnerOne innerOne = new InnerOne();
innerOne.display();
}
public void test2(){//外部類方法test2
//public String s1 = " "; 非法,編譯無法通過:不可定義,只能用final修飾
//static String s2 = " "; 非法,編譯無法通過:不可定義,只能用final修飾
String s3 = "hello";//可以不修飾
final String s4 = "hello";
class InnerTwo{
public void printInfo(){
System.out.println(out_x);//可以直接訪問外部類變量
System.out.println(s3);//?????爲啥這裏可以訪問
System.out.println(s4);//只能訪問本方法中得final變量
}
}
InnerTwo innerTwo = new InnerTwo();
innerTwo.printInfo();
}
//三、匿名內部類
static class CloseFrameTest extends Frame{
CloseFrameTest(){
this.setSize(200,200);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println(0);
}
});
}
}
}
II 總結
1. 在一個類(外部類)中直接定義的內部類
- 靜態嵌套類中,內部類不能訪問外部類的非靜態成員。
- 靜態嵌套類中,當外部類訪問內部類的成員時,不能直接訪問,但可以通過內部類來訪問,
- 這是因爲靜態嵌套內的所有成員和方法默認爲靜態的。
- 內部類的變量成員只在內部類可見,若外部類或同層次的內部類需要訪問,需要先創建內部類的對象。
- 不可以直接訪問內部類的變量。
2. 在一個方法(外部類的方法)中定義的內部類
- 定義在方法內部的內部類可見性更小,它只在方法內部可見。
- 方法中的內部類不可訪問本方法的成員變量,只能訪問本方法的final變量。
- 在方法內部定義成員時,只允許使用final修飾詞或不加修飾詞。
3. 匿名內部類
- 通常使用在Java的事件處理上。
III 疑問?????
//二、方法中定義內部類
int out_x = 100;//外部類變量
public void test1(){//外部類方法test1
class InnerOne{
String x = "x";
void display(){
System.out.println(out_x);//可以直接訪問外部變量
}
}
InnerOne innerOne = new InnerOne();
innerOne.display();
}
public void test2(){//外部類方法test2
//public String s1 = " "; 非法,編譯無法通過:不可定義,只能用final修飾
//static String s2 = " "; 非法,編譯無法通過:不可定義,只能用final修飾
String s3 = "hello";//可以不修飾
final String s4 = "hello";
class InnerTwo{
public void printInfo(){
System.out.println(out_x);//可以直接訪問外部類變量
System.out.println(s3);//?????爲啥可以訪問非final變量???
System.out.println(s4);//只能訪問本方法中得final變量
}
}
InnerTwo innerTwo = new InnerTwo();
innerTwo.printInfo();
}
方法中的內部類不可訪問本方法的成員變量,只能訪問本方法的final變量,但代碼裏竟然可以,凸(艹皿艹 ),我去研究研究。。。。。
三、JavaBean組件技術
JavaBean 是一種JAVA語言寫成的可重用組件。爲寫成JavaBean,類必須是具體的和公共的,並且具有無參數的構造器。屬性的類型保持唯一,get方法返回值必須和set方法參數類型一致。每個屬性要有對應的get、set方法(隱藏屬性可以沒有)。JavaBean 通過提供符合一致性設計模式的公共方法將內部域暴露成員屬性。衆所周知,屬性名稱符合這種模式,其他Java 類可以通過自身機制發現和操作這些JavaBean 屬性。 換句話說,javabean就是一個java的類,只不過這個類你要按上面提到的一些規則來寫,比如必須是公共的啊,無參構造啊等等,按這些規則寫了之後,這個javabean可以在程序裏被方便的重用,使開發效率提高。
public class JavaBean組件技術 {
public static void main(String[] args) {
Student student = new Student();
//通過get、set方法對屬性進行訪問和修改
student.setHeight(187);
student.setWeight(70);
student.setName("cc雪影");
student.setSex("男");
student.setId(123);
System.out.println(student.getName()+" 身高:"+student.getHeight()+
" 體重:"+student.getWeight()+"kg ");
}
}
class Student {
private int id;//變量須是 private類型
private String name;
private String sex;
private int height;
private int weight;
public Student(){//必須得有無參構造器
}
//定義JavaBean的get、set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
學習從點滴開始,學到的東西可能會忘記,記得點贊收藏哦
System.out.println("我選擇滑稽取寵");