继承
1、继承是Java实现‘代码重用’的重要手段之一。Java只支持单继承,一个类只能有一个直接父类。java.lang.Object类是所有Java类的祖先。
继承表达的是is a 的关系,Dog is a Pet 。狗继承宠物,苹果继承水果
语法: 修饰符 SubClass extends SuperClass{
//类定义部分
}(子类=>SubClass,父类=>SuperClass。)
继承:通过extends关键字实现。
(优点:方便修改代码;减少代码量、避免代码重复。)
修饰符如果是public,则该类在整个项目中可见,若无public修饰符,则该类只在当前包可见(friendly);不可以是用哪个private 和protected修饰类
super() 调用父类的构造方法
调用父类方法:super.方法名();
子类可以继承父类的:
- 继承public和protected修饰的属性和方法,无论子类父类是否同包
- 继承默认权限修饰符修饰的属性和方法,但是子类父类要同包
- 无法继承private修饰的属性和方法
- 无法继承父类的构造方法
重写
如果从父类继承的方法不能满足子类的需求,则在子类中可以对父类的同名方法进行重写(覆盖),以符合需求
(子类中重写的方法和父类中被重写的方法必须具有相同的方法名、参数列表,返回值类型必须和被重写方法的返回值类型相同或是其子类。)
调用父类方法:super.方法名();
super代表对当前对象的直接父类对象的默认引用,在子类中通过super来访问父类成员
如果子类构造方法中没有通过super显示调用父类的有参构造,也没有通过this显示调用自身其他构造方法,则系统会默认先调用父类的无参构造方法
1.父类必须出现在子类(子类的方法和构造方法)
2.可以访问父类成员,如父类的属性,方法,构造方法
3.无法通过super访问private成员
Object类的重写
java.lang.Object类是所有Java类的祖先,所有Java类都直接或间接继承了java.lang.Object,在定义一个类时,如果没有使用extends关键字继承某个类,那么这个类直接继承Object类。所有对象都继承这个类的方法。
instanceof用于判断一个引用类型所引用的对象是否是一个类的实例,返回一个boolean值
可以用来判断是否是父子关系
//Java中的instanceof是用来判断某个实例是不是某个类的实例。
例如:A instanceof B (A为某个实例,B为某个类名)
如果A为B的实例,则:(A instanceof B)==true 反之==false
Object类中的equals()方法用于比较两个对象是否是同一对象,若是,返回true
抽象类和抽象方法
抽象类:不能实例化。抽象类中可以有零到多个抽象方法。非抽象类若继承抽象类,则必须重写父类的所有抽象方法。
(抽象类和抽象方法的特点:①都通过abstract关键字来修饰。②抽象类不能实例化,类中可以有零到多个、甚至全部都可以是抽象方法。③抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明成抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是抽象类。
abstract可以用来修饰类和方法,但不能用来修饰属性和构造方法。)
用于父类不能被实例化
抽象方法:没有方法体;必须在抽象类里;必须在子类中被实现,除非子类是抽象类。
(例:public abstract void print();)
final:
用final修饰的类,不能再被继承。用final修饰的方法,不能被子类重写。用final修饰的变量将变为常量,只能在初始化时进行赋值,不能在其他地方修改。
final和abstract是功能相反的两个关键字:
· abstract可以用来修饰类和方法,不能用来修饰属性的和构造方法
· final可以用来修饰类、方法和属性,不能修饰构造方法
对于引用型变量,一定要区分对象的引用值和对象属性两个概念,使用final修饰引用型变量,变量不可以再指向另外的对象,但是所指对象的内容却是可以改变的。
final Dog dog = new Dog("ee");
dog.name="QQ"; 正确
dog = new Dog("qq"); 错误
abstract不能喝private/static/final一起用
采用面向对象思想进行设计:①发现类②发现类的属性③发现类的方法④优化设计⑤梳理运行过程。