黑马程序员——包机制、常用的API 笔记第七篇

包机制、访问修饰符、Jar包、模板设计、常用的API

-----Java培训、Android培训、期待与您交流! -------


1包机制

包概念的引入:

问题:如果在一个文件夹里面有相同类名的java文件,那么后编译的class文件

会覆盖前面编译的class文件。

java中的包机制:

 

 包的作用:

         1.解决了类名重复产生覆盖的问题。

         2.便于软件版本发布。

 

定义包的格式:    

         package包名;

 

java中的包就类似于windows文件夹。

包名的命名规范:全部字母小写。

 

 

包要注意细节:

1. package语句必须是在一个java文件中第一个语句。

2. 一个java文件只能有一个package语句。

3. 如果一个类加上了包语句之后,那么该类的完整类名是 包名+ 类名。

 

问题:有包语句之后,每次编译完成之后都要自己新建一个文件夹把class文件放进去,烦!!!

         javac-d  指定存放class文件的路径   java的源文件。

 

有了包之后类与类之间访问:    

 

问题: 有了包之后,类与类之间的访问就变成 包名.类名才能创建一个对象,如何解决?

为了解决有了包名之后,类与类之间访问需要写上包名这个问题,sun引入了一个导包机制。

 

import 导包语句解决上述的问题。

import作用:简化书写。

 

import语句的使用格式:   

         import包名.类名;

例子:import aa.Demo1; 引入了一个类文件,把Demo1.class文件加载到内存中。

 

导包语句要注意的细节:

1. import 语句可以出现多句。

2. import 包名.* 引入指定的包下面的所有类。  * 只能用于类名不能用于匹配包名。

3. import aa.* 不会作用于aa包下面的子包类。

 

推荐使用: import 包名.类名   不推荐使用使用通配符。原因是使用通配符结构不清晰。

 

何时需要使用导包语句:

         1.如果类与类之间的访问不是在同一个包,那么就需要使用导包语句。

         2.如果是使用了java.lang包下面的所有类都不需要导入,java编译器机默认导入。

 

2 访问修饰符

访问修饰符是用来控制类、属性、方法的可见性的关键字称之为访问修饰符。

   

1.   public 一个类中,同一包中,子类中,不同包中

2.   protected  一个类中,同一包中,子类中

3.   default 一个类中,同一包中

4.   private 一个类中

 

1.   (修饰类成员)类成员

1.   成员使用private修饰只在本类中使用。

2.   如果一个成员没有使用任何修饰符,就是default,该成员可以被包中的其

3.   他类访问。

4.   protected成员被protected修饰可以被包中其他类访问,并且位于不同

5.   包中的子类也可以访问。

6.   public修饰的成员可以被所有类访问。

2.   (修饰类)类

1.   类只有两种public和默认(成员内部类可以使用private))

2.   父类不可以是private和protected,子类无法继承

3.   public类可以被所有类访问

4.   默认类只能被同一个包中的类访问

 

3 Jar包

1:jar就是打包文件

jar文件时一种打包文件java active File,与zip兼容,称之为jar包

开发了很多类,需要将类提供给别人使用,通常以jar包形式提供.当项目写完之后,需要及将class字节码文件打包部署给客户。如何打包?可以使用jar命令.

2:jar命令

    1:jar工具存放于jdk的bin目录中(jar.exe)

    2:jar工具:主要用于对class文件进行打包(压缩)

    3:dos中输入jar查看帮助

3:案例使用jar命令
将day10中的cn文件打包为名字为test.jar文件(cn 文件是使用javac -d 编译带包的class文件夹)

jar cvf test.jar cn

详细命令:

    1:jar cf test.jar cn 在当前目录生成test.jar 文件,没有显示执行过程

    2:jar cvf test.jar cn 显示打包中的详细信息

    3:jar tf test.jar  显示jar文件中包含的所有目录和文件名

    4:jar tvf test.jar 显示jar文件中包含的所有目录和文件名大小,创建时间详

细信息

    5:jar xf test.jar  解压test.jar到当前目录,不显示信息

    6:jar xvf test.jar 解压test.jar到当前目录,显示详细信息

    7:可以使用WinRaR进行jar解压

    8;将两个类文件归档到一个名为 test2.jar 的归档文件中:

       jar cvf test2.jar Demo3.class Demo4.class

    9:重定向

       1:tvf可以查看jar文件内容,jar文件大,包含内容多,dos看不全。

       2:查看jdk中的rt.jar 文件 jar tvf rt.jar

       3:jar tvf rt.jar>d:\rt.txt

 

