天天看点

Java学习日记day12

Java学习日记day11

内部类:

     一个类中存在另一个类

内部类的分类:

     成员内部类(非静态内部类) 静态内部类 局部内部类(匿名内部类)

       内部类的成员方法中调用同名外部类的成员变量:外部类.this.变量名

                         调用同名内部类的成员变量:this.变量名

                             调用方法内的局部变量:直接变量名

成员内部类特点:

可以使用的内部修饰符:public private protected default

1. 内部类中,可以随意调用外部类成员

      2. 外部类中,使用内部类成员是,需要创建内部类对象

      3. 无关类中使用成员内部类

                 A.间接调用 在外部类中的方法创建类的对象

                 b.  直接调用 创建内部类对象

局部内部类[匿名内部类]

    局部变量:

  1. 在方法内部定义的类,只在方法中有效
  2. 在局部内部类中,使用局部变量,必须是final修饰的
  3. 一次性的类,只能使用一次
  4. 没有访问修饰符
  5. 作用:结合抽象类/接口使用

[*匿名内部类]

   作用:实现接口/继承抽象类

    缺点:一次性使用

    语法: 接口/抽象类 引用名 = new 接口/抽象类(){实现类实现的抽象方法}

    Lambda表达式:特殊用法,需要一个只有一个抽象方法的接口

        用法:定义一个参数为接口的方法 调用这个方法 例如:

        接口:public interface InterfaceA {

   void doSomething();

}
           
    方法 :public void lambda(InterfaceA Interface){

    Interface.doSomething();

}
           
具体实现
           
lambda(()->{System.out.println("use lambda do something!!!!");});
           

匿名对象: 

    只能使用一次,只能调用一次方法(可以在所有类的范围内适用)

静态内部类

     静态内部类不能调用非静态的成员变量和方法

复习:

面向对象

       类和对象

              类

                     类是抽象的,不真实存在

                     类的结构:class 类名{成员变量,成员方法,构造方法,静态变量,静态方法,代码块,静态代码块}

                     类的特点:具有相同的属性和方法

              对象

                     对象是真实存在的,是类的实例化

                     创建对象:对象都是通过new创建出来的

                            类名  对象名 = new 类名();

                     使用对象

                            使用变量 :  对象.属性

                            使用方法 :  对象.方法名()

              类和对象的关系

                     1.先定义/声明类     ps: class  Student{   }

                     2.再创建类的对象 ->  main方法中创建    ps: Student  stu = new Student

              变量

                     局部变量

                            声明位置

                                   形参(方法参数中定义的变量)

                                   方法中

                                   代码块中

                            初始化

                                   使用前必须初始化,否则通不过编译,局部变量没有默认初始值

                            个数

                                   声明个数

                            JVM内存图中位置:存在栈内存中

                            注意:局部变量不能加static,包括protected, private, public这些也不能加。局部变量保存在栈中。

