A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区







4、继承

4.12 包
   
    对类文件进行分类管理。
    给类提供多层命名空间。
    写在程序文件的第一行。

    类名的全称的是:包名.类名。
    包也是一种封装形式。


    示例1:
  1. package mypack;

  2. class PackageDemo{
  3.        public static void main(String[] args){
  4.             System.out.println("Hello Package!");
  5.        }
  6. }
复制代码
   运行结果:


    创建mypack文件夹,并且将PackageDemo.class放入其中,然后再次执行。

    运行结果:





    也可以通过javac命令直接创建mypack文件夹,然后执行。

   

    示例2:
    DemoA.java
  1. package packa;

  2. public class DemoA{
  3.        public void show(){
  4.             System.out.println("demoa show run");
  5.        }
  6. }
复制代码
    PackageDemo.java
  1. package mypack;

  2. class PackageDemo{
  3.        public static void main(String[] args){
  4.              packa.DemoA d = new packa.DemoA();
  5.              d.show();
  6.              System.out.println("Hello Package!");
  7.        }
  8. }
复制代码
    运行结果:


    P.S.
    包与包之间的类进行访问,被访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的。

    示例3:
    DemoA.java  
  1. package packa;

  2. public class DemoA extends packb.DemoB{
  3.        public void show(){
  4.             method();
  5.             System.out.println("demoa show run");
  6.        }
  7. }
复制代码
    DemoB.java  
  1. package packb;
  2. public class DemoB{
  3.        protected void method(){
  4.             System. out.println("demob show run" );
  5.       }
  6. }
复制代码
    PackageDemo.java
  1. package mypack;

  2. class PackageDemo{
  3.        public static void main(String[] args){
  4.              packa.DemoA d = new packa.DemoA();
  5.              d.show();

  6.              packb.DemoB b = new packb.DemoB();
  7.              //b.method();//报错!无法访问DemoB中的protected修饰的method方法
  8.              System.out.println("Hello Package!");
  9.        }
  10. }
复制代码
    运行结果:


    包之间的访问:被访问的包中的类权限必须是public的。   
    类中的成员权限:public或者protected。
    protected是为其他包中的子类提供的一种权限。

    四种权限


    import
    一个程序文件中只有一个package,但可以有多个import。

    示例:
    DemoA.java
  1. package packa;

  2. public class DemoA extends packb.DemoB{
  3.        public void show(){
  4.             method();
  5.             System.out.println("demoa show run");
  6.        }
  7. }
复制代码
    DemoB.java  
  1. package packb;
  2. public class DemoB{
  3.        protected void method(){
  4.             System. out.println("demob show run" );
  5.       }
  6. }
复制代码
    PackageDemo.java
  1. package mypack;
  2. //import packa.DemoA;//导入了 packa包中的DemoA类。
  3. import packa.*; //导入了packa包中所有的类

  4. class PackageDemo{
  5.        public static void main(String[] args){
  6.             DemoA d = new DemoA();
  7.             d.show();
  8.       }
  9. }
复制代码
   运行结果:



    示例:
    有两个类:DemoA、DemoAbc。
    所在文件目录如下:
    packa\DemoA.class
    packa\abc\DemoAbc.class

    导包语句如下:
    import packa.*;
    import packa.abc.*;


    Jar包

    Java的压缩包。
    方便项目的携带。
    方便于使用,只要在classpath设置jar路径即可。
    数据库驱动,SSH框架等都是以jar包体现的。


    Jar包的操作:
    通过jar.exe工具对jar的操作。

    创建jar包:
    jar  -cvf  mypack.jar  packa packb

    查看jar包
    jar  -tvf  mypack.jar   [>定向文件]

    解压缩
    jar  -xvf  mypack.jar

    自定义jar包的清单文件
    jar –cvfm  mypack.jar  mf.txt  packa packb


5、多线程

5.1 多线程的概念

    5.1.1 进程、线程、多进程的概念
    进程:正在进行中的程序(直译)。
    线程:进程中一个负责程序执行的控制单元(执行路径)。

    P.S.
    1、一个进程中可以有多个执行路径,称之为多线程。
    2、一个进程中至少要有一个线程。
    3、开启多个线程是为了同时运行多部分代码,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务。


    多线程的好处:解决了多部分代码同时运行的问题。
    多线程的弊端:线程太多,会导致效率的降低。

    其实,多个应用程序同时执行都是CPU在做着快速的切换完成的。这个切换是随机的。CPU的切换是需要花费时间的,从而导致了效率的降低。

    JVM启动时启动了多条线程,至少有两个线程可以分析的出来:
    1. 执行main函数的线程,该线程的任务代码都定义在main函数中。
    2. 负责垃圾回收的线程。


    示例:
  1. class Demo extends Object{
  2.        public void finalize(){
  3.             System.out.println("demo ok");
  4.        }
  5. }

  6. class ThreadDemo{
  7.        public static void main(String[] args){
  8.              new Demo();
  9.              new Demo();
  10.              System.gc();
  11.              new Demo();
  12.              System.out.println("Hello World!");
  13.       }
  14. }
