本人c++程序员,在进行NDK开发时,遇到java的相关内容,有c++的基础,在学习java时没必要从头看起,毕竟java是由c++进行开发的,在数据结构和语法上基本相同。但是java还是有几个地方和c++有很大不同的,因此在此做了一些总结,介绍了java中特有的几个重要的点,希望c++程序员能快速地对java进行熟悉。
1、接口 http://blog.csdn.net/wei_zhi/article/details/52738471
interface,在java语言中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而来继承接口的抽象方法。如果一个类只由抽象方法和全局常量组成,那么这种情况下不会将其定义为一个抽象类。只会定义为一个接口。
(1)接口必须要有子类,但一个子类可以使用implements实现多个接口;
(2)接口的子类,必须要覆写接口中的全部抽象方法;
(3)接口的对象可以利用子类对象向上转型进行实例化
2、java包 http://blog.csdn.net/fx677588/article/details/52689565
包建议小写字母开头。
3、jar包 http://www.blogjava.net/zeroone0/articles/38826.html
可执行jar包相当于exe,不可执行jar包相当于dll
4、abstract和interface
接口比抽象类更抽象:
1)类可以实现无限个接口,但只能继承一个抽象类,接口是用来解决多重继承问题的
2)抽象类中可以存在非抽象的方法,但是接口不能且里面的方法只能是一个声明,必须用public来修饰,没有具体的实现方法。
3)抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认都是静态常量static final
4)抽象类是对象的抽象,接口是一种行为规范。
1)在继承抽象类时,必须覆盖类中的每一个抽象方法。
2)当父类已经有实际功能的方法时,该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法。
3)而implement一个interface时,一定要实现所有的方法,不可遗漏任何一个。
4)抽象类不能产生对象,但可以由它的实现类来声明对象。
在实现接口时,我们也常写一个抽象类,来实现接口中的某些子类所需的通用方法,接着在编写各个子类,即可继承该抽象类来使用,省去在每个都要实现通用的方法的困扰
5、java的权限
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必
须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。
至于main()不是必须要放在public类中才能运行程序。
默认的是default 不需要书写
public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不
仅可以跨类访问,而且允许跨包(package)访问。
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以
及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、
属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访
问。
6、几个重要的包
第一个包:java.lang包。
该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。
第二个包:java.util包。
该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
第三个包:java.io包。
该包通过文件系统、数据流和序列化提供系统的输入与输出。
第四个包:java.net包。
该包提供实现网络应用与开发的类。
第五个包:java.sql包。
该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。
第六个包:java.awt包
第七个包:javax.swing包。
这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。
第八个包:java.text包。
提供了与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。
7.Toast
toast是Android中用来显示信息的一种机制,和Dialog不一样的是,toast没有焦点,而且显示时间有限,主要面向用户显示提示消息。
8.AlertDialog和PopupWindow区别
AlertDialog是非阻塞式对话框;AlertDialog弹出后,后台还可以做事情,而PopupWindow是阻塞式对话框:popupwindow弹出时,程序会等待,在popupwindow退出前,程序一直等待,只有调用了dimiss方法后,popupwindow退出,程序向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。
9.AssetManager资源管理器
资源管理器(AssetManager)主要负责统一加载和管理纹理(Texture)、纹理图集(TextureAtlas)、位图字体(BitmapFont)、音乐(music)、音效(sound)等assets文件夹中的资源。
10.GLSurfaceView
用于显示3D图像,本身并不提供绘制3d图形的功能,绘制功能由GLSurfaceView.Renderer来完成。是一个视图,继承自SurfaceView。http://blog.csdn.net/chenjie19891104/article/details/6311209
11、android四大组件
Activity 、 Service 、ContentProvider 、BroadcastReceiver为四大组件。
Activity显示一个应用希望呈现给用户的内容;service是应用可以在后台运行的服务组件;contentprovider是应用的数据存储组件;broadcastreceiver是应用获取系统或者获取某些应用发出特定消息的组件
Activity只能通过setContentView(View)来显示指定组件。 setContentView(layout)
http://blog.csdn.net/anddlecn/article/details/51424721
12、Intent
联系四大组件,联系应用
13、Manifest
在应用工程的源码目录下,都有一个AndroidManifest.xml文件,它是这个应用的配置文件,当应用安装到设备上后,android系统会从这个文件中获取很多关于这个应用的配置信息。包含如下信息:
①应用程序的包名,该包名作为应用的唯一标识。
②应用程序所包含的组件,如Activity Service BroadcastReceiver ContentProvider
③应用程序兼容的最低版本
④应用程序使用系统所需的权限声明
⑤其他程序访问该程序所需的权限声明。
14、Acivity 《疯狂android》
四种状态:
running状态:一个新的activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。
paused状态:当activity被另一个透明或者dialog样式的activity覆盖时的状态。仍然可见,失去焦点,不可交互。
stopped状态:当activity不可见时的状态。一定要保存当前数据和当前的UI状态。
killed状态:activity呗杀掉后或者被启动前,处于killed状态。
全生命周期: onCreate到onDestroy
可见生命周期:onStart到onStop
前台生命周期:onResume到onPause
15 UI相关 《疯狂Android讲义》P40
把变化小、行为比较固定的组件放在xml布局文件中;把变化大、行为控制复杂的组件交给java代码。
在Activity中显示视图: setContentView(R.Layout.<资源文件名字>);
访问组件:findViewById(R.id.<android.id>);
16 布局管理器
android的布局管理器本身就是一个UI组件,所有的布局管理器都是ViewGroup的子类。
线型布局LinearLayout 表格布局TableLayout 帧布局FrameLayout 相对布局RelativeLayout
绝对布局AbsoluteLayout
17界面组件
基本:文本框(TextView) 编辑框(EditText)按钮(Button)图片按钮(ImageButton)
单选按钮(Radiobutton)复选框(CheckBox)状态开关按钮(ToggleButton)
时钟(AnalogClock和DigitalClock)图像视图(ImageView)
高级:自动完成文本框(AutoCompleteTextView) 列表选择框(Spinner)
日期、时间选择器(DataPicker和TimePicker)进度条(ProgressBar)
拖动条(SeekBar)星级评分条(RatingBar)选项卡(TabHost)滚动视图(ScrollView)
列表视图(ListView和ListActivity)
对话框:AlertDialog非阻塞式对话框 ProgressDialog进度对话框 DatePickerDialog 日期选择对话框
TimePickDialog时间选择对话框
18 事件处理
基于监听的事件处理: eventsource事件源 event事件 eventlistener事件监听器
①获取普通界面组件(事件源),也就是被监听的对象。
②实现事件监听器类,该监听器类是一个特殊的java类,必须实现一个xxxListener接口
③调用事件源的setXXXListener方法将事件监听器对象注册给普通组件(事件源)。
基于回调的事件处理:重写组件的事件响应方法
19Handler消息传递机制
Handler类的作用:在新启动的线程中发送消息;在主线程中获取、处理消息
20资源
android应用资源可分为两大类:无法直接访问的原生资源,保存在asset下;可通过R资源清单类访问的资源,保存在res目录下。
①java中使用资源:
R类为res目录下所有资源创建索引项 <package_name>R.<resource_type>.<resource_name>
②在xml中使用资源:
@[<package_name>:]<resource_type>/<resource_name>
21图形与图像处理
android的图片资源不仅包含png、jpg、gif等格式的位图,也包括使用xml资源文件定义的各种Drawable对象。 R.drawable.file_name。
Canvas代表了依附于指定View的画布;Paint代表了Canvas上的画笔。
双缓冲技术:当程序需要在指定View上进行绘制时,程序并不直接绘制到该view上,而是先绘制到一个内存中的Bitmap图片(这就是缓冲)上,等到内存中的bitmap绘制好了之后,再一次性将bitmap绘制到view上。
Matrix是Android提供的一个矩阵工具类,它本身并不能对图像或组件进行变换,但它可与其他API结合来控制图形、组件的变换。使用Matrix控制图像或组件变换的步骤为:
①获取Matrix对象,该对象既可新建,也可直接获取其他对象内封装的Matrix
②调用Matrix的方法进行平移、旋转、缩放、倾斜等
③将程序对Matrix所做的变换应用到指定图像或组件
SurfaceView一般会与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,调用SurfaceView的getHolder()方法可获取SurfaceView关联的SurfaceHolder。
22 OpenGL ES
android的三维坐标系统中:
坐标原点位于中央,X轴从左向右延伸,原点左边的值为负,原点右边为正;
Y轴从下向上延伸,原点下边为负,上边为正;Z轴屏幕里面向外面延伸,里面为负,外面为正。
ES1针对固定管线硬件;ES2针对可编程管线硬件。
Android为OpenGL ES支持提供了GLSurfaceView组件,这个组件用于显示3D图形,GLSurfaceView.Renderer完成在SurfaceView中对3D图形的绘制。
android中使用OpenGL ES的三个步骤:
①创建GLSurfaceView组件,使用Activity来显示GLSurfaceView组件。
②为GLSurfaceView组件创建GLSurfaceView.Renderer实例,实现GLSurfaceView.Renderer类时需要实现该接口里的三个方法。 onDrawFrame 绘制当前帧;onSurfaceChaged 大小变化时回调;onSurfaceCreated 当GLSurfaceView创建时调用
③调用GLSurfaceView组件的setRenderer()方法指定renderer对象,该对象完成GLSurfaceView里3D图形的绘制。
难点在于如何实现renderer类。绘制3D图形不仅需要定义各顶点位置的坐标,还需要定义3D图形的各个三角面由哪些顶点组成。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////——————————————分割线,下面是java的基本知识
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
15 封装类
在jdk中针对各种基本数据类型分别定义相应的引用类型,为封装类。基本数据类型只能按值传递,封装类按引用传递。封装类可以将基本数据类型封装成对象。基本类型在堆栈上创建,而对象类型在堆上创建(对象的引用在堆栈上创建)。在堆栈上分配内存效率高,但有内存泄漏的问题。
封装类还可实现基本类型变量和字符串之间的转换。把字符串类型转换为基本类型的方式 :
①利用封装类提供的parseXxx(String s)静态方法。②利用封装类的构造器Xxx(String s).
把基本类型转换为字符串的方式: String.valueOf()
16 final
对于一个final变量,如果是基本数据类型的变量,则初始化后不能更改;如果是引用类型的变量,则在初始化后不能再指向另一个对象。
17 多态
如果一个引用类型变量声明为父类的类型,但实际引用的是子类的对象,那么该变量就不能再访问子类中添加的属性和方法。
18 嵌套类 内部类 http://blog.csdn.net/hguisu/article/details/7270086 《疯狂java讲义》P199
嵌套类(nested class)有两种类型:静态嵌套类和非静态嵌套类(内部类inner)。
外部类中的内部类:①对于内部类,定义类的class时不加public或private,加了没有任何影响
②内部类中可以直接访问外部类的数据成员和方法。③内部类只在外部类的作用域内可知,类外不可用内部类。外部类或同层次的内部类在访问内部类时,需进行实例化内部类。
内部类在使用时必须实例化。子类要想使用父类的内部类时,父类必须实例化内部类作为属性或包含在方法中。OurterInstance.new InnerConstructor().
在外部类以外创建内部类对象时,对于静态内部类只需使用外部类即可调用构造器,对于非静态内部类必须使用外部类对象类调用构造器。
方法内部类:①方法内部类只能在定义该内部类的方法内实例化,不可在此方法外对其实例化。②方法内部类对象不能使用该内部类所在方法的非final局部变量。
匿名内部类 https://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html
19 修饰符的适用范围
20 JAVA线程通信
java中多线程机制通过虚拟CPU实现,java的线程通过java.lang.thread类来实现,它内部实现了虚拟CPU的功能,能够接收和处理传递给它的代码和数据,并提供了独立的运行控制功能。每个java应用程序都至少有一个线程,这就是主线程。java中创建线程的一种方式是通过Thread实现,另一种是通过runnable接口并实现接口中定义的唯一方法run(),可以定义一个线程。
21 instanceof运算符
在强制类型转换前,首先判断前一个对象是否是后一个类的实例,是否可以成功转换,保证代码健壮性。
22 Lambda表达式
Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)的实例。
形参列表。允许省略形参类型。如果形参列表中只有一个参数,甚至连形参表的圆括号也可以省略
箭头->。
代码块。如果代码块只含一条语句,Lambda表达式允许省略代码块的花括号。
23 枚举类 P220
enum定义枚举类,可以有自己的成员变量、方法。一个java源文件中最多只能定义一个public访问权限的枚举类,且该java源文件必须和枚举类的类名相同。 values()返回该枚举类的所有实例。EnumName.VALUE
24 对象在内存中的状态
可达状态;可恢复状态;不可达状态。
25 布局管理器LayoutManager
FlowLayout BorderLayout GridLayout GridBagLayout CardLayout BoxLayout
26 基本组件
Canvas用于绘图的画布;Choice下拉式选择框组件;
27 事件处理
Event Source(事件源) Event(事件) EventListener(事件监听器)
AWT的事件处理机制是一种委派式(Delegation)事件处理方式——普通组件(事件源)将事件的处理工作委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。
事件适配器 匿名内部类实现监听器
28 Swing组件
swing组件采用MVC(model-view-controller,即模型-视图-控制器)设计模式,其中模型model用于维护组件的各种状态,视图view是组件的可视化表现,控制器controller用于控制对各种事件、组件做出怎样的响应。
JComponent抽象类