打jar要注意的事项

1. MANIFEST.MF 需要写上这个软件的入口类文件。

2. jar文件双击运行仅对图形化界面的程序有效,对于控制台的程序无效。

 

jar文件的作用:

         1.可以把一个图形化界面的程序打包,然后双击可以运行。

         2.可以把一些工具类打包成jar包,提供给其他程序员使用。这样子更加的清爽..

注意: 如果工具类是以jar形式提供给别人使用的时候,那么一定要设置classpath的路径信息。

classpath的作用:设置了class文件所在的路径。

jre java运行环境  = jvm + 核心类库。

 

4 模板设计

模板模式的步骤:

1. 先写出解决该类问题其中一件的解决方案。

2. 分析当前的程序,把会发生变化的代码独立抽取成一个方法。再把这个方法描述成抽象的方法。

3. 如果谁需要使用到写好的模板,那么就需要继承你的模板类。

 

//计算程序运行时间的模板类

abstract class MyRuntime{

   

    public final void getTime(){

       //在程序运行之前先记录一个开始时间

       long startTime = System.currentTimeMillis();

       code();

       //记录一个结束的时间。

       long endTime = System.currentTimeMillis();

       System.out.println("运行时间为:"+ (endTime-startTime));

    }

   

    //code方法的代码是会发生变化的,并不是固定的。

    public abstract   void code();

}

 

class Demo10 extends MyRuntime{

    public static void main(String[] args) {

       Demo10 d = new Demo10();

       d.getTime();

    }

 

    //需要计算运行时间的代码就写到code方法上面去。

    public void code(){

       int i = 0 ;

       while(i<100){

           System.out.println("i="+i);

           i++;

       }

    }

}

5常用的API

5.1 Object类

Object类是所有类的超类(父类)

Object常用的方法:         

        toString()   返回该对象的字符串表示     完整类名+ @+ 哈希码(可以把哈希码理解成就是该对象的内存地址)

 

 疑问: toString到底有什么作用?

        让我们直接打印一个对象的时候,输出的信息是符合我们所需要的信息。

 

        equals(Object obj)  用于判断两个对象是否是同一个对象,底层比较的是两个对象 的内存地址,如果是同一个对象返回true,否则返回false。

       

         hashCode()  返回该对象的哈希码值。哈希码可以理解成就是一个对象的内存地址。

        

         java规范:一般重写了对象的equals方法,都会重写hashCode方法.

 

public class Demo1 {

    public static void main(String[] args) {

       /*

       Object o = new Object();

       //String str  = o.toString();

       System.out.println(o.toString());  // java.lang.Object@5e1077

       System.out.println(o);             // java.lang.Object@5e1077

   

       疑问:为什么直接输出一个对象的时候,打印出来的信息与调用对象的toString输出的的是一样?

           因为println的这个方法内部调用对象的toString方法。

   

       Person p1 = new Person(110,"狗娃");

       Person p2 = new Person(119,"狗剩");

       System.out.println(p1);  // cn.itcast.object.Person@1db05b2   需求:编号:110 名字:狗娃

       System.out.println(p2);

        */

       Person p1 = new Person(110,"狗娃");

       Person p2 = new Person(110,"小狗"); // 凡是以new关键字创建对象的时候。,jvm都会在堆内存中开辟新的内存空间,创建新的对象。

      

       //在现实生活中两个人只需要身份证编号一致,那么我们就可以断定是同一个人了。

       System.out.println("是同一个对象吗?"+  p1.equals(p2)); // equals 比较的是内存地址, false  

       System.out.println("p1的哈希码: "+p1.hashCode());

       System.out.println("p2的哈希码: "+p2.hashCode());

    }

}

 

equals与==的区别:

1. euqlas方法只能比较引用类型对象数据,==可以比较基本数据类型,也可以比较引用数据类型。

2. equals默认比较的是两个对象的内存地址,但是equals可以重写比较其他的数据, ==不能重写的,用于基本数据类型的时候比较的是两个数据的值是否相等,用于比较两个 对象数据的时候,比较的是两个对象的内存地址是否一致。

 

5.2 String类

