java程序设计--孙鑫java无难事Lesson3《包、类和方法说明符、垃圾回收、接口》

java程序设计--孙鑫java无难事Lesson3《包、类和方法说明符、垃圾回收、接口》
本节要点:
1.包
2.类的说明符
3.方法的说明符
4.对象的销毁(垃圾内存回收的演示)

5.接口

//*********************************************************************************

主要内容:

1.包的作用--解决类名冲突,类似于文件系统的目录系统。

(1)使用包名而编译时没有指定包名时,会出错,错误信息如下:
F:\java\JavaLesson\Lesson3>javac Test.java

F:\java\JavaLesson\Lesson3>java  Test

//*********************************************************************************

Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: pac
ktest/Test)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        ...
(2)包名对应一个文件目录名,没有生成目录时,会出错,错误信息如下:
F:\java\JavaLesson\Lesson3>java packtest.Test
错误: 找不到或无法加载主类 packtest.Test
解决方法一:
手动新建一个目录来解决问题。
F:\java\JavaLesson\Lesson3>java packtest.Test
pakage test!
解决方法二:使用javac -d .参数
javac -d .t Test.java //当前目录创建文件夹
-d 参数使用:
在当前目录下生成包

    javac –d . Test.java

在指定目录下生成包

    javac –d E:\JavaLesson Test.java
(3)引入包
a.引入类 import java.io.File
b.引入整个包  import java.io.* ,导入所有类时java编译器需要额外内存来跟踪包中类信息
c.在同一个包中的类可以相互引用,无需import语句
d.java的lang包自动导入,自己类要手动导入.
不再同一个包时无法直接引用,错误如下:
Test.java:10: 错误: 找不到符号
                Test2 test=new Test2();
  符号:   类 Test2
  位置: 类 Test
2.类的说明符
(1)类的访问说明符
a.public
 b.default(不加访问说明符时)
(2)类的其它修饰符
a.final
final最终类,无法派生子类.

试图从最终类派生,会出错,错误的继承信息为:

//*********************************************************************************

F:\java\JavaLesson\Lesson3>javac -d . Test.java
Test.java:6: 错误: 无法从最终Test2进行继承
class  Test extends Test2
b.abstract
c.编译使用通配符  javac -d . *.java
(3)类名没有加说明符时为缺省类,不是public类型的,在包外无法访问。缺省类只能在同一个包中被访问。
执行语句:
F:\java\JavaLesson\Lesson3>javac -d . Test2.java
F:\java\JavaLesson\Lesson3>javac -d .  Test.java

错误信息如下:

//*********************************************************************************

Test.java:5: 错误: Test2在qq.test2中不是公共的; 无法从外部程序包中对其进行访问 import qq.test2.Test             
Test.java:11: 错误: 找不到符号 Test2 test=new Test2();
  符号:   类 Test2
  位置: 类 Test
解决方法:将类声明为public.
3.方法说明符
(1)说明符
方法的访问说明符
 public
 、protected
 、default(不加访问说明符时)
 、private方法的其它修饰符
 static
 、final
 、abstract
 、native
 、synchronized

(2)同一个类中 所有方法均可调用

同类中方法访问测试程序,运行效果

//*********************************************************************************

F:\java\JavaLesson\Lesson3>java  qq.packtest.Test
public Method
protected Method
default Method
private Method
(3) 同一个包中  不可以访问private方法即使是继承的类也不可以 但是可以访问default方法.
试图访问private方法错误信息如下:
F:\java\JavaLesson\Lesson3>javac  -d . Test2.java
Test2.java:12: 错误: priMethod()可以在Test中访问private test.priMethod();
(4) 不同的包中 继承的类可以访问public和protected方法,但是default和private方法均不可以访
(5) 不同的包也不存在继承关系时
除了公有public方法外,均不可以访问。

试图访问除public方法外的方法时,错误信息如下:

//*********************************************************************************

F:\java\JavaLesson\Lesson3>javac -d . Test2.java
Test2.java:29: 错误: proMethod()可以在Test中访问protected
           test.proMethod();
Test2.java:30: 错误: defMethod()在Test中不是公共的; 无法从外部程序包中对其进行访问
           test.defMethod();
Test2.java:31: 错误: priMethod()可以在Test中访问private
           test.priMethod();

访问权限总结见下图所示:


