基本思想:
- 可以基于已有的类创建新的类,这个新的类可以使用父类的方法,而且可以扩展一些新的方法和字段。
- 反射:程序运行期间更多的了解类以及其属性的能力
格式
public class sonClass extends fatherClass{
}
-
子类可以继承父类得那些内容
- 构造方法:public——不能,private——不能
- 成员变量:public——能,private——能
- 成员方法:public——能,private——不能
-
java只支持单继承,不支持多继承,但支持多层继承
多态
-
定义:同类型的对象,表现出的不同形态
-
表现形式:
父类类型 对象名称 = 子类对象
-
多态的前提:
- 有继承/实现(接口)关系
- 有父类引用指向子类对象 //FatherClass obj = new sonClass()
- 有方法重写
-
多态调用成员的特点
- 变量调用:编译,调用都看左边
- 编译看左边的意思是:javac编译代码时,会看左边的父类中有没有这个变量,有就编译成功,没有则失败
- 运行看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
- 方法调用:编译看左边,运行看右边
- 编译看左边:javac编译代码时,会看左边的父类中有没有这个方法,如果有,编译成功
- 运行看右边:java运行代码时,实际上运行的是子类中的方法
- 变量调用:编译,调用都看左边
-
多态的优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
- 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,
-
多态的弊端
-
不能调用子类的特有功能,就是子类里如果有一个方法,但是父类没有,此时new出来的对象是不可以用子类的方法的
class Father{ public void fatherFN(){ System.out.println("父类方法") } } class Son extends Father{ @Override public void father(){ System.out.println("重写父类方法") } public void sonFN(){ System.out.println("子类特有方法") } } public class Test{ public static void main(String[] arg){ Father obj = new Son(); obj.sonFN();//此时会报错 } } 解决方案1:把obj强制转换回Son类型 Son obj2 = (Son) obj
-
阻止类的继承
- 使用final 关键字声明类,即可表明此类不可继承,里面的方法也会变成不可继承的,但是字段不会。
抽象类
-
格式
//抽象类 public abstract class Person{ public abstract void PersonFn(){} }
-
注意事项
- 抽象类不能实例化
- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
- 可以有构造方法
- 抽象类的子类
- 要么重写抽象类中的所有抽象方法
- 要么是抽象类
-
equals:对象比较方法,判断对象引用是否相等
泛型数组列表 ArrayList
-
声明:
ArrayList<Employee> saffName = new ArrayList<Employee>(100);//100可选,表示初始容量
-
添加元素:
//Employee 表示和上面的employee是同一类型 saffName.add(new Employee("..."))
-
分配空间
saffName.ensureCapacity(100)
-
获取长度
saffName.size();
-
确定数组长度,不再发生变化
saffName.trimToSize(); 此方法应该在确定不再向数组添加元素的时候才用
-
ArrayList<>,元素不可以是基本类型,但是可以是包装后的基本类型
- java方法的参数总是按值传递
对象包装器
- int——Integer类
- long —— Long类
- float——Float类
- double——Double类
- short——Short类
- byte——Byte类
- char——Character类
- boolean——Boolean类
- 前六个派生于于公共的超类Number
枚举类
-
当需要定义一组常量的时候,强烈建议使用枚举类
-
定义:类的对象只有有限个,确定的。我们称此类为枚举类
-
示例:
package com.shuaige.Person; public enum Size { SMALL("S"),MEDIUN("M"),LARGE("L"),EXTRA_LARGE("XL"),HELLOWORLD("HELLO"); private String abbreviation; private Size(String abbreviation){ this.abbreviation = abbreviation; } public String getAbbreviation(){ return abbreviation; } }
- 声明一个类,他刚好有四个实例,不可能构造新的对象
- 枚举类的构造器总是私有的
-
枚举类的方法
-
toString()
Size.SMALL.toString();//返回'S'字符串
-
valueOf()
Size s = Enum.valueOf(Size.class,"SAMLL") //将s设置成Size.SMALL //其中Size.class是用来获取Size类的class对象的
-
values()
Size[] arrList = Size.values(); //返回枚举类中的元素,并组成一个数组
-
ordinal()
Size.MEDIUN.ordinal();//返回该元素所处位置的下标(索引)
-
继承的设计技巧
- 将公共操作和字段放在父类中
- 不要使用受保护的字段
- 除非所有继承的方法都有意义,否则不要用继承
- 在覆盖方法时,不要改变预期的行为
- 使用多态,而不要使用类型信息
- 不要滥用反射