你之所以能优于别人,正是因为你坚持了别人所不能坚持的。
本文相关代码在我的Github,欢迎Star~
https://github.com/zhangzhibo1014/DaBoJava将一个类的定义放在另一个类的定义内部,这就是内部类。而包含内部类的类被称为外部类
成员内部类是最普通的一种内部类,成员内部类可以访问外部类所有的属性和方法。但是外部类要访问成员内部类的属性和方法,必须要先实例化成员内部类。
public class Demo {
private String name = "Tom";
// 定义一个成员内部类,作为成员变量
class Student{
private int age = 20;
private String name = "Jack";
public void show() {
System.out.println("内部类属性;" + name);
System.out.println("内部类属性:" + age);
System.out.println("外部类属性:" + Demo.this.name);
}
}
public static void main(String[] args) {
//声明一个外部类对象
Demo demo = new Demo();
//声明一个内部类对象
Student student = demo.new Student();
student.show();
}
}
内部类 对象名 = 外部类对象.new 内部类(); this
注:成员内部类不能含有 static
的变量和方法,因为成员内部类需要先创建了外部类,才能创建它自己的
静态内部类通常被称为嵌套类。
静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象
public class Demo1 {
private String name = "static";
private static int id = 2019;
static class Student{
int id = 11;
public void show() {
System.out.println("外部类成员变量:" + (new Demo1().name));
System.out.println("外部类静态成员:" + Demo1.id);
System.out.println("内部类成员变量:" + id);
}
}
public static void main(String[] args) {
Student student = new Student();
student.show();
}
}
new 外部类().成员
的方式访问 类名.静态成员
访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过 成员名
直接调用外部类的静态成员 内部类 对象名 = new 内部类();
局部内部类,是指内部类定义在方法和作用域内
局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。
/**
* 局部内部类
*/
public class Demo2 {
//将内部类定义在方法中
public void show() {
final String name = "Tom";
class Student{
int id = 20;
public void show() {
System.out.println("外部类方法变量:" + name);
System.out.println("内部类属性变量:" + id);
}
}
Student student = new Student();
student.show();
}
//将内部类定义在作用域内
public void display(int num) {
if(num > 2) {
class Person{
int age = 18;
public void show() {
System.out.println("age = " + age);
}
}
Person person = new Person();
person.show();
} else {
System.out.println("None");
}
}
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.show();
demo2.display(3);
}
}
public
、 protected
、 private
以及 static
修饰符的。 final
修饰。 匿名内部类,顾名思义,就是没有名字的内部类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
/**
* 匿名内部类
*/
public class Demo3 {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
// 匿名内部类 -> 类继承
new Animal() {
public void say() {
System.out.println("Say");
}
}.say();
// 匿名内部类 -> 接口实现
new Fruit(){
public void eat() {
System.out.println("apple");
}
}.eat();
}
}
class Animal{
public void say() {
System.out.println("Animal say");
}
}
interface Fruit{
void eat();
}
new
匿名类,这个类是要先定义的, 如果不先定义,编译时会报错该类找不到。 我们可以根据具体需求来设计和使用内部类。
相关代码记录于 GitHub 中,欢迎各位伙伴 Star !
有任何疑问 微信搜一搜 [程序猿大博] 与我联系~
如果觉得对您有所帮助,请 点赞 , 收藏 ,如有不足,请评论或私信指正!谢谢~