复制代码
   运行结果:



    像这种情况,之所以先打印Hello World!再打印demo ok,是因为两条线程是分别执行的。


    像这种情况,只打印一个demo ok,是因为在垃圾回收器还没回收第二个Demo对象的时候,JVM就已经结束了。

    P.S.
    System类的gc方法告诉垃圾回收器调用finalize方法,但不一定立即执行。

    5.1.2 创建线程方式一:继承Thread类

    1. 定义一个类继承Thread类。
    2. 覆盖Thread类中的run方法。
    3. 直接创建Thread的子类对象创建线程。
    4. 调用start方法开启线程并调用线程的任务run方法执行。


    单线程程序示例:
  1. class Demo{
  2.       private String name ;
  3.       Demo(String name){
  4.              this.name = name;
  5.       }
  6.        public void show(){
  7.              for(int x = 0; x < 10; x++){
  8.                   System.out.println(name + "...x=" + x);
  9.             }
  10.       }
  11. }

  12. class ThreadDemo{
  13.        public static void main(String[] args){
  14.             Demo d1 = new Demo("旺财");
  15.             Demo d2 = new Demo("小强");
  16.             d1.show();
  17.             d2.show();
  18.       }
  19. }
复制代码
   运行结果:



    可以看到在单线程程序中,只有上一句代码执行完,下一句代码才有执行的机会。

    创建线程的目的就是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行,而运行的指定代码就是这个执行路径的任务。

    jvm创建的主线程的任务都定义在了主函数中。而自定义的线程,它的任务在哪儿呢?
    Thread类用于描述线程,线程是需要任务的。所以Thread类也有对任务的描述。这个任务就是通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数,run方法中定义的就是线程要运行的任务代码。

    开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法,将运行的代码定义在run方法中即可。


    多线程程序示例:
  1. class Demo extends Thread{
  2.       private String name ;
  3.       Demo(String name){
  4.              this.name = name;
  5.       }
  6.        public void run(){
  7.              for(int x = 0; x < 10; x++){
  8.                   System.out.println(name + "...x=" + x + "...ThreadName=" + Thread.currentThread ().getName());
  9.             }
  10.       }
  11. }

  12. class ThreadDemo{
  13.        public static void main(String[] args){
  14.             Demo d1 = new Demo("旺财");
  15.             Demo d2 = new Demo("xiaoqiang");
  16.             d1.start(); //开启线程,调用run方法。
  17.             d2.start();
  18.             for(int x = 0; x < 20; x++){
  19.                   System.out.println("x = " + x + "...over..." + Thread.currentThread().getName());
  20.             }
  21.       }
  22. }
复制代码
    运行结果:


    P.S.
    1、可以通过Thread的getName方法获取线程的名称,名称格式:Thread-编号(从0开始)。
    2、Thread在创建的时候,该Thread就已经命名了。源码如下:



~END~



~爱上海,爱黑马~


67 个回复

倒序浏览
顶!顶!顶!顶!顶!顶!顶!
回复 使用道具 举报
更新这么快
回复 使用道具 举报
支持阳哥,标记一下,以后搞
回复 使用道具 举报
写不死就往死里写,嘿嘿,加油...
回复 使用道具 举报
{:3_46:}{:3_46:}{:3_46:}
回复 使用道具 举报
很棒,很有用!加油!
回复 使用道具 举报
不错不错!
回复 使用道具 举报
给力!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报
支持一下
回复 使用道具 举报
额。加油。学习中!
回复 使用道具 举报
学习中 加油 formyself
回复 使用道具 举报
顶!顶!顶!顶!顶!顶!顶!
回复 使用道具 举报
辛苦。。。
回复 使用道具 举报
学习了,谢谢!!!
回复 使用道具 举报
杨哥太威武了
回复 使用道具 举报
太牛了,赞一个
回复 使用道具 举报
真是太好了
回复 使用道具 举报
学习速度真的跟不上阳哥的更新速度
回复 使用道具 举报
很好,顶一个
回复 使用道具 举报
1234下一页
您需要登录后才可以回帖 登录 | 加入黑马