5.2.1字符串对象的比较

String Str = “jack”这个语句会先检查字符串常量池是否存放这个”jack1”这个字符串对象,如果没有存在,那么就会在字符串常量池中创建这个字符串对象,如果存在直接返回该字符串的内存地址值。

String str3 = new String(“jack”) 该语句会创建两个对象,首先会先检查字符串常量池中存不存在jack这个字符串对象,如果不存在就会创建,如果存在就返回内存地址值。创建了出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。总共两个对象。

 

 

5.2.2获取方法

int length()  获取字符串的长度

char charAt(int index) 获取特定位置的字符 (角标越界)

int indexOf(String str) 获取特定字符的位置(overload)

int lastIndexOf(int ch) 获取最后一个字符的位置

 

5.2.3判断方法

boolean endsWith(String str) 是否以指定字符结束

boolean isEmpty()是否长度为0 如:“” null V1.6

boolean contains(CharSequences) 是否包含指定序列 应用:搜索

boolean equals(Object anObject) 是否相等

boolean equalsIgnoreCase(String anotherString) 忽略大小写是否相等

5.2.4转换方法

String(char[] value) 将字符数组转换为字符串

String(char[] value, int offset, int count)

Static String valueOf(char[] data)

static String valueOf(char[] data, int offset, int count)

char[] toCharArray()  将字符串转换为字符数组

 

5.2.5其他方法

String replace(char oldChar, char newChar) 替换

String[] split(String regex) 切割

String substring(int beginIndex)

String substring(int beginIndex, int endIndex)截取字串

String toUpperCase() 转大写

String toLowerCase() 转小写

String trim() 去除空格

5.3 StringBuffer 字符缓冲类

StringBuffer 其实就是一个存储字符的容器。 允许对字符数据进行修改的。

 

容器的方法:

添加   

       append()   在缓冲区的尾部添加新的文本对象(StringBuffer 可以添加任意类型的数据进去)

       insert(int offset, char c) offset 指定插入的位置。  插入的内容。            在指定的下标位置添加新的文本对象

 

查看

    toString() 返回这个容器的字符串

    indexOf(String str) 返回第一次出现的指定子字符串在该字符串中的索引。

    substring(int start) 从开始的位置开始截取字符串

 

删除

    delete(int start, int end) 根据开始与结束的索引值删除字符串缓冲区的内容。

deleteCharAt(int index)  删除指定的索引值对应的字符。

 

修改

    replace(int start int end , String str)  使用给定 String 中的字符替换此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符。

    setCharAt(int index char ch)  指定索引位置替换一个字符

 

疑问:使用StringBuffer无参的构造方法创建对象时,默认的初始容量是多少,当容量不够使用时又会自动增长多少?

    StringBuffer底层是维护了一个字符数组存储字符数据的, 默认的初始化容量是16,自动增长1倍。

public class Demo1 {

 

    public static void main(String[] args) {

       //创建了一个字符串缓冲类对象。

       StringBuffer sb = new StringBuffer("hello java");// hello 小明java

       //添加

       sb.append(" java");

       sb.append(true);

       sb.append(3.14f);

       sb.insert(6, "小明");  //指定一个索引值插入元素。

 

       //查看

       String str = sb.toString();

       System.out.println(str);

       int index = sb.indexOf("java");//返回指定字符串第一次出的索引值。

       System.out.println("index :"+index);

       System.out.println("子串的内容:"+sb.substring(6));

 

       //删除

       sb.delete(6, 8); // 根据开始与结束的索引值删除数据。包头不包尾

       sb.deleteCharAt(1);

       System.out.println("删除后的数据:"+sb);

 

       //修改

       //  hello java

       sb.replace(6, 10, "php"); //指定开始与结束的索引值替换内容。

       sb.setCharAt(7, 'w'); //设置指定索引值对应的字符改成指定的字符。

       System.out.println("修改后的数据:"+sb);

    }

}

 

StringBuilder是JDK1.5之后提出的,线程不安全,但是效率要高。用法与StringBuffer类似。

5.4 System 系统类

System类常用的方法:

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)   拷贝一个数组

    src - 源数组。

    srcPos - 源数组中的起始位置。

    dest - 目标数组。

    destPos - 目标数据中的起始位置。

    length - 要复制的数组元素的数量。

currentTimeMillis()  获取当前的系统时间,返回的是一个毫秒数

 

