Java内部类(从入门到大成)

活动地址:CSDN21天学习挑战赛

一、什么是内部类

  将一个java类定义到另一个java类中的java类就是内部类。
  外部类—>包含内部类的类
  内部类—>外部类中的类
  注意:内部类编译后会形成一个新的字节码文件【外部类类名$内部类类名.class】

例如:

pubic  class  Hello{//外部类
	public class  World{//内部类
	}
}

二、成员内部类

  成员内部类—>类中方法外【成员变量】

特征

  1. 成员内部类可以使用任意的访问限制修饰符。
  2. 成员内部类可以有实例变量、实例方法、构造方法,不能有静态元素。
  3. 成员内部类中的构造方法可以访问其他的构造方法【new】,可以访问实例变量/方法【对象.实例变量/方法 ,this.实例变量/方法,可以省略对象/this】。
  4. 成员内部类中的实例方法可以访问构造方法【new】,可以访问实例变量/方法【对象.实例变量/方法 ,this.实例变量/方法,可以省略对象/this】。
  5. 成员内部类中的构造方法可以访问外部类的构造方法,实例方法/变量,类方法/变量。
  6. 成员内部类中的实例方法可以访问外部类的构造方法,实例方法/变量,类方法/变量。
  7. 外内部类中的构造方法/实例方法可以访问成员内部类的构造方法,实例方法/变量,外内部类中的类方法不能访问成员内部类。
  8. 其他类中是可以访问成员内部类的,需要依赖外部类对象,注意访问限制修饰符。

例如:

package com.wangxing.test1;
public class Hello {
	public int helloid=1000;
	public static String helloname="lisi";
	public  Hello() {
		World w=new World();
		System.out.println("worldid=="+w.worldid);
		w.worldMethod1();
	}
	public  Hello(int num) {}
	public void  helloMehtod1() {
		World w=new World();
		System.out.println("worldid=="+w.worldid);
		w.worldMethod1();
	}
	public void  helloMehtod2() {}
	public static void  helloStaticMehtod1() {
		//World w=new World();
		//System.out.println("worldid=="+w.worldid);
		//w.worldMethod1();
	}
	public static void  helloStaticMehtod2() {}
	public class  World{
		//成员内部类可以有实例变量
		public int worldid=1001;
		//成员内部类不可以有类变量
		//public static String worldname="zhangsan";
		//成员内部类可以有构造方法
		//成员内部类中的构造方法可以访问其他的构造方法【new】,可以访问实例变量/方法【对象.实例变量/方法,this.实例变量/方法,可以省略对象/this】。
		public World() {
			World w=new World(100);
			System.out.println("worldid=="+w.worldid);
			System.out.println("worldid=="+this.worldid);
			System.out.println("worldid=="+worldid);
			w.worldMethod1();
			this.worldMethod1();
			worldMethod1();
		}
		//成员内部类中的构造方法访问外部类的
		public World(int num) {
			Hello  hello=new Hello(12);
			System.out.println("helloid=="+hello.helloid);
			System.out.println("helloid=="+Hello.this.helloid);
			System.out.println("helloid=="+helloid);
			hello.helloMehtod2();
			Hello.this.helloMehtod2();
			helloMehtod2();
			System.out.println("helloname=="+hello.helloname);
			System.out.println("helloname=="+Hello.this.helloname);
			System.out.println("helloname=="+Hello.helloname);
			System.out.println("helloname=="+helloname);
			hello.helloStaticMehtod2();
			Hello.this.helloStaticMehtod2();
			Hello.helloStaticMehtod2();
			helloStaticMehtod2();
		}
		//成员内部类可以有实例方法
		//4.成员内部类中的实例方法可以访问构造方法【new】,可以访问实例变量/方法【对象.实例变量/方法,this.实例变量/方法,可以省略对象/this】。
		public void worldMethod1() {
			World w=new World(100);
			System.out.println("worldid=="+w.worldid);
			System.out.println("worldid=="+this.worldid);
			System.out.println("worldid=="+worldid);
			w.worldMethod1();
			this.worldMethod1();
			worldMethod1();
		}
		//成员内部类中的实例方法访问外部类
		public void worldMethod2() {
			Hello  hello=new Hello(12);
			System.out.println("helloid=="+hello.helloid);
			System.out.println("helloid=="+Hello.this.helloid);
			System.out.println("helloid=="+helloid);
			hello.helloMehtod2();
			Hello.this.helloMehtod2();
			helloMehtod2();
			System.out.println("helloname=="+hello.helloname);
			System.out.println("helloname=="+Hello.this.helloname);
			System.out.println("helloname=="+Hello.helloname);
			System.out.println("helloname=="+helloname);
			hello.helloStaticMehtod2();
			Hello.this.helloStaticMehtod2();
			Hello.helloStaticMehtod2();
			helloStaticMehtod2();
		}
		//成员内部类不可以有类方法
		//public static void worldStaricMethod() {}
	}
}

