java基础<三>

时间:2022-04-28 19:43:41

java基础<三>super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法和属性。

普通方法中:super没有顺序限制,可以随时调用。

构造方法中:任何类的构造函数中,若是第一行没有调用super,则系统会默认调用super()作为父类的初始化函数。java基础<三>

继承:class Mamal2 extends Animal

组合:class Manmal2{ Animal a=new Animal}

"is-a"关系使用继承,"has-a"关系使用组合。

final+变量:常量

final+方法:不可被子类重写,但可被重载。

final+类:不可被继承。如Math,String

java基础<三>java基础<三>

java基础<三>

instanceof:判断某对象是否为某类的实例。

if( c instanceof Cat)

(Cat)c.eat()

抽象类:

有抽象方法的类只能定义成抽象类。抽象类不能被实例化,可以包含属性,方法,构造方法。但是构造方法不能实例化对象,只能被子类调用。抽象类只能被继承,抽象方法必须被子类实现。

写抽象类的时候仍然可以写实现。还不够抽象。

接口:interface.其中只有常量和抽象方法。常量之间都会默认加:public static final 方法前面是:public abstract

回调的实现::::多态,类似于钩子。

java基础<三>

内部类:

1.内部类提供了更好的封装,只能允许外部类访问。不允许同一个包中的其它类访问。

2.内部类可以直接访问外部类的私有属性,内部类被当成外部类的成员,但外部类不能访问内部内的内部属性。

3.通常,内部类使用场合:只为它所在的外部类提供服务。


附两篇内部类讲解:

http://android.blog.51cto.com/268543/384844/

http://android.blog.51cto.com/268543/384809


数组:::::::

int[] a=new int[3]; 它还是对象,内存图:

java基础<三>

数组是相同数据类型的有序集合。

数组也是对象,数组元素相当于对象的成员变量。

数组长度是确定的,不可变。

Car[] cars=new Car[10]; 数组的每个元素4个字节,存放对象Car的引用。

数组有三个特点:长度确定,一旦创建,不能更改。数组元素可以是任何类型,基本类型和引用类型,但必须是同一类型。不允许混合类型。

声明:int[] a,int a[]  

创建:使用new关键字创建数组。a=new int[5];

默认初始化:数组元素相当于对象的成员变量,默认值跟成员变量的规则一样。

静态初始化:int a[]={23,45,56,67}    Car[] cars={new Car("a"),new Car("b")}

String类::::::::(直接看源码,很容易的,边看源码,边学习)

String str=new String("abcd");
String str2=new String("abcd");
System.out.println(str==str2); //false
System.out.println(str.equals(str2)); //true

String str3="abcd";
String str4="abcd";
System.out.println(str3==str4); //true
System.out.println(str==str3); //false

尽量避免使用+号拼接字符串,每使用一次+,便多生成一个对象。效率十分低下。 string类型具有不可变性,对string字符串的操作(如拼接、Trim()等)都会在内存中产生一个新的字符串对象,在对字符串进行频繁修改的情况下,如在For循环中进行操作等,那么将会频繁的创建新的字符串对象,造成系统的不必要开销,所以这种情况下大家都推荐使用StringBuilder类来对字符串进行操作,那么到底是怎么实现的呢?

StringBuilder是动态类型,对字符串的操作只在一个实例上进行修改,达到节约系统开销的目的,而string具有不可变性,一切对string类型的操作都会申请一块新的内存产生新的字符串,可能一般影响不大,但大量的字符串操作,如在循环体中,造成的系统开销是不能忽视的。

3.  StringBuilder:线程非安全的
  StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

对于三者使用的总结:1.如果要操作少量的数据用 = String
       2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
       3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
//Stringbulider与StringBuffer用法完全一样。Stringbuffer(线程安全,效率低。)StringBuilder(线程不安全,效率高)
StringBuilder sb=new StringBuilder();
StringBuilder sb1=new StringBuilder(32);
sb.append(true).append("abc");

数组扩容机制:一次10个,下一次20个再下一次40个。生成一个新数组代替老数组。

分析源码。再简单的问题都可以很复杂。


java基础<三>