标签:c函数 val 运行时 his 打印数组 调用 tin ges 后台
http://www.cnblogs.com/tianzijiaozi/diary/2017/08/10/7340813.html
一切皆对象 Java
1、 利用new关键字创建新对象
★ String s=new String(“asdf”);
这个过程做了哪些操作呢?
⑴ 申请存储空间
⑵ 调用构造函数进行初始化
⑶ 返回一个首地址(Java称为引用)
2、 存储在什么地方?
★ 寄存器(速度最快)
★ 堆栈(快速)
★ 堆(灵活,但速度相对较慢)
★ 常量存储(直接存储在代码中)
★ 非RAM存储(外部存储)
寄存器:最快,不能直接控制,写程序的时候感觉不到寄存器的存在
堆栈:位于通用RAM(随机访问存储器)中,但通过堆栈指针可以直接从处理器那里得到支持,堆栈指针若向下移动,则分配新的
内存,若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,JAVA系统必须知道存储
在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。
堆:一种通用的内存池(也位于RAM)中,用于存放所有JAVA对象。堆不同于堆栈的地方是:堆不需要知道存储的数据在堆里存活
多长时间。因些,在堆里分配存储空间有很大的灵活性。当需要一个对象时,只需要用NEW写一行简单的代码,当执行这行代码时
,会自动在堆里进行存储分配。缺点是用堆进行存储分配和清理要比用堆栈更耗时。
常量存储:常量值一般直接放于程序内部,这样做是安全的,因为它们永远不可能改变。如果是嵌入式,可能常量本身会和程序
分开,放在ROM中
非RAM存储:如果数据完全存活于程序之外,那么它可以不受任何程序的影响。比如流对象和持久化对象
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写
程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作
用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。
Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)发现无用信
息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
1、Java文件注释头(类、函数)
2、 包的声明和引用 规则一:包名应该是独一无二的 规则二:包名通常情况下都应该是小写的ASCII字母 规则三:包名
一般是公司域名的倒序,经常用到得域名后缀有cn, com, edu, gov, mil, net, org 规则四:域名后面的部分可以根据习惯命
命名
3、类的声明和引用
规则一:每个单词的首字母均大写
规则二:其它标识符:风格与类名类似,只是第一个单词的首字母小写
4. 代码行长度 规则: 一般来说Java的代码行长度应该小于80个字符。
5. 良好风格的代码。
2、代码组织
⑴ 每个Java文件都有一个public类(主类)以及若干个非public类(辅助类)
★ 当编译Java文件时,每个类都会有一个输出文件(.class文件)
⑵ 类库(Class Library)
★ 由若干个Java文件和更多的.class文件组成
◆ 若我们希望这些文件同属于一个群组,就得使用包。
1、权限的含义
public:公共访问权限
private:私有访问权限
protected:保护访问权限
缺省:包访问权限
★ 前两者同C++ 中的含义完全一致
而protected:=子类+包访问权限
◆ 如果没有提供任何访问权限修饰词,则意味它是包访问权限
2、缺省:包访问权限
★ 可以被处于同一个包中的所有类访问。
★ 由于同一包中的类在缺省情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个包里。
★ 访问权限控制的第二基本原则:类消费者一般不能享有包访问权限,防止类的消费者访问并修改包中的类。、
★ Java类的访问权限有两种
public权限
包访问权限
(但内部类可以是private或protected的)
下面是各种访问权限的作用
2、Java中如何清理?
答案:垃圾回收器,垃圾回收器只知道释放那些经由new关键字分配的内存。
★ 问题1:是否存在不经new分配的内存?
◆ 如果不存在:上面一段话应该改为垃圾回收器能够回收一切不再需要的内存
◆ 如果存在:但在Java中一切都是对象,而对象必须经由new关键字来分配内存
◆ 答案:确实存在着不经new分配的内存(利用本地方法调用非Java代码,如C的malloc函数)
★ 问题2:垃圾回收器是否知道如何释放这块特殊的内存?
◆ 答案很显然:不知道
◆ 那么这块特殊的内存如何释放呢?Java允许在类中定义一个finalize()方法,可以通过调用该方法来实现。
在Java中,我们new完对象之后,垃圾回收器负责回收无用的对象占据的内存资源。
Java虚拟机采取了一种自适应的垃圾回收技术。
停止-复制:先暂停程序(它不属于后台回收模式),然后将所有存活的对象从当前的堆中复制到另一个堆中,没有复制的对象就是
垃圾,而被复制到新堆中的对象会紧凑的排列。
标记-清扫:遍历所有引用,进而找出多有存活的对象。当没找到一个存活的对象,就会给对象标记,这个过程中不会清理任何对
象。只有全部标记完成之后,才会清理垃圾。
在Java虚拟机运行过程中,如果所有对象稳定,垃圾回收器效率降低的话,就会切换到"标记-清扫";同意,Java虚拟机会跟踪"
标记-清扫"效果,要是堆空间出现很多碎片,就会切换到”停止-复制“;
2、指定初始化
★ Java允许:在定义类的数据成员的同时可以为其赋初值
◆ 优点:简单直观
缺点:每个对象都具有相同的初值
void public class InitialValues2
{ int i ; // 自动初始化
int j = 999;… // 先自动初始化,再指定初始化
}
◆ 注意:C++不允许这样做,必须全部通过构造函数来初始化。
1、 数据成员初始化的第一基本原则
★ 可以用构造器来进行初始化
◆ 执行顺序是:先自动初始化,再指定初始化,最后调用构造器进行初始化。
变量定义的先后顺序就是其初始化顺序。
★ 初始化的第二基本原则
◆ 初始化的顺序是先静态对象,而后是非静态对象
1、 有关数组的基本知识
⑸ 数组的大小(与C/C++很大不同)
★ 数组的大小可以在运行时刻才决定,但是不推荐这种使用方式
如:int[] a; a = new int[rand.netInt(20)];
⑹ 数组元素的类型可以是对象引用,这种数组称为引用数组
★ 注意对引用数组进行初始化,否则在程序中所使用的是空引用(null)。
2、 可变参数列表。
★ 应用于参数个数或类型未知的场合。
public class NewVarArgs { // 可变参数列表的语法
static void printArray(Object...args){
for(Object obj : agrs) // Foreach语法
System.out.println(obj+“”);
System.out.println();
}
public static void main(String[] args){
printArray(new Integer(47),new Float(3.14),new Double (11.11));
printArray(47,3.14F,11.11);
printArray(“one”,“two”,“three”);
printArray(new A(),new B() new C());
..... }
}
问题:
1、创建一个类,它包含一个int域和一个char域,它们都没有被初始化,将它们的值打印出来,以验证Java执行了默认初始化。
2、编写一个程序,展示无论你创建了某个特定类的多少个对象,这个类中的某个特定的static域只有一个实例。
答:
1. public class excercise8_9 {
public static void main(String args[]) {
A c = new A();
System.out.println(c.toString());
}
}
class A {
int a;
char b;
public String toString(){
return "a="+a+" b= "+b;
}
}
2.public class excercise8_9 {
public static void main(String args[]) {
A a = new A();
A b= new A();
a.print();
b.print();
A c= new A();
a.print();
b.print();
c.print();
}
}
class A {
static int a;
A()
{
a++;
}
public void print()
{
System.out.println(a);
}
}
问题:
1、 创建一个类,它包含了一个在定义时就被初始化了的String域,以及另一个通过构造器初始化的String域。这两种方式有何差异?
2、编写具有两个(重载)构造器的类,并在第一个构造器中通过this调用第二个构造器。
3、创建一个String对象数组,并为每一个元素都赋值一个String。用for循环来打印数组。
答:
1、class
A{
private String str1;
private String str2;
A( )
{
String str2=new String(“test”);
}
}
2、class A{
int i;
A(){
this(0);
}
A(int j)
{
i=j;
}
}
3. public static void main(String args[]){
String[] test = {"what","are","you","doing","now"};
for (int j = 0; j < test.length; j++) {
System.out.println(test[j]);
}
}
问题:
1、在某个包中创建一个类,在这个类所处的包的外部创建该类的一个实例。
2、创建一个带有public,private, protected 和包访问权限域以及方法成员的类,创建该类的一个对象,看看你在试图调用所有类的成员时,会得到什么类型的编译信息。请注意,处于同一个目录的所有类都是默认包的一部分。
答:
1.
package excercise1;
import excercise2.*;
public class excercise1 {
public static void main(String[] args)
{
excercise1 a=new excercise1();
}
}
package excercise2;
public class excercise2 {
public excercise2(){
System.out.println("hello");
}
}
2.
可以顺利访问protected和public方法、包可见方法,但private的内容编译器报错,
标签:c函数 val 运行时 his 打印数组 调用 tin ges 后台
原文地址:http://www.cnblogs.com/tianzijiaozi/p/7642605.html