局部编程必须在声明时初始化。

                     成员变量

                            实例变量

                                   声明位置:类中

                                   初始化

                                          声明同时初始化

                                          代码块中初始化

                                          构造方法中初始化

                                   个数:由对象决定,有几个对象就有几个成员变量

                                   JVM内存图中位置:存在于堆内存中

                            静态变量

                                   声明位置:类中

                                   初始化

                                          在声明同时初始化

                                          静态代码块中初始化

                                   个数

                                          只有1个

                                   JVM内存图中位置:存在于方法区中

                            实例变量的静态变量的区别

                                   语法上

                                          静态变量:前面要加static关键词

                                          实例变量:不用加

                                   程序上

                                          静态变量:属于类,只要进行了类加载,就会分配空间并使用

                                          实例变量:属于对象,必须创建对象,才会分配空间,才能使用这个实例变量

              代码块

                     静态代码块

                            结构:  static {   }

                            位置:存在类中

                            执行时机:在虚拟机加载类的时候就会进行加载,并且只执行一次

                            作用:有些代码需要在项目启动时就执行的,就需要使用静态代码块

                            比如一个项目启动需要加载很多配置文件等资源,就可以都放在静态代码块中。

                     代码块

                            结构:   {     }

                            位置:存在类中

                            执行时机:在创建对象的时候执行,每次创建对象都会执行一次

                            作用:提取构造方法中相同部分,并且初始化成员变量,会在构造方法之前执行

              构造方法

                     作用

                            给成员变量初始化

                     语法:修饰符  没有返回值类型   类名(参数){  }

                            无参数是无参构造器

                            有参数是有参构造器

                     使用

                            1.对象创建时调用相对应的构造方法

                            2.默认调用无参构造器

                            3.如果指定添加有参构造器,无参构造器就不添加

                            4.建议:什么情况下都建议手动添加无参构造器,方便调用

                     构造方法和普通方法的区别

                            执行时间不同

                                   构造方法:对象创建时调用相对应的构造构造方法

                                   2.普通方法:只有被调用时才会执行

              方法

                     普通成员方法

                            语法上:没有static修饰的方法

                            位置:存在于类中

                            方法的调用:  对象.成员方法

                     静态成员方法

                            语法上:有static修饰的方法

                            位置:存在于类中

                            方法的调用: 类.静态方法

                     注意

                            1.静态方法只能访问静态成员(即静态成员变量和静态方法)

                            2.普通方法可以访问静态成员,也可以访问其它普通方法

       继承

              继承的概念

                     继承就是⼦类继承⽗类的属性和⾏为,使得⼦类对象具有与⽗类相同的属性、相同的⾏为。

              继承的特点

                     1.子类拥有父类中非private的属性和方法

                     2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩充

                     3.java中的继承只能单继承,即子类只能有一个父类

                     4.父类可以有多个子类,并且子类之间没有直接联系

                     5.子类可以用自己的方式实现父类方法 - 重写

              继承的关键字

                     extends  和 implements 继承类 和实现接口

                     super 和 this 关键字

                            this

                                   指当前对象

                                   1.this可以调用自己的成员变量,也可以调用自己的成员方法

                                   2.this可以调用自己的构造方法,this关键词不能省,调用时只能放在构造方法的第一行,并且不能同时互相调用

                            super

                                   对父类对象的引用 - (在对象内部使用)

                                   1.子类构造方法中一定都会先默认调用父类的无参构造器,使用super关键词调用

                                   2.super()只能放在构造方法中的第一行

                     final关键词

                            final:表示最终的,不可被改变的

                            final修饰的特点

                                   1.final修饰的类,不能被继承

                                   2.final修饰的方法,不能被覆盖

                                   3.final修饰的变量,不能被修改 - 变量的值只能赋一次值,即变为常量

              继承中的构造器

                     1.子类不能继承父类中的构造方法

                     2.子类会默认调用父类的无参构造器

                     3.如果父类中只有,有参构造器,则需要在子类构造器中手动调用父类的有参构造器

              方法的重写和方法的重载

                     方法的重写

                            重写的规则

                                   1.子类中定义的方法, 方法返回值类型\方法名\参数列表都和父类中定义的方法完全一致

                                   2.子类重写方法的访问权限不能比父类中被重写方法的访问权限低

                                   3.声明为final的方法不能被重写

                                   4.构造方法不能被重写

                                   5.存在父类和子类中,子类重写父类中相同的方法

                     方法的重载

                            重载的规则

                                   1.重载的只跟方法名和方法参数有关(参数:个数/顺序/类型)

                                   2.重载跟返回值类型无关

                                   3.存在同一个类中

       封装

              概念

                     1.封装戏就是把属性私有化,不让外部可以访问

                     2.给外部提供一个公开的方法:get/set方法

              访问修饰符

                     public

                            全部可见

                     protected

                            同一个包下,子类,本类

                     default

                            只能在本类和同一个包中可以见

                     private

                            本类可见

       多态

              存在的必要条件

                     1.必须有继承关系存在

                     2.方法重写

                     3.父类引用指向子类对象(向上造型)

                            例如:   Animal    an    =    new   Dog();

              多态的转型

                     向上转型

                            ps:   Animal    an    =    new   Dog();

                            父类型的引用  指向  子类型的对象

                            注意:只可以调用父类中所声明的属性和方法

                     向下转型

                            ps: Dog d = (Dog)an; ->通过父类实例化子类

                            注意:只有转换回子类真实类型,才能调用子类独有的属性和方法

                            instanceof关键词

                                   作用:防止发生类型转换异常(ClassCastException)

                                   用法:   if(对象  instanceof  类型){   }

                                   返回结果:boolean类型

              成员访问特点

                     成员变量:编译看左边,运行看左边

                     成员方法:编译看左边,运行看右边

                     静态方法:编译看左边,运行看左边

       抽象

              抽象类

                     abstract修饰

                            类

                                   抽象类,不具体的类(没有包含足够的信息来描绘一个具体的对象)

                                   特征

                                          1.抽象类不能被实例化,也就是不能new对象,只能被继承

                                          2.含有抽象方法的类,一定是抽象类。反之,抽象类中可以没有抽象方法

                                          3.抽象类可以包含属性、方法、构造方法,但构造方法不能用来实例化对象,只能被子类调用。

                            方法

                                   抽象方法

                                          特征

                                                 1.只有方法声明没有方法体

                                                 2.抽象方法必须存在抽象类中

                                                 3.子类重写父类时,必须重写父类中所有的抽象方法

                                                 4.使用抽象方法时不能使用private修饰,因为抽象方法必须被子类重写,如果使用了private声明,则子类无法重写

                                                 5.abstract只能用于修饰普通方法,不能用于static方法或构造方法中

                            变量 -> 没有意义

              接口(interface)

                     定义:接口是一种特殊的抽象类

                     特点

                            1.接口中包含

                                   变量

                                          变量名前面默认添加:public  static final ->静态常量

                                          声明的同时初始化

                                   方法

                                          抽象方法

                                                 没有方法体的方法

                                                 方法前面默认添加:public abstract

                                                 作用:供子类重写

                                          静态方法

                                                 有方法体的方法

                                                 使用static修饰,供接口直接调用

                                          默认方法

                                                 有方法体的方法

                                                 使用default修饰,不可省略,供子类调用或子类重写

                                                 改成默认方法后可以选择重写与否

                                                 default修饰方法只能在接口中使用,标记为普通方法

                                          私有方法

                                                 有方法体的方法

                                                 使用private修饰,供接口中的默认方法或静态方法调用

                                                        静态私有

                                                               private  static 修饰

                                                        普通私有

                                                               private 修饰

                            2.接口没有构造方法,不能被实例化

                            3.接口支持多继承,但接口只能继承接口,不能继承类

                            4.一个类可以同时实现多个接口,使用时必须实现接口中的所有抽象方法,否则该类必须被定义为抽象类

       内部类

              作用:间接解决java中类不能多继承的问题

              种类

                     成员内部类

                            1.作为成员存在,可以被权限修饰符修饰

                            2.可以调用外部所有信息

                            3.可以和外部类属性/方法重名,                                 调用时:外部类名。this。属性/方法

                     静态内部类

                            1.作为静态成员属性存在,可以被任意权限修饰符修饰

                            2.可以直接调用外部类static相关的属性和方法

                            3.访问外部类普通属性和方法,则需要通过new外部类去访问

                     局部内部类

                            1.存在方法之中,只能在方法中使用,类前不能有访问权限

                            2.局部内部类只在当前方法中有效

                            3.不能定义static成员,因为在方法结束后,内存需要释放

                            4.局部内部类中可以访问外部类的所有成员

                            2.可以直接访问方法的局部变量,但无法修改,编译会出错

                     匿名内部类

                            1.作用:继承抽象类/实现接口

                            2.没有类名的内部类,必须在创建时使用new语句来声明类

                            ps:Outer  o = new Outer(){  重写 }

                            3.匿名类和局部内部类一样,存在方法中,可以访问外部类的所有成员。

                            4.匿名类中允许使用非静态代码块进行成员初始化操作

                            5.匿名类的非静态代码块会在父类的构造方法之后被执行