第四章(4)、面向对象-包、权限修饰符和内部类

一、包

       在前面的代码示例中,把所有的类全部都写在了同一个java文件中,在程序中是不建议这么做的(特殊情况除外),一般都是一个java文件中就写一个类。在程序中我们会写很多的类,如果类很多且全部方法在一个文件夹内,这样看起来就很乱,查找起来也麻烦,就像我们电脑上安装的程序,基本上都是放在不同的文件夹中。同理,我们也可以给这些java文件分类,放到不同的文件夹中,这种行为成为分包。

        包其实就是文件夹,对java类的分类一般都是通过类的功能或者模块进行划分,例如:老师类和学生类都是属于人类,就建一个人的包,把教师类和学生类放进去;猫类和狗类都是动物类,就可以建一个动物包,把猫类和狗类放到动物包中,这样把类分门别类的存放,到时候想去找的时候,就能很快的定位到。

        定义包格式:package 包名;  可以是一级包(package java);也可以是多级包,用 . 分开(package com.java)。package语句必须放在可执行程序的第一行(注释除外),并且只能在一个java文件中出现一次,如果没有加package,就是默认没有包。现在定义Student和TestDemo两个类,这两个类分别在com.test.onecn.test.two不同的包中,如果在TestDemo类中想使用Student类中的功能,就需要导包,格式:import com.test.one.Student;,这一行放在package语句的下面。

        加入包后,如果想执行TestDemo中的main()方法,且TestDemo类中使用Student类中的功能,这时就需要(1)先编译Student.java文件,命令:javac -d . Student.java,编译完后Student.class文件就会存在com.test.one包中,这时(2)再去编译TestDemo.java文件,命令:javac -d .TestDemo.java,注意不要漏了 . ,编译后TestDemo.class文件就会存在于cn.test.two包中,接着去(3)运行TestDemo.class文件,这时就要加入包名去运行,命令:java cn.test.two.TestDemo。

代码如下:

生成两个包,包下有Student.class文件和包下有TestDemo.class文件,最后运行。

        在导包的时候,一般是需要哪个类就导入哪个类(例如:这里只需要Student,就只导入它,import com.test.one.Student;),还有一种做法是,导入这个包中的所有类,

格式:import com.test.one.*; ,这就表示导入跟Student同个包下的所有类,不建议这么去做。package、import、class的先后顺序是,package --> import --> class,package只能有一个且是在这个java文件中的第一行;接着是import,可以有多个;最后是class,也可以有多个,不过不建议,一般是一个java文件对应一个类。

二、权限修饰符

        权限修饰符是用来修饰成员和类的,在不同的权限下,类和成员能否被使用,这就是权限修饰符的作用。权限修饰符一共有四个(权限从大到小):public、protected、默认的、private,被它们修饰的成员有以下这些情况:

1)public修饰的成员:在同一个类中可以被使用,同一个包下的子类或者其他类可以被使用,不同包下的子类可以被使用,不同包下的其他类可以被使用;

2)protected修饰的成员:在同一个类中可以被使用,同一个包下的子类或者其他类可以被使用,不同包下的子类可以被使用,不同包下的其他类不可以被使用;

3)默认修饰符修饰的成员:在同一个类中可以被使用,同一个包下的子类或者其他类可以被使用,不同包下的子类不可以被使用,不同包下的其他类不可以被使用;

4)private修饰的成员:在同一个类中可以被使用,同一个包下的子类或者其他类不可以被使用,不同包下的子类不可以被使用,不同包下的其他类不可以被使用;

类、成员、构造方法中可以使用的修饰符:

1)类:public、默认、final、abstract;

2)构造方法:public、protected、默认、private;

3)成员变量:public、protected、默认、private、final、static;

4)成员方法:public、protected、默认、private、final、static、abstract。

 

三、内部类

        在前面所举的例子中,基本上一个java文件里要么就定义了一个类,要么定义多个类,并且这些类都是独立的。而内部类则是一个类定义在在另一个类的内部,例如:

class ClassOne{  class ClassTwo { } },ClassTwo 类定义在了ClassOne的里面,ClassTwo 就成为内部类。 内部类可以定义在类的成员位置(成员变量和成员方法的位置)和局部位置(方法的内部)。内部类可以访问外部类(例如以上的ClassOne类就称为外部类)的成员,包括私有的(private修饰)成员,但是外部类要访问内部类的成员,就要创建内部类的对象。外界创建成员内部类对象:外部类名.内部类名 对象名 = new 外部类名().new 内部类名()。

 

1)成员内部类

        内部类定义在类的成员位置,称为成员内部类,可以直接访问外部类的成员。

代码如下:

        从以上代码可以看出,外部类也可以访问内部类中的任何成员。注意:如果内部类使用了private修饰,外界就不能创建内部类的对象了。

        成员内部类还可以使用static修饰,那么内部类就只能访问外部类的静态(被static修饰)成员了,外界创建内部类对象的方式也变了,

格式:外部类名.内部类名 对象名 = new 外部类名.内部类名(); 。代码如下:

2)局部内部类

        定义在外部类的局部位置,就称为局部内部类。可以直接访问外部类的成员,可以通过创建内部类对象来访问局部内部类的成员。注意:在jdk7及之前,局部内部类访问局部变量时,局部变量要用final修饰,jdk8之后就可以不用加了。代码如下:

 

3)匿名内部类

         匿名内部类其实就是内部类的简写,之前接触过匿名对象,匿名对象一般使用来当做参数传递或者这个对象只使用一次,使用匿名内部类的前提是有一个类或者是一个接口,类可以是具体类,也可以是抽象类,匿名内部类格式:new 类名或者接口名() { 重写方法; }。代码如下:

       

 

公众号二维码

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值