(内部类,权限修饰符,多态,抽象类)2020.10.22

内部类

定义:将一个类定义到另一个类的里边,里边的类就称为叫做内部类,内置类。
   将内部类定义在它所属的类中,类中分为成员位置和局部位置,因此
   按照位置划分: 成员内部类局部内部类
   按照内部类是否有类名划分:有名内部类匿名内部类

成员内部类

结构:
   class 外部类名 {
      class 内部类名 {
      }
   }
   将类定义在成员位置上,因此该类可以使用成员修饰符进行修饰。
   成员内部类可以使用成员修饰符来修饰:普通、私有、静态
   普通、私有、局部内部类,类中的成员:非静态成员。因此要访问成员,必须先创建内部类对象。
   普通:直接方式:new Outer().new Inner(); 和间接方式 : 在所属的外部类中创建方法,在方法中,创建内部类对象。
   私有:只能间接方式创建对象,与普通相同。
   局部:在所属的方法中创建对象
   静态:成员可以是静态的也可以是非静态的。
     非静态:需创建对象,方式两种 直接或间接 new Outer.Inner();
     静态: 直接类名访问,需先找到所属的外部类 Outer.Inner.静态名
总结:是否创建对象,取决于类中的成员是否是静态

默认内部类:

类中可以定义的成员有:
          非静态成员、静态常量
类中可以直接访问它所属的外部类中的成员:
          私有、静态的、非私有非静态
在这里插入图片描述
在这里插入图片描述

私有内部类:

使用方式与默认内部类时相同的,只不过在内部类前使用private关键字修饰了,因此
该内部类只能在它所属的外部类中使用,即提供一个方法,在方法中创建内部类对象。
在这里插入图片描述

静态内部类:

就是内部类前使用关键字static修饰了。
在该内部类中:既可以定义静态成员也可以定义非静态成员。
在这里插入图片描述
在这里插入图片描述

局部内部类:

结构:
   class 外部类名 {
     public void 方法名(){
       class 内部类名 {
       }
     }
    }
将内部类定义在局部位置上,即方法中
在这里插入图片描述
总结:
创不创建对象,取决于类中的成员是否是静态。

概念:
 1.用来分类管理类文件(包可以形象化为电脑中的文件夹)
 2.class文件与Java源文件相分离
 3.在不同包中出现同名的类
格式:
  package 包名;
  注意:这条语句在一个Java中文件只能出现1次
     这条语句必须写在有效代码行的最上边
  包名:通常都是小写单词或小写字母。
  规范: 公司域名倒置.项目名.模块名.[子模块]*;
     eg: com.ujiuye.cms.login;
  注意: 一旦定义了package语句,那么类名的完整形式为:包名.类名
  带包编译: javac -d 目录 源文件名.java
  带包执行: java 包名.类名
 当定义了package,类名的完整形式有点长,倒置创建对象时编写也有点长,因此想要简化代码,可以使用import关键字来简化,是一个导包的语句。
 格式:
   import 包名.类名; 推荐 或 import 包名.*;
   位置: 在package 和 class 的中间,可以出现多次。
   创建对象时,可以省略”包名.”。
    注意:在不同包中使用时,同一包中不需要import
   总结:
     package : 告诉编译器,当前类要存储在哪
     import :告诉编译器,当前类中使用的其他类去哪找

访问权限修饰符

指的是类中的成员能被访问的权限。
由小到大: private 默认 protected public

当前类同包下不同包子类(继承)所有
private
默认
protected
public

以后定义成员时,选择合适的修饰符来修饰,控制访问的权限。

多态

面向对象的特征:封装、继承、多态
理解:一个对象具有多种形态。
 站在对象的角度来看,可以使用不同类型的引用变量来指向。
 站在引用变量的角度来看,该引用变量可以指向不同类型的对象。
前提:
  必须有继承或实现。
表现:
  父类型引用指向(接收)它自己的子类对象。
多态形式访问类中的成员方法时(虚拟调用):
  编译时期:要检查引用变量所属的类型中,是否有要调用的方法,有编译通过,否则失败。
  运行时期:运行的是对象类型中的该方法。
  总结:编译看父类,运行看子类。
好处:
  提高了代码的扩展性 ,代表案例方法参数
弊端:
  调用的方法只能是子父类中共有的方法。
应用:
  多态参数、多态数组…
转型问题:

向上转型

(基本类型的自动转换) 父类型引用变量指向子类对象。

向下转型

(基本类型的强制转换) 将父类型引用变量转为子类型引用变量,
  格式:(子类类型)父类型引用变量
在这里插入图片描述
在这里插入图片描述
 以上两行代码编译是没有问题的,但是运行会出现异常。
在这里插入图片描述
 类型转换异常,不能将Animal1 转为 Cat1类型。
总结:做转型时,一直是子类对象的引用变量的类型在改变,一会是父类型引用,一会是自己类型的引用,由始至终对象一直是子类对象。

instanceof

运算符,比较运算符,运算后的结果是boolean类型。
 比较左边的引用变量所指向的对象是否是右边的类型,即判断两边类型是否一致。
 注意:如果判断的类型有父子关系,一定是先判断子类型最后是父类型
    如果是兄弟关系没有顺序了。
在这里插入图片描述

抽象类

也是类,只不过是一个特殊的类,这个类有点强制性的感觉。
由来:
当描述Cat类和Dog类时,发现有共性的方法声明,即eat()方法,将共性内容进行向上抽取,抽取到父类Animal中,但是只能抽取方法的声明,因此这个方法是没有方法体的方法,需使用关键字abstract,这样的方法称为叫做抽象方法,抽象方法要在抽象类中。

abstract

抽象的意思,是一个修饰符。可以修饰类和方法。
格式:
  abstract class 类名{}
特点:
 1.抽象方法要在抽象类中
 2.抽象类是不可以实例化的,即不能创建对象
 3.抽象类应该是一个父类,子类继承抽象类,子类想要能创建对象,需将继承的所有抽象方法都重写,否则子类是抽象类。
 因此一个类的修饰符,不可能final和abstract都有
 4.抽象类中可以没有抽象方法,目的就是不让其实例化
成员:
  抽象方法、成员变量、构造方法、成员方法
  注意:抽象类中的成员可以是以上的四种内容,不是要求都同时存在的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值