仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 640|回复: 16
打印 上一主题 下一主题

[学习教程] JAVA教程之Java编程头脑重点条记(Java开辟必看)仓酷云

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Java的B/s开发是通常是javaweb开发,又叫J2EE开发,J2SE是手机开发。C#的C/s和B/s开发是说.net网页编程和Asp开发。。u在这里说明一点;资深一点的Java和C#程序员都明白一点Java编程头脑,Java进修必读典范,不论是初学者仍是年夜牛都值得一读,这里总结书中的重点常识,这些常识不但常常呈现在各年夜出名公司的口试口试过程当中,并且在年夜型项目开辟中也是经常使用的常识,既有复杂的观点了解题(好比is-a干系和has-a干系的区分),也有深切的触及RTTI和JVM底层反编译常识。

1.Java中的多态性了解(注重与C++辨别)



  • Java中除static办法和final办法(private办法实质上属于final办法,由于不克不及被子类会见)以外,别的一切的办法都是静态绑定,这意味着一般情形下,我们不用判断是不是应当举行静态绑定—它会主动产生。

    • final办法会使编译器天生更无效的代码,这也是为何说声明为final办法能在必定水平上进步功能(效果不分明)。
    • 假如某个办法是静态的,它的举动就不具有多态性:
      1. classStaticSuper{publicstaticStringstaticGet(){return"BasestaticGet()";}publicStringdynamicGet(){return"BasedynamicGet()";}}classStaticSubextendsStaticSuper{publicstaticStringstaticGet(){return"DerivedstaticGet()";}publicStringdynamicGet(){return"DeriveddynamicGet()";}}publicclassStaticPolymorphism{publicstaticvoidmain(String[]args){StaticSupersup=newStaticSub();System.out.println(sup.staticGet());System.out.println(sup.dynamicGet());}}
      复制代码
      输入:
      BasestaticGet()
      DeriveddynamicGet()

  • 机关函数其实不具有多态性,它们实践上是static办法,只不外该static声明是隐式的。因而,机关函数不克不及够被override。

  • 在父类机关函数外部挪用具有多态举动的函数将招致没法展望的了局,由于此时子类对象还没初始化,此时挪用子类办法不会失掉我们想要的了局。
    1. classGlyph{voiddraw(){System.out.println("Glyph.draw()");}Glyph(){System.out.println("Glyph()beforedraw()");draw();System.out.println("Glyph()afterdraw()");}}classRoundGlyphextendsGlyph{privateintradius=1;RoundGlyph(intr){radius=r;System.out.println("RoundGlyph.RoundGlyph().radius="+radius);}voiddraw(){System.out.println("RoundGlyph.draw().radius="+radius);}}publicclassPolyConstructors{publicstaticvoidmain(String[]args){newRoundGlyph(5);}}
    复制代码
    输入:
    Glyph()beforedraw()
    RoundGlyph.draw().radius=0
    Glyph()afterdraw()
    RoundGlyph.RoundGlyph().radius=5
    为何会如许输入?这就要明白把握Java中机关函数的挪用按次:
    (1)在其他任何事物产生之前,将分派给对象的存储空间初始化成二进制0;
    (2)挪用基类机关函数。从根入手下手递回下往,由于多态性此时挪用子类掩盖后的draw()办法(要在挪用RoundGlyph机关函数之前挪用),因为步骤1的原因,我们此时会发明radius的值为0;
    (3)按声明按次挪用成员的初始化办法;
    (4)最初挪用子类的机关函数。
  • 只要非private办法才能够被掩盖,可是还必要亲切注重掩盖private办法的征象,这时候固然编译器不会报错,可是也不会依照我们所希冀的来实行,即掩盖private办法对子类来讲是一个新的办法而非重载办法。因而,在子类中,新办法名最好不要与基类的private办法接纳统一名字(固然不妨,但简单曲解,觉得可以掩盖基类的private办法)。

  • Java类中属性域的会见操纵都由编译器剖析,因而不是多态的。父类和子类的同名属性城市分派分歧的存储空间,以下:
    1. //Directfieldaccessisdeterminedatcompiletime.classSuper{publicintfield=0;publicintgetField(){returnfield;}}classSubextendsSuper{publicintfield=1;publicintgetField(){returnfield;}publicintgetSuperField(){returnsuper.field;}}publicclassFieldAccess{publicstaticvoidmain(String[]args){Supersup=newSub();System.out.println("sup.filed="+sup.field+",sup.getField()="+sup.getField());Subsub=newSub();System.out.println("sub.filed="+sub.field+",sub.getField()="+sub.getField()+",sub.getSuperField()="+sub.getSuperField());}}
    复制代码
    输入:
    sup.filed=0,sup.getField()=1
    sub.filed=1,sub.getField()=1,sub.getSuperField()=0
    Sub子类实践上包括了两个称为field的域,但是在援用Sub中的field时所发生的默许域并不是Super版本的field域,因而为了失掉Super.field,必需**显式地指明**super.field。

