Java基础——继承

1、继承:提高代码的复用性,让类与类之间产生联系。关键字extends表示继承。
*java支持单继承,不支持多继承(C++支持多继承,java可以通过接口实现多继承)
*在本类中可以用this关键字区分成员变量和局部变量,当子父类出现同名的成员变量时,可以使用super关键字来区分。

2、覆盖:父类定义了功能,子类能直接调用,但当子类对功能有自己的定义时保留父类功能的声明,建立子类自己的特有内容。
*覆盖使用的注意事项:
(1)子类方法覆盖父类方法必须保证子类方法权限大于等于父类权限(public、static、void);
(2)静态只能覆盖静态,或者被静态覆盖;

3、可以通过super实现对超类构造器的调用,但该语句必须是子类构造器的第一条语句。
*问:为什么子类对象初始化都要先访问父类中的构造函数?
因为子类中的所有构造函数的第一行都有一个隐式的super()语句,子类继承了父类的内容,所以创建对象时必须先看父类是如何对内容进行初始化的。
*若子类的构造器没有现实的调用父类的构造器,则将自动调用父类空参数构造器,当父类没有空参数构造器时,子类需要通过显示定义super语句指定要访问的父类构造器,若子类灭有显示的调用,会编译报错。

4、final修饰符可以修饰类、方法、变量,其修饰的类是不可以被继承的,修饰的方法是不可以被覆盖的。
*当使用的数据不变时,需要定义阅读性强的名称来表示该数据,并final化。
*被final修饰的变量名称规范是所有字母大写,若由多个字母组成,需要通过“_”分隔。

5、继承层次:由一个公共父类派生出来的所有类的集合。
继承链:在继承层次中,从某个特定的类到其祖先的路径。
多态:一个对象变量可以只是多种实际类型的现象;
动态绑定:在运行时能够自动选择调用哪个方法的现象。

6、多态对成员的调用:
(1)成员变量:当子父类出现同名的成员变量时,多泰调研只看调用该成员变量的引用所属的类中的成员变量(无论编译还是运行时都看等号的左边);
(2)成员函数:出现一模一样的函数时,多态调用编译时看引用变量所属事的类中的方法,运行时看的是对象所属的类中的方法,成员方法动态绑定到当前的对象上(编译看左边,运行看右边)
(3)静态函数:出现一模一样的函数时,多态调用在编译和运行是看引用变量所属的类中的方法。简单说,编译运行看左边。
*真正的调用静态方法是不需要对象的,直接类名调用,因为静态方法绑定到类上。

7、阻止继承:final类和方法
不允许被扩展的类称为final类,将方法或者类声明为final主要目的是确保它们不会在子类中改变语义。

8、强制类型转换:将一个类强制转换成另一个类。将一个值存入变量时,编译器将检查是否允许该操作,将一个子类的引用赋值给一个超类变量,编译器是允许的,但将一个超类的引用赋值给一个子类变量,必须进行强制转换。
*注意:(1)只能在继承层次中进行强制类型转换;
(2)在将超类转换成子类前,应该使用instanceof操作符检查能否转换成功。

9、抽象类特点:包含一个或多个抽象方法的类必须被声明为抽象的
(1)抽象方法一定要定义在抽象类中,都需要用abstract修饰;
(2)抽象类不能实例化(不能使用new关键字创建对象);
(3)只有子类覆盖了所有的抽象方法后,子类才具体化,子类就可以创建对象,如果没有覆盖所有的抽象方法,那么子类还是一个抽象类。
*抽象类有构造函数吗?
有,抽象类的构造函数不能对象实例化,因为抽象类不能创建对象,但抽象类有子类,它
的构造函数可以子类的对象实例化。
*抽象类与一般类的异同:
相同点:都是用来描述事物,都可以进行属性和行为的描述;
不同点:抽象类描述事物的信息不具体,一般类描述的具体;在代码方面,抽象类可以定义抽象方法,一般类不行;抽象类不可以实例化,一般类可以。
*抽象类一定是父类,必须需要子类覆盖方法后才可以实例化,使用这些方法。
*抽象类中可以不定义抽象方法,仅仅是让类不能创建对象。
*抽象类关键字abstract不能与关键字final,private,static共存。

10、受保护访问(protected):将类中的域标记为private,方法标记为public。任何声明为private的内容对其他类都是不可见的,子类也不能访问超类的私有域。当有时需要子类访问超类的方法或者域,可以将这些方法或者域声明为protected。

*Java用于控制可见性的4个访问修饰符:
(1)仅对本类可见——private;
(2)对所有类可见——public;
(3)对本包和所有子类可见——protected;

