day09
包
就是文件夹,用于区分相同类名、
格式
package 包名
包名:全部小写
可以是单级也可以是多级
顺序问题
package --> import --> class
带包的类该如何编译和运行
方式1:手动建包
用javac命令生成class文件
手动创建文件夹
把class扔到文件夹
用java命令执行、
类一定要用全部路径名称
带着包使用
java com.PackageDemo
方式2:自动建包 带包编译
javac -d .PackageDemo.java
-d .当前目录建包
导包:(集成开发工具里边提供)
用到不同包下的类
找到被访问的类
类前加import导包
问题1:找不到Demo类
使用全路径名称
cn.itcast.Demo d = new cn.isdn.Test();
问题2:程序包cn.itcast
先编译Demo类 在编译Testlei
问题3:权限问题Demo类无法访问到
对类用public修饰
如果包名太长用的次数太多就麻烦了,需要导包
格式:
import 包名1,包名2。。。类名
先编译被使用的类
然后把被使用的类前加public
导包使用
四种权限修饰符:本类中都可以访问,同一包下是不需要导包 同包下子父关系
private:Fu,
默认:Fu,同一包下,
protected:Fu,同一包下,不同包下子类
public:Fu,同一包下,不同包下没关系的类,不同包下子类
结论:
本类 同一包 不同包(子类) 不同包(无关类)
private Y
默认 Y Y
protect Y Y Y
public Y Y Y Y
成员变量private
成员方法public
private 给本类用
默认 给同一包类用
protected 给子类使用
public 给任何一个类使用
类 成员变量 成员方法 构造方法
private Y Y Y Y
默认 Y Y Y Y
protect Y Y Y
public Y Y Y Y
abstract Y Y
static Y() Y Y
final Y Y Y
注意:
所有的类都用public修饰
以后在一个java中只写一句话
以后所有的成员变量用private
以后所有的成员方法用public修饰
如果是抽象类或接口:
public abstract +。。。
以后所有的构造方法用public修饰
如果工具类单例类就用private
总结
类public;工具类一般私有
成员变量private
成员方法public
构造方法private
内部类(练代码)(概念记住),成员内部类样式:Outer$Inner.class
一个类要想访问另一个类的私有变量:不能
将一个类定义在另一个类里面,里面的那个类就被称为内部类(内置类,嵌套类)
访问特点:
内部类可以直接访问外部类中的私有成员
外部类访问内部类中的成员必须要创建内部类的对象
什么时候用
想要使用别人的成员还要使用别人私有的 只能通过内部类实现
根据位置分类:
成员位置上--成员内部类
局部位置上--局部内部类
成员内部类
通过在外部类中创建内部类的对象,实现调用内部类中的方法
通过在测试类中创建外部类的对象实现对外部类方法的调用
两次对象调用实现对内部类的调用,而内部类输出的是外部类的私有变量
如果想在内部类中直接使用Inner这个类可以用,要加限定
外部类意外的类访问非静态内部类格式:加限定格式:
外部类名.内部类名 变量 = 外部类对象.内部类对象
Outer.Inner oi = new outer().new Inner();
其实以上的方法并不合理
成员内部的修饰符:
可以被private static成员修饰符修饰
被static修饰的内部类只能访问外部类中的静态成员
private 为了安全起见,常见用法,使用对象调用,提供公共的访问方式
static 为了方便,通过类名调用
如果内部类是static修饰
格式:因为静态成员只能通过类来进行限定,而不能用对象限定
外部类名.内部类名 变量 = new 外部类名.内部类名();
Outer.Inner oi = new outer.Inner();
局部内部类:局部内部类样式:Outer$1Inner.class
方法中定义的类
局部内部类只能在类中能用
在局部创建对象
测试类创建外部类的对象
通过对象调用局部内部类的方法
局部内部类访问局部变量(局部内部类之外的),局部变量必须被final修饰(生命周期延长)
原因:(面试用)
局部变量(在栈内存中)会在方法调用完毕后立马消失,而内部类(存在于堆中)如果还使用着局部变量,当方法消失后,
这个方法区中的内容还没有消失,加fi nal之后变为常量存在于方法区,这个方法区的内容还没有消失,即这个变量还必须存在
所以为了延长局部变量的的生命周期,就加final修饰
内部类字节码文件命名规则
成员内部类样式:外部类$内部类,有多个内部类的话 多一个 外部类$1
Outer$Inner.class
局部内部类样式:外部类$内部类
Outer$1Inner.class
匿名内部类(对于安卓非常重要)
没有名字的局部内部类
前提:
必须存在一个类:抽象类或者接口,接口常见
格式
new 类名或接口名()
{
重写类或接口中的方法;
也可自己定义新的方法;
};
理解
它是一个继承了类或者实现了接口的匿名的子类的对象
怎么调用该类呢
new 类名或接口名()
{
重写类或接口中的方法;
也可自己定义新的方法;
}.方法;
即可调用(一次只能调一个方法,多个的话就写多个)
//也可使用多态:赋值父类或者接口引用,可以使用多次
类名或接口名 变量 = new 类名或接口名()
{
重写类或接口中的方法;
也可自己定义新的方法;
};
变量.方法;
变量.方法;...
什么时候使用内部类
当接口或者或者抽象类中的方法在3个以下的时候考虑使用内部类
以后看到一个方法接收的形式参数是个抽象类或者接口可以用匿名内部类实现
所有父类父接口出现的额地方完全可以用子类替代
|