1.动态绑定的概念:
父类类型的引用指向子类对象调用的是子类的方法
子类类型的引用指向子类对象调用的是子类的方法
①当父类类型的引用指向子类对象时,且调用子类特有的方法,此时编译器会报错
Parent name=new Son();//向上转型
name.子类特有方法();//编译器报错
推测分析:
使用父类类型存储子类对象,就相当于进行啦向上转型,子类对象多出父类型的那一部分被舍弃,所以无法访问。
题目:
2.字符串的比较
str1==str2 比较的是地址,判断str1和str2是否指向同一个对象
str1.equals(str2) 比较的是内容,判断srt1和sr2指向的字符串对象的内容是否相同
题目:
3.指向null的对象依旧可以调用类的成员方法
对于类的成员方法来说,并不是一个对象对应一个单独的成员方法,而是此类的所有对象共用这个成员方法体。当程序被编译之后,此成员方法地址即已经确定。
而成员方法之所以能把属于此类的各个对象的数据区分开,就是利用this。方法体内所有对类数据成员的访问都会被转化为this.数据成员的方式。
题目:
对于test.hello()这个语句描述正确的有:能编译通过,且正常运行
4.super和this关键字
http://blog.csdn.net/qq_34626097/article/details/82990959?utm_source=app
①super(),this()必须放在第一行
super():防止子类后边调用父类的属性,在第一行就初始化父类
this():自带super()保证父类初始化的唯一性,不会出自按多次重复的初始化
②this关键字
this关键字可以出现在构造方法和实例化方法中,不能出现在静态方法中(static与对象解绑,所以不存在对象这一说),静态方法可以通过类名来调用,这时可能还没有对象。
①用在构造方法中:
调用本类的其他构造方法,格式this()
②代指当前对象:
this.属性 this.方法
③super关键字
①在子类的构造方法中
调用父类的构造方法,如果子类中没有super关键字,系统会默认调用父类没有参数的
构造 方法,即隐含super(),此时父类一定应该有一个无参的构造方法
②使用super关键字调用被子类隐藏的成员变量和方法
如果子类定义啦和父类具有相同名字的成员变量,子类就移仓啦父类继承的成员变量。
如果子类定义的某个方法与父类完全相同,那么继承来的父类方法就会被子类重写
由于this函数指向的构造函数默认有super()方法,所以规定this()和super()不能同时出现在一个构造函数中。
5.子类,父类,构造方法
①创建子类对象时会先执行父类的无参构造方法,再执行相应的子类的构造方法
②子类构造器的默认第一行就是super(),默认调用直接父类的无参构造。这也就是一旦一个子类的直接父类没有无参的构造的情况下,必须在自己构造器的第一行显式的指明调用父类或者自己的哪一个构造器。
6.static关键字
http://blog.csdn.net/qq_34337272/article/details/82766943?utm_source=app
①修饰成员变量和成员方法
被static修饰的成员只属于某个类,不属于单个的对象
被static修饰的成员变量属于静态变量,静态变量存放在Java内存的方法区,方法区和堆区
一样,是各个线程共享的内存区域。
表明为全局变量,声明为static的变量实质上就是全局变量
②修饰代码块
静态代码块定义在方法外,在非静态代码块之前执行,该类不管创建多少个对象,静态代码
块只执行一次。(静态代码块–非静态代码块–构造方法)
③静态内部类
④。。。
7.抽象方法,抽象类
①抽象方法
是一个模板或约束,避免了子类的随意性,需要实现它的类必须重写它的抽象方法
不可以写在普通类中
没有方法体
②抽象类
抽象类是有抽象方法的类;
抽象类的关键字:abstract;
特点:
抽象类不可以实例化;
继承一个抽象类,必须要实现抽象类中的抽象方法,除非子类也是抽象类
声明:
抽象类不可以实例化但是可以通过下列两种方法声明:
1、父类类型的引用指向子类的对象;
2、 接口类型的引用指向该接口的实现类的对象;
以上两种使用方式也就是所谓的“向上转型”。
9.抽象类的使用
①抽象类遵循的原则:
(1)abstract关键字只能修饰类和方法,不能修饰字段。
(2)抽象类不能被实例化(无法使用new关键字创建对象实例),只能被继承。
(3)抽象类可以包含属性,方法,构造方法,初始化块,内部类,枚举类,和普通类一样,普通方法一定要实现,变量可以初始化或不初始化但不能初始化后在抽象类中重新赋值或操作该变量(只能在子类中改变该变量)。
(4)抽象类中的抽象方法(加了abstract关键字的方法)不能实现。
(5)含有抽象方法的类必须定义成抽象类。
②抽象类与接口的区别
(1)接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。
(2)abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。
(3)在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是 public abstract 类型的。
(4)abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"has-a"关系。
(5)实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。抽象类中可以有非抽象方法。接口中则不能有实现方法。
(6)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以在子类中重新赋值。
10.对象加锁互斥