package com.wangxing.test1;
public class Test1 {
	public Test1() {
		/*
		//import com.wangxing.test1.Hello.World;
		Hello  h=new Hello();
		World w1=h.new World();
		World w2=new Hello().new World();
        */
		
		Hello  h=new Hello();
		Hello.World w1=h.new World();
		Hello.World w2=new Hello().new World();
	}
	public  void myMethod() {
		/*
		//import com.wangxing.test1.Hello.World;
		Hello  h=new Hello();
		World w1=h.new World();
		World w2=new Hello().new World();
        */
		Hello  h=new Hello();
		Hello.World w1=h.new World();
		Hello.World w2=new Hello().new World();
	}
	public static void main(String[] args) {
		/*
		//import com.wangxing.test1.Hello.World;
		Hello  h=new Hello();
		World w1=h.new World();
		World w2=new Hello().new World();
        */
		Hello  h=new Hello();
		Hello.World w1=h.new World();
		Hello.World w2=new Hello().new World();
	}
}

三、方法内部类

  方法内部类—>类中方法中【局部变量】

特征

  1. 方法内部类不能使用任何访问限制修饰
  2. 方法内部类可以有实例变量/方法,构造方法,不能有静态元素。
  3. 方法内部类可以访问自己的实例变量/方法【对象/this,也可以省略】,构造方法
  4. 方法内部类可以访问本方法的局部变量【直接变量名称】
  5. 方法内部类可以访问外部类的构造方法,实例方法/变量,类方法/变量。
  6. 外部类是不能访问到方法内部类。

例如:

package com.wangxing.test1;

public class Hello {
	public  int helloid=1000;
	public Hello() {}
	public void  helloMehtod() {}
	public static void  helloStaticMehtod() {}
	
	public void  helloMethod1(int num){
		String name="zhangsan";
		class  World{
			public  int worldid=1001;
			//public static  String worldname="zhangsan";
			public World() {
				World  w=new World(1);
				System.out.println("worldid=="+w.worldid);
				System.out.println("worldid=="+this.worldid);
				System.out.println("worldid=="+worldid);
				w.worldMethod2();
				this.worldMethod2();
				worldMethod2();
				//4.方法内部类可以访问本方法的局部变量【直接变量名称】
				System.out.println("name=="+name);
				
			}
			public World(int a) {
				Hello h=new Hello();
				System.out.println("helloid=="+h.helloid);
				System.out.println("helloid=="+Hello.this.helloid);
				System.out.println("helloid=="+helloid);
				h.helloMehtod();
				Hello.this.helloMehtod();
				helloMehtod();
				h.helloStaticMehtod();
				Hello.this.helloStaticMehtod();
				Hello.helloStaticMehtod();
				helloStaticMehtod();
			}
			public void worldMethod1() {
				World  w=new World(1);
				System.out.println("worldid=="+w.worldid);
				System.out.println("worldid=="+this.worldid);
				System.out.println("worldid=="+worldid);
				w.worldMethod2();
				this.worldMethod2();
				worldMethod2();
				//4.方法内部类可以访问本方法的局部变量【直接变量名称】
				System.out.println("name=="+name);

				Hello h=new Hello();
				System.out.println("helloid=="+h.helloid);
				System.out.println("helloid=="+Hello.this.helloid);
				System.out.println("helloid=="+helloid);
				h.helloMehtod();
				Hello.this.helloMehtod();
				helloMehtod();
				h.helloStaticMehtod();
				Hello.this.helloStaticMehtod();
				Hello.helloStaticMehtod();
				helloStaticMehtod();
			}
			public void worldMethod2() {}
			//public static void worldStaticMethod() {}
		}
		
	}
}

四、静态嵌套类

  静态嵌套类—>成员内部类使用static修饰【类变量】