(6)final方法
a.为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(overridden),可以使用final方法。
试图重载父类final方法,错误信息如下:
F:\java\JavaLesson\Lesson3>javac -d . Test2.java
Test2.java:7: 错误: Test2中的pubMethod()无法覆盖Test中的pubMethod()public void pubMethod()被覆盖的方法为finalb.为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优化。要注意的是:编译器会自行对final方法进行判断,并决定是否进行优化。通常在方法的体积很小,而我们确实不希望它被覆盖时,才将它声明为final。
c.class中所有的private和static方法自然就是final。
4.抽象方法和抽象类
a.在类中没有方法体的方法,就是抽象方法。b.含有抽象方法的类,即为抽象类。
c.如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类。
d.我们可以将一个没有任何抽象方法的类声明为abstract,避免由这个类产生任何的对象。
e.构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。
常见错误:
a.定义了抽象方法而没有声明为抽象类.
F:\java\JavaLesson\Lesson3>javac -d . Test.java
Test.java:6: 错误: Test不是抽象的, 并且未覆盖Test中的抽象方法proMethod()
public class  Test //extends Test2
b.抽象类无法实例化对象
执行语句:
F:\java\JavaLesson\Lesson3>javac -d . Test.java
错误信息如下:
Test.java:44: 错误: Test是抽象的; 无法实例化
                Test  test= new Test();
c.子类继承了父类的抽象方法而没有重载抽象方法时出错

错误信息如下:

//*********************************************************************************

F:\java\JavaLesson\Lesson3>javac -d . Test2.java
Test2.java:5: 错误: Test2不是抽象的, 并且未覆盖Test中的抽象方法proMethod()
public class  Test2 extends Test
5.JNI   
a.JNI(Java Native Interface),它允许Java虚拟机(JVM)内部运行的Java代码能够与用其它编程语言(如C、C++、汇编语言)编写的应用程序和库进行互操作。b.JNI最大的好处是它没有对底层Java虚拟机的实现施加任何限制,因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地(Native)应用程序和库,就能够与所有支持JNI的Java虚拟机协同工作。
c.JNI可以理解为Java和本地应用程序之间的中介。
d.native方法是用户在Java中可以使用,但不能编写的方法。关于JNI后续学习再做了解.
6.垃圾回收机制分析
a.垃圾回收一般不会自动调用,内存不足时系统将运行垃圾回收
b.要让垃圾回收运行,需要显式调用System.gc();
c.垃圾回收的过程不唯一,以下测试代码运行结果可能不同。

垃圾回收机制测试代码为:

//*********************************************************************************

class Garbage
{   
    int index;
    static int cnt;
    Garbage()
    {  
       cnt++;
       System.out.println("object"+cnt+"  constructed");
       SetId(cnt);
    }
    void SetId(int id)
    {
      index=id;
    }
    //垃圾回收时调用此函数
    protected void finalize()
    {
      System.out.println("object"+index+" reclaimed");
    }
    public static void main(String[] args)
    {
        new Garbage();
        new Garbage();
        new Garbage();
        new Garbage();
        System.gc();//显式调用垃圾回收器
    }

}

//*********************************************************************************

演示结果:
object1  constructed
object2  constructed
object3  constructed
object4  constructed
object4 reclaimed
object3 reclaimed
object2 reclaimed
object1 reclaimed
7.接口 ---解决开发过程中的开发人员的协调问题,统一模块间的通信。
a.接口中所有方法都是abstract、public。
b.在实现类中实现方法中,访问权限不能低于接口的访问权限。
否则出错,错误信息如下:
Sport.java:12: 错误: Athlete中的jump()无法实现Sport中的jump()
        void jump()
  正在尝试分配更低的访问权限; 以前为public
Sport.java:8: 错误: Athlete中的run()无法实现Sport中的run()
        void run()
  正在尝试分配更低的访问权限; 以前为public

c.接口中可以有数据成员,这些成员默认都是public static final,即公有静态常量。

//*********************************************************************************

interface Math
{
    double PI=3.1415926;    //默认都是public static final  公有静态常量
    double roundArea(double radius);//接口
}
class Arithmetic implements Math   //实现接口
{
    public double roundArea(double radius)//需为public
    {
        return PI*radius*radius;        
    }
}
class Student
{
    public static void main(String[] args)
    {
        Arithmetic a=new Arithmetic();
        System.out.println(a.roundArea(3));
        //访问静态成员变量
        System.out.println(Math.PI);    //ok
        System.out.println(Arithmetic.PI);//ok
        System.out.println(a.PI);//ok
    }
}
d.接口实现1

接口实现演示代码如下:

//*********************************************************************************

interface Sport    //定义接口
{   
    void run();
    void jump();
}
class Athlete implements Sport    //实现接口
{   
    //接口访问权限为公有
    public void run()
    {
       System.out.println("短跑");
    }
    //如果定义的类想实例化对象,必须实现接口中所有方法
    public void jump()
    {
      System.out.println("三级跳");
    }
    
    public static void main(String[] args)
    {    
        Athlete ath=new Athlete();
        ath.run();
        ath.jump();
    }

}

//*********************************************************************************

//运行效果
F:\java\JavaLesson\Lesson3>javac Sport.java
F:\java\JavaLesson\Lesson3>java Athlete
短跑
三级跳
e.接口实现2 实现接口时,接口中的所有方法均要实现,否则出错,错误信息如下:
Sport.java:6: 错误: Athlete不是抽象的, 并且未覆盖Sport中的抽象方法jump()
class Athlete implements Sport    //实现接口
Sport.java:23: 错误: 找不到符号
                ath.jump();
  符号:   方法 jump()
  位置: 类型为Athlete的变量 ath

