向上转型(upcast):基于多态,将子类类型转化为父类类型。如:Animal a = new dog();
可以看出向上类型转型是隐式的。
7.
向下转型(downcast): 基于多态,将父类类型转化为父类引用所指向的子类类型。如:
Dog d = (dog) a;如果animal还有一个cat子类,cat c = (cat) a;就会出现编译错误,因为父类引用a只指向了子类dog。可以看出,向下类型转换是显示的。
8.
抽象类(abstract class): 类名前有abstract的关键字的类。抽象类不能实例化。
9.
抽象方法:方法头中有abstract关键字的,且只有声明没有实现的方法。
10.
抽象方法一定定义在抽象类中,抽象类中可以有具体的实现的方法,也可以是全部都是具
体的方法,也可以是空的方法体。
11.
抽象类和继承:当一个类继承abstract类,必须得实现其中所有的抽象方法。如果没有实现抽象方法,该类也必须的声明为abstract类。
12.
抽象类的作用:在和继承几何在一起的时候,抽象类就是定义一种规范,具体怎么实现根据子类的逻辑由子类自己决定。
1. interface(接口):接口的地位和Class一样。定义 public interface 接口名{ }。接口里面的方法默认都是抽象的,所以定义方法时可以省去abstract.
2. interface 和抽象类的比较:接口是特殊的抽象类。抽象类中的方法可以是具体的,但接口里面的方法都必须为抽象的。
3. 类和接口:类可以实现interface,使用关键字implements。类可以多实现,接口之间用逗号隔开,在实现的过程中,该类必须实现所有接口中的所有抽象方法。如果没有全部实现,该类必须的声明为抽象方法,也就是在类名前加关键字abstract.
4. 继承和接口:java中继承是单继承,可以使用多实现模拟多继承。类可以同时继承和多实现。
5. 接口和多态:接口引用指向实现该接口类的对象也是多态的一种表现形式。接口和实现该接口的类之间的强制转化和父类与子类之间的强制转化一样。
抽象类和多态呢?一样可以
6.
Static关键字:可以修饰类,可以修饰方法,也可以修饰属性。
Static修饰属性:当属性被static关键字修饰时,该属性被该类的所有对象所共享。修改一个对象的static属性,将联动修改到其它对象的静态成员属性。在使用该属性时,可以通过类名.属性来调用该属性。
Static修饰方法:当方法被static所修饰,该方法称为静态方法。和属性一样,推荐使用类名.方法来调用。静态方法不能被继承,当子类中有和父类中一样声明的方法,就方法体不同,这不是重写,而是方法的隐藏。在多态中,animal a = new dog(); a.sing()调用的是父类animal中的静态sing()方法。总结,多态中调用到底父类还是子类中静态方法,看是父类还是子类引用在调用。
7.
子类静态方法隐藏父类静态方法,子类具体方法实现父类具体方法。如出现不一致的情况,就出出现编译出错。
8.
Final关键词:可以修饰类,方法,属性。总之,一句话被final修饰的对象,该对象就是终态,就不能动了。
Final修饰属性,标明该属性为一个常量。
Final修饰方法,表明该方法不能被重写。
Final修饰类,表明该类不能被继承。
当final修饰原生数据类型变量,表明该变量的值不能被改变;当final修饰引用数据类型变量,说明该变量不能再指向另外的对象,但该对象的属性可以改变。
Final成员变量赋值的两种方式:
(1) 在声明的时候就赋值,如 final int a = 10;
(2) 在声明的时候没赋值,但在每个构造方法上都给final成员变量赋值。
9.
静态代码块(static block):是完成一些初始化的工作,在类被加载的时候就执行且优先于构造方法执行,且只执行一次。构造方法可以多次执行,每产生一个对象就调用一次构造方法。
静态代码块和继承:当静态代码块和继承结合在一起,首先会执行父类的静态代码块,然后才是子类的静态代码块。
10.
静态方法和非静态成员变量:不能在静态的方法中访问非静态的成员变量,可以在静态方法中访问静态成员变量,在非静态方法中既可以访问静态成员变量也可访问非静态成员变量。总结:静态方法只能访问静态成员变量,非静态的方法既可以访问静态成员变量也可访问非静态成员变量。(注:这里的静态方法不包括main方法)
11. 不能在静态方法中使用this关键字
12. interface中可以定义成员变量,并且该变量是public, static, final的。不过一般情况下,interface中不定义成员变量。Interface中方法都是public的。
13.静态方法的作用是什么?
14. 在定义类时,关键字abstract和final不能同时使用。原因是abstract定义的类必须有实现类,也就是说必须有子类;而final修饰的类是最终类,不能有子类。这就导致了矛盾。
14. 单例模式
Class Singleton{
Private Static Singleton singleton //= new Singleton();
Private Singleton(){
}
Public static Singleton getInstance(){
// If( singleton==null) singleton= new Singleton();
Return singleton
}
}
Public class SingletonTest{
Public static void main(String[] args){
Singleton single = Singleton.getInstance();
}
}
15. String:String类是一个最终态类,并且一旦给string实例对象赋值后就不能改变,除非是生成新的对象。String是常量。”+”拼接字符串,产生新的字符串对象,而不是对之前字符的改变。
1)String的直接字面赋值: String s = “abc”的详细创建过程:String类中维持着一个string pool,当使用直接字面赋值时,首先去string pool中去找有没abc这个对象,如果没有就会在string pool中创建一个abc字符串实例对象,并将对象地址返回给引用。如果abc已经在string pool中存在,就不需要再创建,直接将已有的对象地址返回给引用。
2)new的方式生成string对象,如 String s = new (“abc”);的详细创建过程:在创建对象的过程中,首先会去找string pool中有没存在abc,如果没存在的话,会在string pool中创建abc实例,然后再去heap中创建一个abc实例,并将heap中的地址返回给引用。如果在string pool中存在abc实例对象,就直接去heap中创建abc实例对象,并将heap中的地址返回给引用。
16. intern方法:string字符串对象如hello调用intern方法,hello.intern();的作用是如果string pool中是否有hello这个字符串,并且用equals()方法判定字符串池中的hello和调用intern()方法的hello字符串相等,就返回字符池中的hello字符串。如果string pool中没有hello,就将hello字符串加入string pool,并返回hello这个字符串。
s.intern()==t.intern()要相等首先必须得s.equals(t)的值是ture。这是因为string pool中一个字符串已存在了就不再创建新的字符串了。