特征

  1. 静态嵌套类中可以有构造方法,实例变量/方法,类变量/方法。
  2. 静态嵌套类中构造方法/实例方法可以访问本静态嵌套类中的构造方法,实例变量/方法,类变量/方法。
  3. 静态内部类中类方法可以访问本静态嵌套类中的构造方法,实例变量/方法【只能对象】,类变量/方法.
  4. 静态内部类中的构造方法/实例方法/类方法可以访问外部类的构造方法,实例变量/方法【只能对象】,类变量/方法。
  5. 静态嵌套类中不能有this.
  6. 外部类的构造方法/实例方法/类方法可以访问,静态内部类中构造方法,实例变量/方法【只能对象】,类变量/方法.
  7. 其他类中可以访问静态嵌套类【new 外部类类名.静态嵌套类名()】。注意访问限制修饰符

例如:

package com.wangxing.test1;

public class Hello {
	public int helloid=1000;
	public static String helloname="lisi";
	
	public  Hello() {
		World w=new World();
		System.out.println("worldid=="+w.worldid);
		w.worldMethod1();
		System.out.println("worldname=="+w.worldname);
		System.out.println("worldname=="+World.worldname);
		w.worldStaricMethod1();
		World.worldStaricMethod1();
	}
	public  Hello(int num) {
		
	}
	
	public void  helloMehtod1() {
		World w=new World();
		System.out.println("worldid=="+w.worldid);
		w.worldMethod1();
		System.out.println("worldname=="+w.worldname);
		System.out.println("worldname=="+World.worldname);
		w.worldStaricMethod1();
		World.worldStaricMethod1();
	}
	public void  helloMehtod2() {
		
	}
	
	public static void  helloStaticMehtod1() {
		World w=new World();
		System.out.println("worldid=="+w.worldid);
		w.worldMethod1();
		System.out.println("worldname=="+w.worldname);
		System.out.println("worldname=="+World.worldname);
		w.worldStaricMethod1();
		World.worldStaricMethod1();
	}
	public static void  helloStaticMehtod2() {
		
	}
	
	public static class  World{
		//静态内部类可以有实例变量
		public int worldid=1001;
		//静态内部类可以有类变量
		public static String worldname="zhangsan";
		//静态内部类可以有构造方法
		public World() {
			World w=new World(100);
			System.out.println("worldid=="+w.worldid);
			System.out.println("worldid=="+this.worldid);
			System.out.println("worldid=="+worldid);
			w.worldMethod2();
			this.worldMethod2();
			worldMethod2();
			System.out.println("worldname=="+w.worldname);
			System.out.println("worldname=="+this.worldname);
			System.out.println("worldname=="+World.worldname);
			System.out.println("worldname=="+worldname);
			w.worldStaricMethod2();
			this.worldStaricMethod2();
			World.worldStaricMethod2();
			worldStaricMethod2();
		}
		public World(int num1) {
			Hello  hello=new Hello(12);
			System.out.println("helloid=="+hello.helloid);
			hello.helloMehtod2();
			System.out.println("helloname=="+hello.helloname);
			System.out.println("helloname=="+Hello.helloname);
			System.out.println("helloname=="+helloname);
			hello.helloStaticMehtod2();
			Hello.helloStaticMehtod2();
			helloStaticMehtod2();
		}
		
		//静态内部类可以有实例方法
		public void worldMethod1() {
			World w=new World(100);
			System.out.println("worldid=="+w.worldid);
			System.out.println("worldid=="+this.worldid);
			System.out.println("worldid=="+worldid);
			w.worldMethod2();
			this.worldMethod2();
			worldMethod2();
			System.out.println("worldname=="+w.worldname);
			System.out.println("worldname=="+this.worldname);
			System.out.println("worldname=="+World.worldname);
			System.out.println("worldname=="+worldname);
			w.worldStaricMethod2();
			this.worldStaricMethod2();
			World.worldStaricMethod2();
			worldStaricMethod2();
		}
		public void worldMethod2() {
			Hello  hello=new Hello(12);
			System.out.println("helloid=="+hello.helloid);
			hello.helloMehtod2();
			System.out.println("helloname=="+hello.helloname);
			System.out.println("helloname=="+Hello.helloname);
			System.out.println("helloname=="+helloname);
			hello.helloStaticMehtod2();
			Hello.helloStaticMehtod2();
			helloStaticMehtod2();
		}
		//静态内部类可以有类方法
		public static void worldStaricMethod1() {
			World w=new World(100);
			System.out.println("worldid=="+w.worldid);
			w.worldMethod2();
			System.out.println("worldname=="+w.worldname);
			System.out.println("worldname=="+World.worldname);
			System.out.println("worldname=="+worldname);
			w.worldStaricMethod2();
			World.worldStaricMethod2();
			worldStaricMethod2();
		}
		public static void worldStaricMethod2() {
			Hello  hello=new Hello(12);
			System.out.println("helloid=="+hello.helloid);
			hello.helloMehtod2();
			System.out.println("helloname=="+hello.helloname);
			System.out.println("helloname=="+Hello.helloname);
			System.out.println("helloname=="+helloname);
			hello.helloStaticMehtod2();
			Hello.helloStaticMehtod2();
			helloStaticMehtod2();
		}
	}
}