public class Demo {

    public static void main(String[] args) {

       int[] strArr = {12,4,5,10,17};

       int[] desArr = new int[5];

       System.arraycopy(strArr, 1,desArr, 1, 3);

       System.out.println("目标数组的元素:"+Arrays.toString(desArr));

       //[0, 4, 5, 10, 0]

      

       //获取系统属性

       Properties ps = System.getProperties();

       //输出属性

       ps.list(System.out);

      

       //获取操作系统名称

       String os_name =System.getProperty("os.name");

       System.out.println(os_name);

      

       //获取path环境变量值

       System.out.println(System.getenv("path"));

       System.out.println("当前时间:"+System.currentTimeMillis());

    }

}

 

5.5 Runtime

Runtime常用 的方法:

exec(String command)指定一个可执行文件的路径的字符串形式,然后执行一个程序。

freeMemory()  返回 Java 虚拟机中的空闲内存量。

totalMemory()  返回 Java 虚拟机中的内存总量

 

public class Demo2 {

    public static void main(String[] args) throws IOException, Exception{

       // 获取应用运行环境的对象

       Runtime run =Runtime.getRuntime();

       //获取可用内存

       System.out.println(run.freeMemory());

       System.out.println(run.maxMemory());

       System.out.println(run.totalMemory());

      

       // 获取应用运行环境的对象

       Runtime run =Runtime.getRuntime();

       Process process = run.exec("C:\\Windows\\notepad.exe");

       Thread.sleep(3000);  //让程序暂停3

       process.destroy();   //销毁进程

    }

}

 

5.6 Date

Date 类封装的是系统的当前时间.。但是Date已经过时了,sun推荐使用Calendar类。

Calendar: 该类是一个日历的类,封装了年月日时分秒时区。

 

日期格式化类:SimpleDateFormat

 

public class Demo1 {

    private static final int YEAR = 0;

    public static void main(String[] args) throws Exception {

       Date date = new Date();//获取当前的系统时间

       System.out.println("年月:"+date.getYear()); //过时的方法

      

       Calendar calendar = Calendar.getInstance();//新的取代方法

       System.out.println("年份:"+calendar.get(calendar.YEAR));//获取年份

       System.out.println("月份:"+(calendar.get(calendar.MONTH)+1));//

       System.out.println("日:"+calendar.get(calendar.DATE));

       System.out.println("星期:"+calendar.get(calendar.DAY_OF_WEEK));

      

       System.out.println("时:"+calendar.get(calendar.HOUR_OF_DAY));

       System.out.println("分:"+calendar.get(calendar.MINUTE));

       System.out.println("秒:"+calendar.get(calendar.SECOND));

      

       //  xxxxxxxx  xx:xx:xx

       //  Date date = new Date();

       // SimpleDateFormat的第一个作用:Date转换成指定格式的字符串。

      

       //创建了一个默认模式的日期格式化类对象

       SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHH:mm:ss");

       String dateFomat = simpleDateFormat.format(date);

       System.out.println("日期:"+dateFomat);

      

       //把字符串----->日期

       String str = "20141018    15:54:30";

       date = simpleDateFormat.parse(str);

       System.out.println(date);

    }

}

 

5.7 Math

Math:类封装了很多数学的功能。

Math常用的方法:

abs(double a)  获取一个绝对值。

ceil(double a)  向上取整。()

floor(double a) 向下取整

round(double a)  四舍五入

random()  产生一个随机数,随机数的方位是0.0-1.0之间

 

public class Demo2 {

    public static void main(String[] args) {     

       System.out.println("绝对值:"+Math.abs(-1));

       System.out.println("向上取整"+Math.ceil(-3.14));

       System.out.println("向下取整:"+Math.floor(-3.14));

       System.out.println("四舍五入:"+ Math.round(3.55));

       System.out.println("随机数:"+ Math.random());

 

       //练习:产生一个随机码

       Random  random =new Random();

       char chs[] = new char[]{'a','b','c','A','B','C','','','广',''};

       StringBuilder sb =new StringBuilder();

       for(inti=0;i<4;i++){

       //  sb.append(chs[random.nextInt(chs.length)]);

           intindex = random.nextInt(chs.length);

           sb.append(chs[index]);

       }

       System.out.println("验证码是:"+sb.toString());

    }

}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值