淘宝开店网站怎么做,电子产品商务网站模板,网站建设服务费计入会计科目,开发个app的公司在哪Java面向对象—嵌套类、内部类、匿名类
一、static静态
在《Java编程思想》有这样一段话#xff1a; “static方法就是没有this的方法。在static方法内部不能调用非静态方法#xff0c;反过来是可以的。而且可以在没有创建任何对象的前提下#xff0c;仅仅通过类本身来…Java面向对象—嵌套类、内部类、匿名类
一、static静态
在《Java编程思想》有这样一段话 “static方法就是没有this的方法。在static方法内部不能调用非静态方法反过来是可以的。而且可以在没有创建任何对象的前提下仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。” 这段话说明了static方法的特殊之处也看出static关键字的基本作用简而言之一句话来描述就是 方便在没有创建对象的情况下来进行调用方法/变量。 很显然被static关键字修饰的方法或者变量不需要依赖于对象来进行访问只要类被加载了就可以通过类名去进行访问。static可以用来修饰类的成员方法、类的成员变量另外可以编写static代码块来优化程序性能。
static修饰的变量在我们平时的使用当中static最常用的功能就是修饰类的属性和方法让他们成为类的成员属性和方法我们通常将用static修饰的成员称为类成员或者静态成员。注意static只能修饰成员变量不可以修饰局部变量。 public String name;public static int age; Student snew Student();s.name张三;s.age12;Student s1new Student();s1.name李四;s1.age15;System.out.println(s.name今年s.age岁了);System.out.println(s1.name今年s1.age岁了); 量为静态变量时那么它的值是存储在内存的静态区中所以赋值时会变成一个值。
static修饰的方法static的另一个作用就是修饰成员方法。static修饰成员方法最大的作用就是可以使用类名.方法名的方式操作方法避免了先要new出对象的繁琐和资源消耗我们可能会经常在帮助类或工具类中看到它的使用。 public static void say() {System.out.println(我是一名学生);} Student.say(); 静态方法时那么它可以直接使用类名获取方法main方法是我们常见的静态方法。
二、嵌套类
在 Java 语言中允许在另外一个类中定义一个类这样的类被称为嵌套类。包含嵌套类的类称为外部类也可以叫做封闭类在本文中统一叫做外部类。
//学生类
public class Student {//优等生类class kind{}}
嵌套类分为两类
静态嵌套类使用static声明一般称为嵌套类。非静态嵌套类非static声明一般称为内部类。
//学生类
public class Student {public String name;public static int age;//优等生类static class kind{String techang;}//普通生类class weak{String youdian;}} Student.kind knew Student.kind();k.techang唱歌;System.out.println(k.techang);
嵌套类是它的外部类的成员非静态嵌套类内部类可以访问外部类的其他成员即使该成员是私有的。而静态嵌套类只能访问外部类的静态成员。
嵌套类作为外部类的一个成员可以被声明为private,public,protected或者包范围注意外部类只能被声明为public或者包范围。
嵌套类特点
嵌套类可以访问外部类的所有数据成员和方法即使它是私有的。提高可读性和可维护性因为如果一个类只对另外一个类可用那么将它们放在一起这更便于理解和维护。提高封装性给定两个类A和B如果需要访问A类中的私有成员则可以将B类封装在A类中这样不仅可以使得B类可以访问A类中的私有成员并且可以在外部隐藏B类本身。减少代码的编写量。
1、静态嵌套类 静态嵌套类其实就是在顶级类中封装的一个顶级类它的行为和顶级类一样它被封装在顶级类中其实就是为了方便打包。
静态嵌套类是外部类的静态成员它可以直接使用外部类名.静态嵌套类名访问自身。它可以访问外部类的静态成员和静态私有成员。与其他类一样静态嵌套类不能访问非静态成员。
//学生类
public class Student {public String name;public static int age12;//优等生类static class kind{String techang;static void say() {System.out.println(age);}}//普通生类class weak{String youdian;}}
Student.kind.say();
2、非静态嵌套类 非静态嵌套类也就是内部类它有以下几个特点
实例化内部类必须先实例化一个外部类。内部类实例与外部类实例相关联所有不能在内部类中定义任何静态成员。内部类是非静态的。非静态嵌套类包括成员内部类、局部内部类、匿名内部类
成员内部类 在外部类中并且在外部类的方法外创建的非静态嵌套类称为成员内部类。说白了成员内部类就是外部类的一个非静态成员而已。 创建成员内部类的实例你必须先实例化一个外部类接着通过外部类的实例来创建成员内部类的实例。因此成员内部类的实例必须存在于一个外部类的实例中。另外由于内部类的实例与外部类的实例相关联因此它不能定义任何静态成员。
局部内部类 局部内部类Local inner class通常定义在一个块中。所以通常你会在一个方法块中找到局部内部类。正如局部变量那样局部内部类的作用域受到方法的限制。它可以访问外部类的所有成员和它所在的局部方法中所有局部变量。如果你想调用局部内部类中的方法你必须先在局部方法中实例化局部内部类。
局部内部类限制
无法从方法外部调用局部内部类局部内部类不能被声明为private, public, protected在JDK1.7之前局部内部类不能访问非final的局部变量但是在JDK1.8及之后是可以访问非final的局部变量的。
匿名内部类 匿名内部类可以理解为不需要声明类的对象直接使用类的内容。 在使用匿名内部类的过程中我们需要注意如下几点
使用匿名内部类时我们必须是继承一个类或者实现一个接口但是两者不可兼得同时也只能继承一个类或者实现一个接口。匿名内部类中是不能定义构造函数的。匿名内部类中不能存在任何的静态成员变量和静态方法。匿名内部类为局部内部类所以局部内部类的所有限制同样对匿名内部类生效。匿名内部类不能是抽象的它必须要实现继承的类或者实现的接口的所有抽象方法。