内部类
定义:将一个类定义到另一个类的里边,里边的类就称为叫做内部类,内置类。
将内部类定义在它所属的类中,类中分为成员位置和局部位置,因此
按照位置划分: 成员内部类和局部内部类。
按照内部类是否有类名划分:有名内部类和匿名内部类
成员内部类
结构:
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.抽象类中可以没有抽象方法,目的就是不让其实例化
成员:
抽象方法、成员变量、构造方法、成员方法
注意:抽象类中的成员可以是以上的四种内容,不是要求都同时存在的。