JavaSE学习Day05

形式参数与返回值:

          形式参数的类型:1)基本类型:使用时没有什么区别,只要形参是什么类型就给它传什么类型的数据即可;

                                       2)引用类型:String特殊的引用类型,使用时与基本类型一致

                                                               (1)具体类:需要创建具体类的对象进行传值;

                                                               (2)抽象类:需要创建该抽象类的子类对象(抽象类多态,使用匿名内部类)

                                                               (3)接口类:需要创建该接口的子实现类(接口类多态,使用匿名内部类)

         返回值的类型:1)基本类型:需要返回什么数据类型就给返回什么数据类型;

                                  2)引用类型:(1)具体类:返回该具体类的对象;

                                                          (2)抽象类:返回该抽象类的子类对象;

                                                          (3)接口类:返回该接口的子实现类对象;

        

扫描二维码关注公众号,回复: 2305256 查看本文章

 内部类:在一个类(A)的内部定义另一个类(B),则B就是A的内部类

                   例:class A {

                                  private int num =  10;

                                  class  B {

                                     System.out.println(num);

                                 }

                          }

  内部类的访问特点:1)内部类可以访问外部类的成员,包括私有成员都可以访问;

                                  2)外部类想要访问内部类的成员时,需要创建内部类对象来访问内部类成员;

  内部类按所在的位置分类:

    1)成员内部类:存在于外部类的成员位置上;

             class A {

                                  private int num =  10;

                                (static) class  B {

                                     System.out.println(num);

                                 }

                          }

                        外部类访问成员内部类时创建对象的方法:

                                          (1)非静态内部类:外部类名 . 内部类名   对象名  =  new  外部类名().  new 内部类名();

                                                     例:A.B  ab =  new  A() . new B();

                                            (2)  静态内部类:外部类名 . 内部类名   对象名  =  new  外部类名 .  内部类名();

                                                                        外部类名.内部类名.(内部类)成员变量 / 方法

                                                     例: A.B  ab =  new  A.B (); 

                      成员内部类的修饰符:

                                  private 修饰:为了保证数据的安全性,只能通过在外部类的方法里创建内部类的对象进行访问;

                                  static   修饰:方便调用;可以通过 外部类名.内部类名. 成员变量/方法 直接调用

     2)局部内部类:存在于方法内的类;可直接访问外部类的成员,包括私有;

                例: 

             class A {

                                  private int num =  10;

                                  public void method(){

                                          final  int num2 = 20;  //JDK1.8以前必须使用 final 修饰,否则报错;

                                          class  B {

                                                   System.out.println(num);

                                                   System.out.println(num2);

                                          }

                                 }

                          }

    ***** 面试题:为什么要用 final 修饰局部变量?

          答:  局部内部类想要访问局部变量时,局部变量必须使用 final 修饰;

                   因为局部变量是随着方法的调用而存在的,随着方法的调用完毕而消失的,

                   而内部类对象在使用后却不会立即消被GC回收掉,

                   这时就会出现当方法调用完毕后,当局部内部类还需要访问该局部变量,所以程序就会报错,

                   所以这时就需要将局部变量变成常驻内存的变量(常量),所以用 final 修饰;

匿名内部类:顾名思义即没有名字的内部类;

         匿名内部类存在的前提:必须存在一个类 或者 接口

  格式:

              new  类名 / 接口名{

                      重写 类 或 接口中的方法;

                      。。。

              };逗号结尾

       

 *********匿名内部类面试题:
        按照要求,补齐代码
            interface Inter { 
                void show();
             }

            
            class Outer { 
                //补齐代码 

                Outer.method().show();

                // 分析 1)Outer.method() 外部类名可直接调用,说明该方法被 static 修饰;

                           2)Outer.method() 调用 method()后还能调用show()方法,说明返回的是一个对象(接口);

                         3)返回的是一个接口类型,实际返回的是的该接口的子实现类对象,根据题目要求应该采用匿名内部类来实现;

                  public static Inter method(){

                        return new Inter{

                             @override

                             public void show(){

                                     System.out.println(" Hello  World");

                            }

                       }

                 }
            }
            class OuterDemo {
                public static void main(String[] args) {
                      Outer.method().show();
                  }
            }
            要求在控制台输出”HelloWorld”

**********面试题:
          控制台分包输出30,20,10

注意: 内部类与外部类之间没有继承关系!(无法用 super

外部类访问本类成员变量
            方式1:     外部类对象(匿名对象的方式).成员变量名称;
            方式2:     外部类的this限定:Outer8.this.num:可以访问外部类的成员变量(推荐使用)

class Outer{
    
    private int num = 10 ;
    
    //成员内部类
    class Inner{
        //内部类的成员变量
        int num = 20 ;
        public void show() {
            //局部变量
            int num = 30 ;
            //补全代码
             System.out.println(num);
             System.out.println(this.num); //访问当前类对象的成员变量
          // System.out.println(new Outer8().num);
            
            //外部类限定this
            System.out.println(Outer.this.num);

        }
    }
}

public class OuterTest2 {
    public static void main(String[] args) {
        //补全代码
        //外部类名.内部类名 对象名 = 外部类对象.内部类对象;
        Outer.Inner oi = new Outer().new Inner() ;
        oi.show();

    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_42371269/article/details/81148889