package test; public class staticAccess { public int age; public staticAccess grow() { age++; return this; } public static void info() { System.out.println("Simple info way"); } public static void main(String[] args) { staticAccess rt=new staticAccess(); rt.age=10; rt.grow() .grow() .grow(); System.out.println("rt的age Field值是:"+rt.age); info(); } } |
在上面的程序中可以看出,如果在某个方法中把this作为返回值,则可以多次连续调用同一个方法,从而使得代码更加简洁。但是,这种把this作为返回值的方法可能造成实际意义的模糊,例如上面的grow方法,用于表示对象的生长,即age Field的值加1,实际上不应该有返回值。
Java类中的方法
在JAVA中,方法的参数方法只有一种:值传递。
JAVA形参个数可变的方法
在形参的类型后增加三点(…)则表明该形参可以接受多个参数值,多个参数值被当成数组传入。
实际就是数组。
因此,用数组来代替也是可以的。
package test; public class staticAccess { public static void test(int a,String... books) { for(String tmp : books) System.out.println(tmp); System.out.println(a); } public static void main(String[] args) { test(5,"疯狂Java","轻量级JAVA"); } } |
public static void test(int a,String... books)也可改为: public static void test(int a,String[] books) |
注意:
个数可变的形参只能处于形参列表的最后。即,一个方法中最多只有一个长度可变的开参。
package test; public class test { public static void main(String[] agv) { System.out.println("Person's eyeNum class effective:"+Person.eyeNum); Person p=new Person(); System.out.println("Person's Field 值是:"+p.name+"Person's eyeNum Field 值是:"+p.eyeNum); p.name="孙悟空"; p.eyeNum=2; System.out.println("Person's Field 值是:"+p.name+"Person's eyeNum Field 值是:"+p.eyeNum);
System.out.println("hello world Java"); } } class Person { public String name; public static int eyeNum; } |
运行结果:
类中定义的static变量,与C++类中定义的不同。还比JAVA多了一步:
与C++中的声明开辟内存空间相比:
类型 类名::变量名=初值;
主要是:成员变量无须显式初始化,只要为一个类定义Field或实例Field,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化,成员变量默认初始化时的赋值规则与数组动态初始化时数组元素的赋值规则完全相同。
与C++中的静态变量有一个共同之处:
无论这个类的实例有多少个,静态变量的个数只取决于类中定义的静态变量个数.
概念:栈内存中的变量无须系统垃圾回收,往往随着方法或代码块的运行的结束。
注意:
如果一个JAVA源文件里定义的所有类都没有使用public修饰,则这个Java源文件的文件名可以是一切合法的文件名;但如果一个Java源文件里定义了一个public修饰的类,则这个源文件必须与public修饰的类的类名相同。
访问权限:与C++相比,多了一个default。默认是它,称为包访问权限。
package、import、import static
在C++中,与package有相同作用的是namespace。"package"与"namespace"用法不相同.
package packageName;
意义:此文件中的所有东西都是packageName的。有且只有一个。
并且,位于包中的类,也必须有与包同名层次相同的目录结构。
import作用:省略包名
import static 作用:省略写类名
例1:
package lee; public class test { public static void main(String[] agv) {
lee.sub.Apple a=new lee.sub.Apple(); a.out(); System.out.println("hello world Java"); } } |
package lee.sub; public class Apple { public void out() { System.out.println("hello world lee.sub"); } } |
例二:
package lee; import static java.lang.System.*; public class test { public static void main(String[] agave) { out.println("Person's eyeNum class effective:"+Person.eyeNum); Person p=new Person(); out.println("Person's Field 值是:"+p.name+"Person's eyeNum Field 值是:"+p.eyeNum); p.name="孙悟空"; p.eyeNum=2; out.println("Person's Fied 值是:"+p.name+"Person's eyeNum Field 值是:"+p.eyeNum); out.println("hello world Java"); } } class Person { public String name; public static int eyeNum; } |
Java类的继承
第一个不同点:
与C++相比:Java使用了extends关键字来继承父类。
C++只用了两个点:
第二个不同点:
Java语言摒弃了C++中的多继承特征,即每个类最多只能有一个直接父类。
Java重新定义父类方法:重新定义父类方法
在C++的重新定义父类方法 解决方法是 虚函数
在Java中,它的解决方案是规则:两同两小一大。
两同:方法名相同,形参列表相同。
两小:子类的方法返回值类型比父类方法返回值类型更小或相等。
子类的方法声明抛出的异常类应比父类方法声明抛出的异常类小或相等。
一大:子类方法的访问权限应比父类方法的访问权限更大或相等。
super限定
在子类中被重写后,还需调用父类的方法。有两种方法:
父类名为主调 或 用super为主调 来调用父类被重写的方法。
Super是Java的关键字,是用于限定该对象调用它从父类继承得到的Field或方法。
正如this不能出现在static修饰的方法中一样;super也是如此。