基本概念
一、內部類可以方便的訪問外部類的私有屬性
package practice;
class Outner{ //外部類
private String msg = "Hello World";
class Inner{ //內部類
public void print(){
System.out.println(msg);
}
}
public void fun(){
//實例化內部類對象并調用print()方法
new Inner().print(); //使用匿名對象,此時不必聲明對象
}
}
public class Inner {
public static void main(String [] args){
Outner a = new Outner(); //聲明外部對象并實例化外部類
new Outner().fun(); //調用外部類方法-------用a調用和用new Outner()調用一樣
}
}
二、外部類也可以方便的訪問內部類的私有屬性
package practice;
class Outner{ //外部類
private String msg = "Hello World";
class Inner{ //內部類
private String info = "世界,你好";
public void print(){
System.out.println(msg);
}
}
public void fun(){
//聲明并實例化內部類對象
Inner in = new Inner();
//直接利用內部類調用了內部類中定義的方法
System.out.println(in.info);
}
}
public class Inner {
public static void main(String [] args){
Outner a = new Outner(); //聲明外部對象并實例化外部類
new Outner().fun(); //調用外部類方法-------用a調用和用new Outner()調用一樣
}
}
三、類名稱.this.屬性
package practice;
class Outner{ //外部類
private String msg = "Hello World";
class Inner{ //內部類
public void print(){
//this表示當前,若不加Outner,this.msg表示查找當前類
System.out.println(Outner.this.msg);
}
}
public void fun(){
//實例化內部類對象并調用print()方法
new Inner().print(); //使用匿名對象,此時不必聲明對象
}
}
public class Inner {
public static void main(String [] args){
Outner a = new Outner(); //聲明外部對象并實例化外部類
new Outner().fun(); //調用外部類方法-------用a調用和用new Outner()調用一樣
}
}
轉換(內部類的實例化方法)
package practice;
class Outner{ //外部類
private String msg = "Hello World";
class Inner{ //內部類
public void print(){
System.out.println(Outner.this.msg);
}
}
}
public class Inner {
public static void main(String [] args){
//外部類.內部類 對象 = new 外部類().new 內部類();
Outner.Inner in = new Outner().new Inner();
in.print();
}
}
static定義內部類
package practice;
class Outner{ //外部類
private static String msg = "Hello World";
static class Inner{ //內部類
public void print(){
System.out.println(msg);
}
}
}
public class Inner {
public static void main(String [] args){
Outner.Inner in = new Outner.Inner();
in.print();
}
}
方法中定義內部類
內部類可以在任意位置定義,包括類、方法、代碼塊。
package practice;
class Outner{ //外部類
private String msg = "Hello World";
public void fun(){
class Inner{
public void print(){
System.out.println(Outner.this.msg);
}
}
new Inner().print();;
}
}
public class Inner {
public static void main(String [] args){
new Outner().fun();
}
}
內部類和外部類之間可以方便的進行私有屬性的訪問
package practice;
class Outner{ //外部類
private String msg = "Hello World";
public void fun(int num){
double score = 99.9;
class Inner{
public void print(){
System.out.println("屬性:"+Outner.this.msg);
System.out.println("方法參數:"+num);
System.out.println("方法變量:"+score);
}
}
new Inner().print();;
}
}
public class Inner {
public static void main(String [] args){
new Outner().fun(100);
}
}
分類
代碼塊分為普通代碼塊、構造塊、靜態塊、同步代碼塊。由{}括起來的才為代碼塊。
普通代碼塊
作用避免代碼過多時,有可能產生重復變量。
public class Demo{
public static void main(String [] args){
//下面大括號內容即為普通代碼塊,若去掉普通代碼塊則程序錯誤,變量名重復
{
int num = 10; //局部變量
System.out.println(num);
}
int num = 10; //全局變量
System.out.println(num);
}
}
構造塊
構造塊執行優先于構造方法
class Gouzhao{
public Gouzhao(){ //構造方法
System.out.println("【A】 構造方法產生");
}
{
System.out.println("【B】 構造塊產生");
}
}
public class Demo{
public static void main(String [] args){
new Gouzhao();
}
}
靜態塊
含有static關鍵字的都為靜態塊,分為兩種在主類中和非主類中。
非主類靜態塊
執行優先于構造塊,但是只執行一次,作用為類中的static屬性初始化。
class Gouzhao{
static String mag;
public Gouzhao(){ //構造方法
System.out.println("【A】 構造方法產生");
}
{
System.out.println("【B】 構造塊產生");
}
static{ //靜態塊
msg = "Hello";
System.out.println("【C】 靜態塊產生");
}
}
public class Demo{
public static void main(String [] args){
new Gouzhao();
new Gouzhao();
new Gouzhao();
System.out.println(Gaozhao.msg);
}
}
主類靜態塊
執行優先于主方法。
public class Demo{
static{ //靜態塊
System.out.println("靜態塊產生");
}
public static void main(String [] args){
System.out.println("Hello World");
}
同步代碼塊
......
總結
四大代碼塊開發制造一般不會使用,但在測試程序時有可能會使用到靜態塊。