今天看到Java编程思想时有一句 Java永远都是值传递,Java的值传递传递的永远是值的拷贝,意即Java方法的传递只是值的拷贝传递,这一点记录下以防以后自己搞混。
封装继承多态是Java三大特性,发现很多人都很容易被最后的多态搞懵,我自己有时候也容易搞混,这里特地说明下:
对于多态,即父类对象可以由子类对象替代,父类型的变量可以引用子类型的对象。举例:
Father father=new Child()(=左边是父类的一个声明,所有类都有类型,=左边的叫声明类型,右边的child子类对象叫做实际类型,声明类型决定了此变量可调用的方法数量(father包含的所有方法),实际类型决定了此变量具体会调用重写的方法(如果father的方法中有被child重写的那就调用重写的方法),这就跟动态绑定有关),private类不可以被重写,静态方法可以被继承但最好不要重写,重写后会被覆盖,父类的静态被隐藏,我们成这种一般叫静态绑定(final static都是的)
private OverridingFinal2 of2 = new OverridingFinal2();
public static void main(String[] args) {
FinalOverriding finalOverriding = new FinalOverriding();
finalOverriding.of2.a();
finalOverriding.of2.b();
OverridingFinal of = finalOverriding.of2;
of.a();
of.b();
WithFinals wf = of;
wf.a();
wf.b();
}
class WithFinals {
private final void a() {
System.out.println("WithFinals a");
}
private void b() {
System.out.println("WithFinals b");
}
}
class OverridingFinal extends WithFinals {
private final void a() {
System.out.println("OverridingFinal a");
}
private void b() {
System.out.println("OverridingFinal b");
}
}
class OverridingFinal2 extends OverridingFinal {
private final void a() {
System.out.println("OverridingFinal2 a");
}
private void b() {
System.out.println("OverridingFinal2 b");
}
}
}在子类覆盖父类方法时,子类的可见性不能低于父类,基本规范。父类为public ,子类必为public。
方法签名包括方法名参数类型,重写要保证方法签名完全相同,返回类型不是签名,但要保证抱回类型和父类型的兼容性,例如父类型的子类型。
public class Test00001 {
private void method() {
System.out.println("abc");
}
public void method1() {
method();
}
public static void main(String[] args) {
Test00001 test01 = new Test0002();
test01.method1();
System.out.println("------------------------------------------");
Test00001 test02 = new Test00001();
test02.method1();
System.out.println("-------------------------------------------");
Test0002 test03 = new Test0002();
test03.method2();
System.out.println("-----------------------------------------------");
}
}
class Test0002 extends Test00001 {
public void method2() {
method();
}
public void method() {
System.out.println("cde");
}
}
字符串拼接方式,记录一下。
//性能最高的方法
public class Str {
public void testStringBuilder() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sb.append(String.valueOf(i));
}
sb.toString();
}
public static void main(String[] args) {
System.out.println(new CutString().testStringBuffer());
}
}
}
//性能最差
public String testPlus() {
String s = "";
for (int i = 0; i < 10000; i++) {
s = s + String.valueOf(i);
}
return s;
}
//较好
public String testConcat() {
String s = "";
for (int i = 0; i < 10000; i++) {
s = s.concat(String.valueOf(i));
}
return s;
}