2018-03-08
本章我们将学到的知识点:
1、类的访问限制 2、类的封装 3、嵌套类与内部类
一.访问权限:
java中四种不同的限定词限定的成员(成员变量或成员方法),访问权限由大到小依次为:
1、public 公共的 可以被所有的类访问。
2、protected 受保护的 可以被这个类本身访问。 被它的子类(同一个包以及不同包中的子类)访问。 同一个包中的所有其他的类访问。
3、默认的/友好的 被这个类本身访问。 被同一个包中的类访问。
4、private 私有的 只能被这个类本身访问。 如果一个类的构造方法声明为private,则其它类不能生成该类的一个实例。
java中类的限定词的作用范围比较:
二、实现类的封装:
封装:将成员变量声明为私有的(private),再提供一个或多个公有(public)setXX() 和getXX()方法实现对该成员变量的访问和修改。
类中的私有成员变量/成员方法只能在该类内部调用,不能通过该类的对象调用。
封装的目的:隐藏类的实现细节; 让使用者只能通过指定的方法访问数据,可以方便加入控制逻辑,限制不合理的操作; 便于修改,增强代码可维护性; 可进行数据检查。
三、内部类(nested classes):
将一个类定义置入另一个类定义中就叫作“内部类”。
利用它可对那些逻辑上相互联系的类进行分组 并可控制一个类在另一个类里的“可见性”。
内部类对象保存了一个对外部类对象的引用。
OuterClassName.this代表外部类对象的引用
InnerClassName.this代表内部类对象的引用
内部类 –类中定义的内部类:
1、Inner类是在Outer内部定义的;
2、在Inner类中可以访问Outer类中 的成员属性outer_I;
3、在Outer类中可在方法test()中创建 内部类Inner的对象;
4、通过Outer类的对象调用test() 方法最终就可以执行Inner类中的方法。
class Outer{ int outer_i = 100; void test(){ Inner in = new Inner(); in.display(); } class Inner{ void display(){ System.out.println("display: outer_i = " + outer_i); } } }
在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,
如果在该方法和内部类中都没有定义过这个变量,内部类中对this的引用会被传递给那个外部类对象的引用。
类中定义的内部类特点:
1、内部类可以直接访问外部类的成员,反之则不行。
2、内部类可以声明为private或protected。
3、内部类成员只有在内部类的范围之类是有效的。
private内部类调用方式: 在外部类的方法中实例化内部类,并调用自己的方法 实例化外部类,并调用包含内部类的方法。
static内部类,特点:
定义格式 修饰符 static class name{ }
static内部类可以象一个普通外部类一样直接创建该对象。
static内部类只能访问外部类中的静态成员或方法。
static内部类可以声明static成员,但非static的内部类不可以。 修饰符没有任何限制。
1、Inner为静态内部类。 2、Inner不能访问names属 性和PrintName()方法。 3、在外部类中可以直接创建 该类的对象。
public class StaticInnerDemo { String name = "Tom"; void PrintName(){ System.out.println(" Outer name : "+name); } public static class Inner{ int age = 10; void PrintAge(){ System.out.println(" inner age : "+age); } } public static void main(String[ ] args) Inner inner = new Inner(); inner.PrintAge(); } }
内部类如何被外部类引用;
将内部类声明为非private的就可以通过外部类创建一个内部类的对象引用,并可通过该引用调用内部类自己定义的方法。
声明调用方法:
OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass ();
方法和作用域中的内部类:
内部类并非只能在类里定义,也可以在几个程序块的范围之内定义内部类。
特点: 可访问外部类的成员变量。 只能访问所在方法中的final类型的局部变量,因为用final定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期。
该类型的内部类调用方法:
//直接通过外部类来调用内部类所在的方法。 OuterClass.innerOfOuterMethod( );
public class InOut { String str = new String("Between"); public void amethod(final int iArgs) { fianl int a = 12; class Bicycle { public void sayHello() { System.out.println(str); System.out.println(a); System.out.println(iArgs); } } Bicycle bicycle = new Bicycle(); bicycle.sayHello(); } }
1、str为外部类的成员变量。 2、iArgs和 a都是方法amethod 的局部final变量。