package com.wangxing.test1;

public class Test1 {

	public Test1() {
		/*
		//import com.wangxing.test1.Hello.World;
		World w=new Hello.World();
		w.worldMethod1();
		w.worldStaricMethod1();
		Hello.World.worldStaricMethod1();
		*/
		
		Hello.World w2=new Hello.World();
	}
	
	public  void myMethod() {
		/*
		//import com.wangxing.test1.Hello.World;
		World w=new Hello.World();
		w.worldMethod1();
		w.worldStaricMethod1();
		Hello.World.worldStaricMethod1();
		*/
		
		Hello.World w2=new Hello.World();
	}
	public static void main(String[] args) {
		/*
		//import com.wangxing.test1.Hello.World;
		World w=new Hello.World();
		w.worldMethod1();
		w.worldStaricMethod1();
		Hello.World.worldStaricMethod1();
		*/
		
		Hello.World w2=new Hello.World();
		
	}
}

五、内部类区分总结

在这里插入图片描述

六、匿名内部类

  匿名内部类—>【没有名字的内部类】就相当于某一个类/接口的子类,知识这个子类没有名字

6.1继承式的匿名内部类

package com.wangxing.test1;
public class MyClass {
	public  void  testMyClass() {
		System.out.println("MyClass类的实例方法");
	}
}
package com.wangxing.test1;
public class Test1 {
	public static void main(String[] args) {
		MyClass mc=new MyClass() {
			@Override
			public void testMyClass() {
			 System.out.println("重写MyClass类的testMyClass方法");	
			}
		};
		mc.testMyClass();
	}
}

  当一个类中的方法参数是抽象类类型时,我们可以传递上转型对象/子类对象,如果不想额外的创建一个子类,这时我们使用匿名内部类也是可以的

package com.wangxing.test1;
public abstract class TestClass {
	public abstract void  testTClass();
}
package com.wangxing.test1;
public class MyClass {
	public  void  testMyClass2(TestClass  tc) {
		tc.testTClass();
	}
}
package com.wangxing.test1;
public class Test1 {
	public static void main(String[] args) {
		MyClass mc=new MyClass();
		mc.testMyClass2(new TestClass() {
			@Override
			public void testTClass() {
				System.out.println("重写抽象类TestClass的抽象方法");
			}
		});	
	}
}

运行结果:

在这里插入图片描述

6.2接口式的匿名内部类

package com.wangxing.test2;
public interface MyInterface {
	void  testMethod();
}
package com.wangxing.test2;
public class Test2 {
	public static void main(String[] args) {
		MyInterface  inter=new MyInterface() {
			@Override
			public void testMethod() {
				System.out.println("重写接口的抽象方法");
			}
		};
	}
}

  当一个类中的方法参数是接口类型时,我们可以传递接口回调对象/子类对象,如果不想额外的创建一个接口的子类,这时我们使用匿名内部类也是可以的。

package com.wangxing.test2;
public interface MyInterface {
	void  testMethod();
}
package com.wangxing.test2;
public class DoClass {
	public  void  testDoMethod(MyInterface inter) {
		inter.testMethod();
	}
}
package com.wangxing.test2;
public class Test2 {
	public static void main(String[] args) {
		DoClass dc=new DoClass();
		dc.testDoMethod(new MyInterface() {
			@Override
			public void testMethod() {
				System.out.println("重写接口的抽象方法");
			}
		});
	}
}

运行结果:

在这里插入图片描述

总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据型 在C语言中,变量用于存储数据,数据型用于定义变量的型和范围。C语言支持多种数据型,包括基本数据型(如int、float、char等)和复合数据型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊型,通常以字符串常量的形出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同型数据的复合数据型。结构体由多个成员组成,每个成员可以是不同的数据型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值