f.接口概念深入理解代码如下:

//*********************************************************************************

interface VideoCard   //显卡接口
{   
    void display();//显示
    String getname();//获取产品名称
}
class MainBoard          //主板
{   
    String strcpu;
    VideoCard vc;//只管定义显卡  不管由谁制造
    void setcpu(String strcpu)
    {
      this.strcpu=strcpu;
    }
    void setvideocard(VideoCard vc)
    {
       this.vc=vc;
    }
    void run()
    {
       System.out.println(strcpu);
       System.out.println(vc.getname());
       vc.display();//只管调用接口
       System.out.println("mainboard is running!");
    }
}
class Dmeng  implements VideoCard    //Dmeng显卡制造商实现显卡
{   
    String name;
    //实现显示
    public void display()
    {
       System.out.println("Dmen's video is working!");
    }
    //实现获取名称
    public String  getname()
    {
       return name;
    }
    public Dmeng()
    {
       name="Dmeng video";
    }
    void  setname(String str)
    {
       name=str;
    }
}
class Computer        //计算机
{   
    public static void main(String[] args)
    {   
        Dmeng dm=new Dmeng();//显卡
        MainBoard mb=new MainBoard();//主板
        mb.setcpu("Intel's cpu");//设置cpu
        mb.setvideocard(dm);//设置显卡
        mb.run();//运作
    }

}

//*********************************************************************************

//运行结果
Intel's cpu
Dmeng video
Dmen's video is working!
mainboard is running!
8.接口与类的继承
a.java不支持类的多继承

演示代码如下:

//*********************************************************************************

class Animal
{   
    //动物呼吸
    void Breath(){}
}
class Fish
{    //鱼类游动
    void Swim(){}
}
class  whale extends Animal ,Fish  //error  java不支持类的多继承
{   
     //鲸鱼喷水
    void Blow(){}

}

//*********************************************************************************

错误信息如下:
ClassExtends.java:15: 错误: 需要'{'
class  whale extends Animal ,Fish

b.java允许一个类实现多个接口

//*********************************************************************************

interface Sittable
{
    void sit();
}
interface Lie
{
    void sleep();
}
class Sofa implements Sittable, Lie  //ok  允许一个类实现多个接口
{
    public void sit(){}
    public void sleep(){}
}

c.java允许接口的多继承

//*********************************************************************************

interface Sittable
{
    void sit();
}
interface Lie
{
    void sleep();
}
interface Chair extends Sittable    //接口继承仍然使用extends
{
}
interface Sofa extends Sittable, Lie  //ok 允许接口的多继承
{
}

d.java允许在继承类的同时,实现多个接口

//*********************************************************************************

interface Sittable
{
    void sit();
}
interface Lie
{
    void sleep();
}
interface HealthCare
{
    void massage();
}
class Chair implements Sittable
{
    public void sit(){};
}
class Sofa extends Chair implements Lie, HealthCare   //ok  允许在继承类的同时,实现多个接口
{
    public void sleep(){};
    public void massage(){};
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
孙鑫.java web开发详解: xml xslt servlet jsp深入剖析与实例应用》是一本介绍Java Web开发技术的书籍。本书以XML、XSLT、Servlet和JSP为核心内容,旨在帮助读者全面了解并深入理解这些技术的应用和原理。 首先,书中详细介绍了XML(可扩展标记语言)的基本语法和应用场景。XML是一种用于存储和传输数据的标记语言,具有结构清晰、易于扩展和可读性好的特点。本书通过实例演示了XML的使用方法括如何创建、解析和操作XML文档。同时,还介绍了XML的相关技术和工具,如DTD(文档型定义)、Schema(模式)、XPath(路径语言)和XSLT(可扩展样式表语言转换)。 接着,书中系统地介绍了Servlet和JSP的应用和原理。Servlet是Java编写的服务器端程序,用于响应客户端的请求并生成动态内容。JSP(Java Server Pages)是一种将Java代码嵌入到HTML中的技术,用于生成动态网页。本书通过实例展示了如何使用Servlet和JSP开发Web应用,括处理请求和响应、会话管理、数据库访问等方面的内容。 最后,本书还深入剖析了XML、XSLT、Servlet和JSP的底层原理,括HTTP协议、请求和响应的处理流程、Web容器的工作原理等。通过深入理解这些原理,读者能够更好地进行Web应用的开发和调优。 总之,《孙鑫.java web开发详解: xml xslt servlet jsp深入剖析与实例应用》是一本全面介绍Java Web开发技术的书籍,通过详细的实例和剖析,帮助读者掌握XML、XSLT、Servlet和JSP的应用和原理,提升Web开发的技能和水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值