1:内部类(理解)

   (1)把类定义在一个类的内部。

  (2)特点:

      A:内部类可以直接使用外部类的成员,包括私有。

      B:外部类要使用内部类成员,必须创建对象使用。

       例子:

public class InnerClassTest {public static void main(String[] args) {OuterClass.InnerClass inner=new OuterClass().new InnerClass();//创建内部类对象inner.innerMethod(); //外部类要使用内部类成员,必须创建对象使用
    }
}class OuterClass{//成员变量private int age=10;//构造方法public OuterClass(){}//成员内部类class InnerClass{public void innerMethod(){System.out.println("我是成员内部类,访问外部类的私有属性age:"+age);//内部类可以直接使用外部类的成员,包括私有。
       }}
}

View Code

   (3)内部类的分类:

    局部内部类:定义在方法中的内部类

    成员内部类:定义在类中方法外的内部类

    (4)成员内部类

     class Outer {

     class Inner {  //成员内部类

    }

     }

  普通的修饰的时候:

  外部类名.内部类名 变量 = 外部类对象.内部类对象;

  Outer.Inner oi = new Outer().new Inner();

   class Outer {

    static class Inner {

     void method(){}

    }

   }

   用静态修饰内部类时:

     外部类名.内部类名 变量 = 外部类名.内部类对象

     Outer.Inner oi = new Outer.Inner();

    Outer.Inner oi = Outer.new Inner(); //错误

   用静态修饰内部类和方法时:

     Outer.Inner.method()

   成员内部类:

   private:为了数据的安全。可以加数据校验

  static:为了方便调用。

  例子:

/*成员内部类:内部类定义在成员位置内部类对象创建:Outer.Inner x = new Outer().new Inner();
*/
class Demo8
{public static void main(String[] args) {//Inner inner = new Inner();   //内部类对象不可以直接这样创建//System.out.println(new Outer().age); //调用错误
Outer out = new Outer();Outer.Inner inner = out.new Inner(); //创建内部类对象的方式1Outer.Inner inner2 = new Outer().new Inner();//创建内部类的对象的方式2
        inner.innerMethod();inner2.innerMethod();}
}class Outer
{//成员属性private int age;//成员内部类class Inner{public void innerMethod(){System.out.println("我是内部类的方法,外部类age的值为"+age); //可以直接访问外部私有属性
        }}//成员方法public void outerMethod(){Inner inner = new Inner(); //创建成员内部类对象,调用成员内部类方法
        inner.innerMethod();}
}

View Code

