首页 > 代码库 > 总结1
总结1
java里方法的参数传递方式只有一种:值传递
例如:
void swap(int a,int b)
{
tmp = a;
a = b;
b = tmp;
}
并不能交换a,b的值
void swap(DataWrap dw)
{
tmp = dw.a;
dw.a = dw.b
dw.b = tmp;
}
可以交换,因为DataWrap是引用类型,所以swap复制了在栈区的dw变量,而不是堆内存中的对象,该dw副本也是指向堆内存中的对象,
因此,swap方法交换了堆内存中的a,b属性
void swap(int [] a)
{
tmp = a[0];
a[0] = a[1]
a[1] = tmp;
}
可以交换,理由同上
形参可变的方法:在最后一个形参类型后面加三点...,其使用效果与使用数组类似,只不过它可以不用创建一个数组,调用更加简洁。但是,一个方法中只能有一个长度可变的形参,并且只能处于形参列表的最后。(大部分时间内不推荐使用,因为意义不大,还降低可读性)
例如:
public class Varargs
{
public static void test(int a,String... books)
{
//books将被当做数组处理
for(String tmp : books)
{
System.out.println(tmp);
}
System.out.println(a);
}
public static void main(String[] args)
{
test(5,"books1","books2","books3");
}
}
成员变量无需显式初始化,只要定义了类属性或实例属性,系统会在这个类的准备阶段或创建这个类的实例时进行默认初始化。
而局部变量除了形参外,都需要显式初始化。否则,不可访问。
如下三种情况需要使用成员变量
1.如果需要定义的变量是用于描述某个类或者某个实例的固有信息。如人的身高、体重。
2.如果在某个类中,需要以一个变量来保存该类或者实例运行时的状态信息。
3.如果某个信息需要在某个类的多个方法之间进行共享。
访问控制级别表
private default protected public
同一个类中 yes yes yes yes
同一个包中 no yes yes yes
子类中 no no yes yes
全局范围内 no no no yes
如果一个Java源文件里定义所有类都没有用public修饰,则这个Java源文件的文件名可以是一切合法的文件名。但如果一个Java源文件定义了一个public修饰的类,则这个源文件的文件名必须与public的类名相同。
控制符使用基本原则
1. 类中的绝大部分属性应该用private修饰,除了一些static修饰的,类似全局变量的属性。一些用于辅助该类其他方法的工具方法,也应该用private修饰。
2.如果某个类主要用作其他类的父类,该类包含的大部分方法仅希望被子类重写而不希望被外界调用,则应该用protected修饰这些方法。
3.构造器和顶级类使用public修饰。
import语句中的(*)只能代表类,不能代表包
例如import java.util.*;仅代表java.util中的类而不包括java.util子包中的类。
如果要使用到java.util.zip包中的类则要使用import java.util.zip.*;语句。
在某些情况下,我们只能在源文件中使用类全名,而不能用import语句,例如我们需使用java.util.*中的Date类,又要使用java.sql.*中的Date类,因为两者都匹配,这时系统将无法分辨。
import除了可以导入类之外,还能导入静态方法
如:
import static java.lang.System.*;
import static java.lang.Math.*;
public class TestStaticImport
{
public static void main(String[] args)
{
out.println(PI);
}
}
一个构造器中直接使用另一个构造器的例子:
public class Apple
{
public String name;
public String color;
public double weight;
public Apple(String name,String color)
{
this.name = name;
this.color = color;
}
public Apple(String name,String color,double weight)
{
this(name,color);
this.weight = weight
}
}
子类不能继承父类的构造器,需要通过super语句调用。
子类中包含与父类同名方法的现象被称为方法重写,也被称为方法覆盖(Override);方法的重写要遵循“两同俩小一大”原则,即方法名相同,方法列表相同,子类方法返回值类型比父类更小或相等,子类抛出的异常比父类更小或相等。子类的访问权限比父类更大或相等。而且,他们要不都是类方法,要不都是实例方法,不能一个是类方法,一个是实例方法。子类要访问父类被覆盖的方法需需要使用super(覆盖的是实例方法)或者父类名(覆盖的是类方法)作为调用者来调用。
子类无法调用、继承、重写父类的private方法,如果子类中有与父类相同类名、返回值的private方法依然不是重写,只是子类中的一个新的方法。
系统查找某变量的顺序为:
1、查找该方法中是否有名为xxx的局部变量。
2、查找当前类中是否有包含名为xxx的属性。
3、查找xxx的直接父类中是否包含名为xxx的属性,依次上溯xxx的父类,直到java.lang.Object类,如果最终找不到名为xxx的属性,则出现编译错误。
无论我们是否使用super调用来执行父类构造器初始化代码,子类构造器都会调用父类构造器一次,因为系统会在执行子类构造器之前,隐式地调用父类无参构造器。
例如:
class Creature
{
public Creature()
{
System.out.println("Creature无参构造器");
}
}
class Animal extends Creature
{
public Animal(String name)
{
System.out.println("Animal带一个参数的构造器,该动物为"+name);
}
public Animal(String name,int age)
{
this(name);
System.out.println("Amimal带俩个参数的构造器,该动物的年龄为"+age);
}
}
public class Wolf extends Animal
{
public Wolf()
{
super("土狼",3);
System.out.println("Wolf的无参构造器");
}
public static void main(String[] args)
{
new Wolf();
}
}
将输出:
Creature无参构造器
Animal带一个参数的构造器,该动物为土狼
Amimal带俩个参数的构造器,该动物的年龄为3
Wolf的无参构造器
java引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时是类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果运行时类型与编译时类型不一致,就会出现所谓的多态(Polymorphism)。
与方法不同,对象的属性则不具备多态性
把一个父类实例强制转换为子类实例,只有这个对象实际上确实是子类的实例才行。
在进行强制转换之前,用instanceof运算符来判断是否可以转换成功,使代码更加健壮,但是,前提是要转换的类型必须是该实例声明类型的子类才可以编译成功。
instancenof运算符使用实例:
public static void main(String[] args)
{
Object hello ="hello";
//String是Object的子类,返回true
System.out.println(hello instanceof Object);
//返回true
System.out.println(hello instanceof String);
//Math是Object的子类,但是,hello不是其实例,所以返回false
System.out.println(hello instanceof Math);
//String实现了Comparable接口,所以返回true
System.out.println(hello instanceof Comparable);
String a = "hello";
//Math不是String的子类,所以无法编译
System.out.println(a instanceof Math);
}
设计父类遵循的规则
1.尽量隐藏父类的内部数据。尽量吧父类的所有属性都设置成private访问类型,不让子类直接访问父类的属性。
2.不要让子类可以随意访问、修改父类的方法。父类中那些仅为工具的方法,应该使用private访问控制修饰符,让子类无法访问;如果父类中的方法需要被外部调用,必须以public修饰,但是又不希望被子类重写,可以使用final修饰符;如果希望父类的某个方法被子类重写,但不希望被其他类访问,可以使用protected来修饰。
3.不用在父类构造器中调用被子类重写的方法(会导致空指针异常)。
需要使用继承的条件
1.子类需要额外增加属性,而不是仅仅是属性值的改变。
2.子类需要增加自己独有的行为方式。
总结1