四种访问权限符 和 内部类

四种访问权限符

概述

在Java当中提供了四种权限修饰符,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限
类的修饰符只有 public , abstract,final 关键字所修饰,其他关键字修饰是非法的,不可以的.

  • 权限:指代作用范围
    public < protected < (default) < private

  • 同一个类

  • 同一个包

  • 不同包的子类

  • 不同包的非子类

备注:颜色可以代表访问修饰符,实心和空心代表成员方法和成员变量

  • 黄色:protected 受保护的
  • 绿色: public 公共的
  • 蓝色:(default) 默认的
  • 红色: private 私有的

编写代码建议使用:
成员变量:建议使用 private ,隐藏细节
构造方法: 建议使用 public ,便于调用
成员方法: 建议使用 public ,便于调用

1 public protected (default) private
同一个类 yes yes yes yes
同一个包 yes yes yes no
不同包的子类 yes yes no no
不同包的非子类 yes no no no

注意事项:(default)并不是关键字,可以默认不写.

  • 一个类文件里只能有一个public修饰的类,但可以包含其他类,而且.java源文件的名称也是这个被public修饰的类名,但是一个类的内部可以用public修饰符,充当成员信息

内部类

理解内部类:

如果一个事物的内部又同时包含另外一个事物,那么这就是一个类的内部包含了另一个类
例如: 身体里的心脏,身体和心脏的关系是"has-a"的关系

内部类的优点:

  1. 内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
  2. 内部类是另外一种封装,对外部的其他类隐藏。
  3. 内部类可以实现java的单继承局限。

内部类缺点

结构复杂,不易理解

创建内部类

在外部类的外部,想要使用非静态内部类,创建格式

语法: 外部类.内部类 内部类对象 = new 外部类().new 内部类();
举例: Outer.Inner in = new Outer().new Inner();

在外部类的外部,想要使用静态内部类,创建格式

语法: 外部类.内部类 内部类对象 = new 外部类.内部类();
举例: Outer.Inner in = new Outer.Inner();

对内部类的分类

  1. 成员内部类
  2. 静态内部类
  3. 方法内部类
  4. 匿名内部类

成员内部类

成员内部类:定义在类中方法外的内部类,在外部类的成员信息位置,与外部类的对象有关

格式:
修饰符 class 外部类名称{
      修饰符 class 内部类名称{
      
      //......
      }
//......
}
代码演示:外部类的成员方法获得成员内部类的成员方法,并执行
//定义一个身体类
//外部类
public class Body{
      //成员内部类
      public class Heart{
            //成员内部类的普通方法
            public void beat(){
                  System.out.println("这是内部类的方法.");
                  System.out.println("心脏在跳动,砰砰砰");
            }
      }
      //外部类的普通方法
      public void methodBody(){
            System.out.println("这是外部类的方法...");
            //在外部类的方法里访问内部类的普通方法
            //创建内部类的对象,利用对象调用
           // Heart heart = new Heart();
           // heart.beat();
            //或者采用匿名对象的方式访问内部类的普通方法
            new Heart().beat();

      }
      public static void main(String[] args){
            Body body = new Body();
            body.methodBody();
      
      }
}

运行结果:

  • 代码演示:使用内部类完成多继承
//定义类A
class A{
	private String name = "A类的私有域";
	//提供get方法
	public String getName() {
		return name;
		
	}
}
//定义类B
class B{
	//定义类B的私有属性
	private int age = 20;
	//提供get方法
	public int getAge() {
		return age;
	}
}
//定义外部类
class Outter{
	//定义内部类
	private class InnerClassA extends A{
		//内部类A的成员方法name()
		public String name() {
			return super.getName();
		}
	}
	private class InnerClassB extends B{
		//内部类B的成员方法age()
		public int age() {
			return super.getAge();
		}
	}
	
	//定义外部类的普通方法
	public String name() {
		return new InnerClassA().name();
		
	}
	public int age() {
		return new  InnerClassB().age();
	}
}


//测试类
public class Test2 {
	public static void main(String[] args) {
		//创建外部类对象
		Outter outter = new Outter();
		System.out.println(outter.name());
		System.out.println(outter.age());
	}

}

匿名内部类

匿名内部类
  匿名内部类就是一个没有名字的方法内部类,因此特点和方法与方法内部类完全一致,除此之外,还有自己的特点:
1.匿名内部类必须继承一个抽象类或者实现一个接口。
2.匿名内部类没有类名,因此没有构造方法。

代码演示
//匿名内部类

//声明一个接口
interface MyInterface {
  //接口中方法没有方法体,抽象方法
  void test();
}

//外部类
class Outer{
  private int num = 5;
  public void dispaly(int temp)
  {
      //匿名内部类,匿名的实现了MyInterface接口
      //隐藏class类声明,没有类名,不能有构造方法
      new MyInterface()
      {
          public void test()
          {
              System.out.println("匿名实现MyInterface接口");
              System.out.println(temp);
          }
      }.test();
  }
}
public class Test3{
  public static void main(String[] args)
  {
      Outer out = new Outer();
      out.dispaly(3);
  }
}

注意事项:外部类的方法访问内部类的方法,直接在外部类的方法里创建内部类的对象,然后通过对象调用.也可以通过匿名对象调用

类的权限修饰符:

  1. 外部类:public
  2. 成员内部类: 都可以使用
  3. 局部内部类: 都可以使用
posted @ 2020-11-30 09:57  任苗苗  阅读(628)  评论(0)    收藏  举报