2.is-a干系和is-like-a干系



  • is-a干系属于纯承继,即只要在基类中已创建的办法才能够在子类中被掩盖,以下图所示:

    基类和子类有着完整不异的接口,如许向上转型时永久不必要晓得正在处置的对象切实其实切范例,这经由过程多态来完成。

  • is-like-a干系:子类扩大了基类接口。它有着不异的基础接口,可是他还具有由分外办法完成的其他特征。

    弱点就是子类中接口的扩大部分不克不及被基类会见,因而一旦向上转型,就不克不及挪用那些新办法。

3.运转时范例信息(RTTI+反射)

<ul>观点
RTTI:运转时范例信息使得你能够在程序运转时发明和利用范例信息。利用体例
Java是怎样让我们在运转时辨认对象和类的信息的,次要有两种体例(另有帮助的第三种体例,见下形貌):


  • 一种是“传统的”RTTI,它假定我们在编译时已晓得了一切的范例,好比Shapes=(Shape)s1;
  • 另外一种是“反射”机制,它运转我们在运转时发明和利用类的信息,即便用Class.forName()。
  • 实在另有第三种情势,就是关头字instanceof,它前往一个bool值,它坚持了范例的观点,它指的是“你是这个类吗?大概你是这个类的派生类吗?”。而假如用==或equals对照实践的Class对象,就没有思索承继—它大概是这个切实的范例,大概不是。