/*private与static修饰符的成员内部类private:外界无法直接创建内部类对象,外部类可以创建内部类对象,在此之前可以加入校验。static: 修饰内部类,不需要使用外部类对象,外部类名直接调用,修饰内部类成员,不需要内部类对象,使用内部类名直接调用。
*/
class Demo9
{public static void main(String[] args) {/*private-----------------------------------------------------------------------//当使用private修饰成员内部类,则不能使用以下两种方法创建对象//Outer out = new Outer();//Outer.Inner2 inner = out.new Inner2(); //方式1//Outer.Inner2 inner = new Outer().new Inner2();//方式2//可以在外部类的方法中创建内部类对象,可以增加数据校验,保证安全性out.outerMethod();*///static---------------------------------------------------------------------//当使用static修饰成员内部类,可以直接使用外部类名new Outer.innerMethod()的形式创建内部类对象Outer.Inner inner= new Outer.Inner();inner.innerMethod();//当使用static修饰成员内部类,同时成员内部类的方法也用static修饰时,可以直接使用外部类.内部类.方法的形式,调用内部类的方法!
        Outer.Inner.innerStaticMethod();}
}class Outer
{private static int age;static class Inner{public void innerMethod(){System.out.println("我是内部类的方法,外部类age的值为"+age);}public static void innerStaticMethod(){System.out.println("我是内部类的方法,外部类age的值为"+age);}}public void outerMethod(){//数据校验Inner inner = new Inner();inner.innerMethod();}
}class Outer2
{private int age2;private class Inner2{public void innerMethod2(){System.out.println("我是内部类的方法,外部类age的值为"+age2);}}public void outerMethod2(){//数据校验Inner inner2 = new Inner2();inner2.innerMethod2();}
}

View Code

  (5)局部内部类

    A:带名字的局部内部类

        class Outer {          //外部类

            public void method() { //成员方法

              final int a = 10;

              class Inner {  //成员内部类

                public void show() {   //成员内部类的方法

                     System.out.println("show");

                       System.out.println(a);

                   }

                       }

              Inner i = new Inner(); //在成员内部类里面创建对象并使用!

              i.show();

           }

            }

    B:匿名内部类(掌握)

     a:没有名字的内部类。其本质是一个对象。是通过多态来实现的。

      b:前提:存在一个抽象类或者接口。

      c:格式:

     new 抽象类或者接口() {

       重写父类方法;

      };

   本质:是一个继承了类或者实现了接口的子类匿名对象。

        例子:

/*匿名内部类:在通过简写形式定义一个没有类名的类。匿名内部类即将匿名定义类与创建对象的动作一起完成。    必须要有实现或者继承关系。格式:new 类名或者接口名(){覆盖类或者接口中的代码,(也可以自定义内容。)};  //注意使用的是父类或者接口*/
class Demo11
{public static void main(String[] args) {Demo12 demo12 = new Demo12();demo12.outerMethod();}}abstract class Animal
{public abstract void eat();
}interface MyInterface
{public abstract void method();public abstract void method2();
}class Demo12
{public void outerMethod(){class Cat extends Animal  //内部类
        {public void eat(){System.out.println("舔着吃!");}}Animal cat = new Cat();cat.eat();System.out.println("============================");Animal anyAnimal = new Animal(){ //没有类名,有对象名public void eat(){System.out.println("舔着吃!");}public void method(){System.out.println("我是匿名内部类对象的方法");}};anyAnimal.eat();//anyAnimal.method();new Animal(){public void eat(){System.out.println("舔着吃!");}}.eat();//===============================以上为抽象类的内部类,以下为接口的内部类System.out.println("============================");class MyClass implements MyInterface{public void method() {System.out.println("我是内部类方法1");}public void method2() {System.out.println("我是内部类方法2");}}MyInterface mi = new MyClass();//有类名MyClass,有对象名mi
        mi.method();mi.method2();MyInterface mi2 = new MyInterface(){//没有类名,有对象名mi2public void method() {System.out.println("我是匿名内部类方法1");}public void method2() {System.out.println("我是匿名内部类方法2");}};mi2.method();mi2.method2();new MyInterface(){    //没有类名,没有对象名,即匿名对象public void method() {System.out.println("我是匿名内部类方法1");}public void method2() {System.out.println("我是匿名内部类方法2");}}.method();new MyInterface(){ //没有类名,没有对象名,即匿名对象public void method() {System.out.println("我是匿名内部类方法1");}public void method2() {System.out.println("我是匿名内部类方法2");}}.method2();}
}

View Code

      d.匿名内部类的使用场景 :

          :内部类效率更高。

          :通常在使用接口类型参数的方法上,并该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。

          :增强阅读性。

例子:

package package3;/*使用匿名内部类的场景:1:提高效率2:当参数类型,返回值类型,成员变量类型为抽象类或者接口时,可以使用匿名内部类。3:增强阅读性*/
class Demo13
{public static void main(String[] args){//-----------------普通方式调用  ---------------------Demo13 demo13 = new Demo13();MyClass mc = new MyClass();demo13.method(mc);//-----------------创建匿名内部类---------------------demo13.method(new MyInerface(){public void method() {System.out.println("匿名对象匿名内部类方法一");}public void method2() {System.out.println("匿名对象匿名内部类方法二");}});MyAbsClass mac = demo13.method2();mac.eat();mac.sleep();mac.hitBeanBean();}//参数类型为接口的方法public void method(MyInerface mi) {mi.method();mi.method2();}//返回值类型为抽象类的方法public MyAbsClass method2() {// 方式1:有类名MyClass2、有对象名mac/* MyAbsClass mac = new MyClass2();return mac;*///方式2:没有类名,有对象名mac/*MyAbsClass mac = new MyAbsClass(){public void eat() {System.out.println("匿名内部类中:学完匿名内部类,就吃不下去了!");}public void sleep(){System.out.println("匿名内部类中:学完匿名内部类,就睡不着了!");}};return mac;*///方式3:没有类名,没有对象名return new MyAbsClass(){      //匿名内部类public void eat() {System.out.println("匿名内部类中:学完匿名内部类,就吃不下去了!");}public void sleep(){System.out.println("匿名内部类中:学完匿名内部类,就睡不着了!");}};}
}//---------------------------接口--------------------------------------
interface MyInerface
{public abstract void method();public abstract void method2();
}class MyClass implements MyInerface
{public void method() {System.out.println("方法一");}public void method2() {System.out.println("方法二");}
}//---------------------------抽象类--------------------------------------abstract class MyAbsClass
{public abstract void eat();public abstract void sleep();public void hitBeanBean(){System.out.println("学完匿名内部类,就开始打豆豆!");}
}//---------------------------非抽象类--------------------------------------
class MyClass2 extends MyAbsClass
{public void eat() {System.out.println("学完匿名内部类,就吃不下去了!");}public void sleep(){System.out.println("学完匿名内部类,就睡不着了!");}
}

View Code

(6)例子:定义并使用内部类。要求包含局部内部类,成员内部类,匿名内部类。

/*** 定义并使用内部类。要求包含局部内部类,成员内部类,匿名内部类。*/
public class Main {public static void main(String[] args) {//调用成员内部类Fu.Zi zi= new Fu().new Zi();zi.sleep();//调用局部内部类Fu fu=new Fu();fu.eat();//调用匿名内部类
        fu.method().eatType();}
}

View Code

/*** 定义并使用内部类。要求包含局部内部类,成员内部类,匿名内部类。*/
public class Fu {//成员变量String string = "巴马";//成员内部类public class Zi {public void sleep() {System.out.println("睡觉");}}//局部内部类public void eat() {class EatMeat extends EatType {      //局部内部类,必须要继承抽像类或者继承接口public void eatType() {System.out.println("吃肉");}}EatMeat eatMeat = new EatMeat();eatMeat.eatType();}//匿名内部类public EatType method() {  //返回值类型或者参数类型为抽象类或者接口/*EatType type= new EatType(){public void eatType(){System.out.println("吃鱼");}};return type;*/return new EatType(){public void eatType(){System.out.println("吃鱼");}};}}

View Code

public abstract class EatType {public abstract void eatType();
}

View Code

(7)匿名内部类面试题

/*匿名内部类练习:Outer.method.show();    意思为Outer类的静态成员变量method可以调用一个show方法,可以调用show方法的一定是Inter接口的子类实例Outer.method().show();  意思为Outer类的静态成员方法method()的返回值可以调用一个show方法,可以调用show方法的一定是Inter接口的子类实例
*/interface Inter{void show();
}//题目1:
class Outer{//补齐代码public static Inter method() {//方式1/* Inter inter = new Inter(){public void show(){System.out.println("hello world");}};return inter;*///方式2return new Inter(){public void show(){System.out.println("hello world");}};}
}class innerClassTest{public static void main(String[] args){Outer.method().show();}
}//题目2:
/*
class Outer{//补齐代码public static Inter method = new Inter(){public void show(){System.out.println("hello world");}};
}
class innerClassTest{public static void main(String[] args){Outer.method.show();}
}
*/

View Code

2:包(掌握)

  (1)包就是永远区分相同类在不同文件夹下。其本质就是一个文件夹。

  (2)包的作用:让相同类名的类可以存在。为了组织代码。cn.itcast.action   cn.itcast.service  cn.itcast.db

  (3)定义包:

      package 包名.包名...;

    (4)带包的编译和运行(理解)

      A:方式一

     手动式

       a:javac编译代码

      b:手动建立包,把class扔进去

         c:java执行,带全路径

     B:方式二

    自动式

       a:通过javac编译自动生成包

         javac -d . 文件名

       b:通过java运行class文件

      java 包名.包名.class文件名不带扩展名

    (5)不同包下的类之间的访问。

      权限够大才行。

    以后,我们所有定义的类都用public修饰。

  (6)面试题:

     在同一个java文件中,可不可以有多个类?可以。

       而我们知道类是可以用public修饰的,那么,可不可以多个类都用public修饰?不可以。

      并且,一般的时候,如果有main方法也存在的时候,都是public修饰带main那个类。

     文件名必须和该public修饰的类名一致。

  (7)实际运行的时候,是要求Class文件在一个文件加下,可以直接调用,如果不在一个文件夹下,导包也是为了导入Class文件。

3:导包(掌握)

   (1)如果多次使用一个多级包的类,每次带全路径太麻烦,我们就考虑使用导包。

  (2)导包的格式:

      import 包名.包名...;

   注意:

   在同一个包下如果有多个类被使用,可以使用通配符*来导入,但是不建议。

   推荐:使用谁导入谁。

(3)面试题:

package,import,class出现的位置?

package > import > class

4:权限修饰符(掌握)

  (1)用于保证在不同的情况下可以使用

   (2)使用如下

    本类     同一个包下   不同包下的子类   不同包下的无关类

   private    Y

   默认       Y       Y

   protected  Y      Y             Y

  public     Y       Y              Y              Y

    常见的组合规则:

    权限修饰符+abstract/final/static+...

    我们到底怎么用(开发的时候一般都这么做):

      类:

      public class Demo {       }

   成员变量:

     变量:private String name;  加上相应的getter和setter

    常量:public static final int X = 10;

  构造方法:

    不让外界创建:private Demo(){}

    大部分:public Demo(){}

  成员方法:

     不让外界用:private void show(){}

    大部分:public void method(){}

    抽象方法:public abstract void function();

转载于:https://www.cnblogs.com/hezhiyao/p/7504464.html

匿名类、包、权限修饰符_DAY10相关推荐

  1. 包 权限修饰符 final 常量 枚举 抽象类 接口 多态 内部类 常用API 正则表达式 Lambda

    包 什么是包? 包是用来分门别类的管理各种不同类的,类似于文件夹.建包利于程序的管理和维护. 建包的语法格式:package 公司域名倒写.技术名称.报名建议全部英文小写,且具备意义. package ...

  2. 学习Java的第五天 | 定义方法 | 引用数据类型——类 | 访问权限-修饰符 | 全局变量与局部变量 | toString | 构造方法 | 方法重载

    前面提到的,冒泡排序,二分查找,我们有时候写代码可能不止要查到一种数组的数据,这时候我们就很需要想循环那样的结构,来帮我们解决代码冗余的情况. 我们前面使用的main方法,是一个java程序的入口,我 ...

  3. 包package,权限修饰符

    定义包的格式   package 包名; 多级包用.分开即可 注意事项:   package语句必须是程序的第一条可执行的代码   package语句在一个java文件中只能有一个 如果没有packa ...

  4. day12、面向对象进阶(包、权限修饰符、final、常量、枚举、抽象类、接口)

    面向对象进阶(包.权限修饰符.final.常量.枚举.抽象类.接口) 包 权限修饰符 final 常量 常量概述和基本作用 常量做信息标志和分类 枚举 枚举的概述 枚举的使用场景演示 抽象类 抽象类概 ...

  5. 绝密101:import,java,packag的顺序、权限修饰符、类及其组成可用的修饰符

    import,java,packag他们三个直接有没有顺序呢? packag:到达的路径,所在文件的路径,他最终以包的形式结束(他在最前面) import:导入外界你想要使用的类,它最终以你想要结束的 ...

  6. 封装、权限修饰符、javaBean规范、继承中封装、多态、关于上溯造型的解释。

    一.封装 类 .方法.属性这些java中编程所涉及到的元素的访问权限控制 二.权限修饰符 修饰成员 public      protected      default     private 本类中 ...

  7. 面向对象编程(OOP) 权限修饰符

    类的权限修饰符 Java语言中的权限修饰符主要包括private.public和protected,这些修饰符控制着对类和类的成员变量以及成员方法的访问.如果一个类的成员变量或成员方法被修饰为priv ...

  8. java复习第3天---3.1---final关键字、权限修饰符

    java复习第3天---3.1---final关键字.权限修饰符 目录 文章目录 1.final 关键字 1.1.修饰类 1.2.修饰成员方法 1.3.修饰成员变量 1.4.修饰局部变量 2.权限修饰 ...

  9. java 内部类 返回值_Java基础第10天+形式参数和返回值的问题、包、导包、权限修饰符、常见的修饰符、内部类(局部内部类,成员内部类,匿名内部类)...

    1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的 ...

最新文章

  1. python找最大值的函数_Python 获取最大值函数
  2. WorkFlow For Net ! NET 平台工作流 或 BPM
  3. 使用SSL和Spring Security保护Tomcat应用程序的安全
  4. 指向函数的指针 - C语言
  5. AC_Dream 1224 Robbers(贪心)
  6. 关于比较器Comparator排序时间的问题
  7. 通用职责分配软件原则之7-纯虚构原则
  8. oracle 精度异常01438,序列值超过字段精度导致ORA-01438
  9. weblogic11g 密码忘记肿么办?
  10. 190713每日一句
  11. AWVS14.7破解版免费获取
  12. MATLAB求导函数diff(a,b,c)
  13. 微信 服务器参数错误 请重新填写,微信上登录验证出现参数错误怎么解决
  14. 实名认证失败_身份证在国政通进行实名认证失败怎么办?
  15. php 微信小程序签到打卡,微信小程序实现打卡日历功能
  16. jdk9、jdk10、jdk11、jdk12、jdk13新特性
  17. 主线程异常会导致 JVM 退出?
  18. Linux 心路历程
  19. python爬取帅啊网的帅哥美男图片
  20. Facebook多账号运营怎么防关联?

热门文章

  1. crontab/ntpdate——时间同步
  2. 普通卷积armv7-neon指令集实现—XNNPACK
  3. 将 app 打包成 deb 发布安装
  4. 可以在没有main()的情况下编写C程序吗?
  5. muduo学习笔记 日志类
  6. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
  7. python 判断等于0_Python 条件语句介绍
  8. C++之vector容器初学(二)——插入和删除
  9. mysql cluster 读写分离_mysql数据库集群实现高可用读写分离_一点课堂(多岸学院)...
  10. [转]ROS2 源码解析与实践 - Node