11、equals方法:Object类中的equals方法用于检测一个对象是否等于另一个对象。该方法判断两个对象是否具有相同的引用,若两个对象引用相同,它们一定是相等的。
getClass方法将返回一个对象所属的类,只有两个对象属于同一个类,才有可能相等。
*equals方法特性:
(1)自反性:对于任何非空引用x,x.equals(x)返回true;
(2)对称性:对于任何非空引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也返回true;
(3)传递性:对称性:对于任何非空引用x,y和z,若x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也返回true;
(4)一致性:若x和y引用的对象没有发生任何变化,反复调用x.equals(y)应该返回同样的结果;
(5)对于任意非空引用x,x.equals(null)应该返回false。

12、hashCode方法:定义在Object类中,每一个对象都有一个默认的散列码(hash Code,由对象导出的一个整数值),其值为对象的储存地址。
*equals与hashCode的定义必须一致:如果x.equals(y)返回true,那么x.hashCode()就必须与y.hashCode()具有相同的值。

13、toString方法:用于返回表示对象值的字符串。

14、泛型数组列表ArrayList是一个采用类型参数的泛型类。ArrayList管理着对象引用的一个内部数组,若调用add且内部数组已经满了,ArrayList就将自动的创建一个更大的数组,并将所有的对象从较小的数组中拷贝到更大的数组中。
*数组列表容量与数组大小的区别:若数组大小为100,表示数组有100个空位置的储存空间,而容量为100个元素的数组列表只是拥有保存100个元素的潜力(使用完还可以自动扩展)。
*size()方法将返回数组列表中包含的实际元素数目。
*若能够确定数组列表的大小,就可以调用trimToSize方法,将存储区域的大小调整为当前元素数量所需的存储空间数目,垃圾回收器将回收多余的存储空间。

15、访问数组列表元素:增add(),删remove(),改set()
(1)add()方法可在数组任意位置插入元素,若在位置n插入数组,位于n以后的元素都向后移动一位,若数组列表大小超过容量,数组列表就会重新分配存储空间;
(2)remove()方法与add方法相反
(3)使用get和set方法实现访问或者改变数组元素的操作;
*数组实施插入和删除元素的操作效率较低,数组存储的元素数比较多,又经常需要在中间位置插入、删除元素,可考虑使用链表。

16、对象包装器:Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean(前六个类派生于公共的超类Number)
*基本数据对象包装类:将基本数据值封装成对象,可以在对象中定义更多属性和行为,对基本数据进行操作。
*字符串转换成基本数据类型:parseInt、parseDouble、parseByte、parseBoolean

17、自动装箱:可把一个基本类型变量直接赋值给对应的包装类对象或者Object对象;
自动拆箱:允许把包装类对象直接赋给对应的基本数据类型;
*自动装箱和自动拆箱是JDK1.5以后的新技术:
Integer I = new Integer(4);----Interger I = 4;// 自动装箱,实现方式:Integer.valueOf(4);
I = I +6;//右边的i自动拆箱,i.intvalue()+6,运算后的结果与装箱赋值给i。
*两个包装器对象的比较调用equals方法,运算符也可以运用于包装器对象,但其只是检测对象是否指向同一片区域。
Integer x = new Integer(100);
Integer x = new Integer(100);
System.out.println(x
y);//false
System.out.println(x.equals(y));//true
*包装器类的引用可以为null,但在自动装箱有可能会抛出NullPointException异常。

18、反射:能够分析类能力的程序。
*获得Class类对象的三种方法:
(1)Object类中的getClass()方法将会返回一个Class类型的实例,getName方法将返回类的名字;
Class c1 = e.getClass();
(2)可以调用静态方法forName获得类名对应的Class对象
String classname = “java.util.Random”;
Class c2 = Class.forName(classname);
(3)若T是任意的java类型(或void关键字),T.class将代表匹配的类对象
Class c3 = Random.class;
Class c4 = int.class;
Class c5 = Double[].class;
*可以利用==运算符实现两个类对象的比较:if(e.getClass()==Employee.class)
*newInstance()方法可以用来动态的创建一个类的实例:e.getClass().newInstance(); 创建一个与e具有相同类型的实例,newInstance方法调用默认构造器初始化新创建的对象,若这个类没有默认构造器,则会抛出异常。
*forName与newInstance配合起来使用,可以根据存储在字符串中的类名创建一个对象:
String s = “java.util.Random”;
Object m = Class.forName(s).newInstance();
*反射机制的重要内容:检查类的结构。在java.lang.reflect包中有三个类Field、Method、Constructor,分别用于描述类的域、方法、构造器,调用这三个类的方法可查看类的结构。

19、继承的设计技巧
(1)将公共操作和域放在超类中;
(2)不要使用受保护的域;
(3)使用继承实现“is-a”关系;
(4)除非所有继承方法都有意义,否则不要使用继承;
(5)在覆盖方法时不要改变预期的行为;
(6)使用多态,而非类型信息;
(7)不要过多的使用反射。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值