事情道理
要了解RTTI在Java中的事情道理,起首必需晓得范例信息在运转时是怎样暗示的,这项事情是由称为Class对象的特别对象完成的,它包括了与类有关的信息。Java送Class对象来实行其RTTI,利用类加载器的子体系完成。
不管什么时候,只需你想在运转时利用范例信息,就必需起首取得对得当的Class对象的援用,猎取体例有三种:
(1)假如你没有持有该范例的对象,则Class.forName()就是完成此功效的便利途,由于它不必要对象信息;
(2)假如你已具有了一个感乐趣的范例的对象,那就能够经由过程挪用getClass()办法来猎取Class援用了,它将前往暗示该对象的实践范例的Class援用。Class包括很有有效的办法,好比:
  1. packagertti;interfaceHasBatteries{}interfaceWaterProof{}interfaceShoots{}classToy{Toy(){}Toy(inti){}}classFancyToyextendsToyimplementsHasBatteries,WaterProof,Shoots{FancyToy(){super(1);}}publicclassRTTITest{staticvoidprintInfo(Classcc){System.out.println("Classname:"+cc.getName()+",isinterface?["+cc.isInterface()+"]");System.out.println("Simplename:"+cc.getSimpleName());System.out.println("Canonicalname:"+cc.getCanonicalName());}publicstaticvoidmain(String[]args){Classc=null;try{c=Class.forName("rtti.FancyToy");//必需是全限制名(包名+类名)}catch(ClassNotFoundExceptione){System.out.println("CantfindFancyToy");System.exit(1);}printInfo(c);for(Classface:c.getInterfaces()){printInfo(face);}Classup=c.getSuperclass();Objectobj=null;try{//Requiresdefaultconstructor.obj=up.newInstance();}catch(InstantiationExceptione){System.out.println("CantInstantiate");System.exit(1);}catch(IllegalAccessExceptione){System.out.println("Cantaccess");System.exit(1);}printInfo(obj.getClass());}}
复制代码
输入:
Classname:rtti.FancyToy,isinterface?[false]
Simplename:FancyToy
Canonicalname:rtti.FancyToy
Classname:rtti.HasBatteries,isinterface?[true]
Simplename:HasBatteries
Canonicalname:rtti.HasBatteries
Classname:rtti.WaterProof,isinterface?[true]
Simplename:WaterProof
Canonicalname:rtti.WaterProof
Classname:rtti.Shoots,isinterface?[true]
Simplename:Shoots
Canonicalname:rtti.Shoots
Classname:rtti.Toy,isinterface?[false]
Simplename:Toy
Canonicalname:rtti.Toy
(3)Java还供应了另外一种办法来天生对Class对象的援用,即便用类字面常量。好比下面的就像如许:FancyToy.class;来援用。
如许做不但更复杂,并且更平安,由于它在编译时就会遭到反省(因而不必要置于try语句块中),而且它肃除了对forName办法的援用,以是也更高效。类字面常量不但能够使用于一般的类,也能够使用于接口、数组和基础数据范例。
注重:当利用“.class”来创立对Class对象的援用时,不会主动地初始化该Class对象,初始化被提早到了对静态办法(机关器隐式的是静态的)大概非final静态域(注重final静态域不会触发初始化操纵)举行初次援用时才实行:。而利用Class.forName时会主动的初始化。
为了利用类而做的筹办事情实践包括三个步骤:


  • 加载:由类加载器实行。查找字节码,并从这些字节码中创立一个Class对象
  • 链接:考证类中的字节码,为静态域分派存储空间,而且假如必须的话,将剖析这个类创立的对其他类的一切援用。
  • 初始化:假如该类具有超类,则对其初始化,实行静态初始化器和静态初始化块。
这一点十分主要,上面经由过程一个实例来讲明这二者的区分:
[code]<olclass="linenums"style="padding-top:0px;padding-bottom:0px;margin-bottom:0px;margin-left:35px;color:rgba(102,128,153,0.4);">packagertti;
importjava.util.Random;
classInitable{
staticfinalintstaticFinal=47;
staticfinalintstaticFinal2=ClassInitialization.rand.nextInt(1000);

static{
System.out.println("InitializingInitable");
}
}
classInitable2{
staticintstaticNonFinal=147;

static{
System.out.println("InitializingInitable2");
}
}
classInitable3{
staticintstaticNonFinal=74;

static{
System.out.println("InitializingInitable3");
谁可相欹 该用户已被删除
沙发
发表于 2015-1-20 18:50:27 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
再现理想 该用户已被删除
板凳
发表于 2015-1-21 13:42:38 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
深爱那片海 该用户已被删除
地板
发表于 2015-1-26 08:49:35 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
灵魂腐蚀 该用户已被删除
5#
发表于 2015-1-30 23:40:28 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-4 13:31:57 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
活着的死人 该用户已被删除
7#
发表于 2015-2-4 23:24:17 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
莫相离 该用户已被删除
8#
发表于 2015-2-8 04:03:26 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
山那边是海 该用户已被删除
9#
发表于 2015-2-17 03:03:14 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
因胸联盟 该用户已被删除
10#
发表于 2015-2-19 07:48:34 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
简单生活 该用户已被删除
11#
发表于 2015-2-22 11:18:57 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
不帅 该用户已被删除
12#
发表于 2015-2-26 02:59:34 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
若天明 该用户已被删除
13#
发表于 2015-2-26 17:32:25 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
admin 该用户已被删除
14#
发表于 2015-3-2 23:51:53 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
柔情似水 该用户已被删除
15#
发表于 2015-3-9 13:45:32 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
透明 该用户已被删除
16#
发表于 2015-3-16 22:29:42 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
再见西城 该用户已被删除
17#
发表于 2015-3-23 05:24:53 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 17:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表