1.继承就是抽取两者的共性,并修改完善。即子类可以继承父类的成员方法以及成员变量,并可以扩展自己的一些特有的内容。
格式为:
public class 子类名 extends 父类名{
}
例如:publicclassZi extends Fu{
}
2.继承中变量的访问特点:
要是在子类方法中去访问一个变量,则访问顺序是:子类内部成员范围找—子类成员变量范围去找—父类成员范围去找,要是都没有就会报错,不要去考虑父类的父类。
3.构造方法的访问特点:
!!!子类中的所有构造方法都会默认优先访问父类无参构造方法。
其目的是为了帮助继承父类的成员完成初始化操作,要调用父类中的一个特定的构造方法时要在子类的构造方法的第一行写上super(参数 )语句,去调用有参构造方法。
!!!但要是父类中只有有参构造方法时,可以在父类中的有参构造方法的上面第一行人为地再去创建定义一个无参构造方法。
4.super( )与this( )的相似点与区别:
相似点:
4.1. 两者功能相似
4.2. 都必须放在构造方法内的第一行(即super()与this()两者不能同时存在同一个构造方法内)
4.3. 都是指的对象(即super同样不能在static环境中使用,包括静态方法和静态初始化器(static语句块))
4.4. 区别:
super( )是从子类的构造方法去调用父类的构造方法,而this( )则是在同一个类内调用其他构造方法。
5. protected用法:
要想在子类访问父类中的成员则需把父类的成员声明为protected ,则可在子类中直接访问父类中的成员,,系统会优先调用父类中的无参构造方法,则需在父类中定义一个无用的无参构造方法,且在继承构造中,引用父类的某个成员并赋值,再输出,后面按常规来写即可
protect成员不仅可以在父类中直接访问,也可以在子类中去访问父类的成员变量和成员方法如:
package first8;
class Person3 {
protected String name;
protected int age;
public Person3() {
}// 定义一个无用的无参构造方法
public Person3(String name, int age) {
this.name = name;
this.age = age;
}
protected void show() {
System.out.println("姓名:" + name + "年龄:" + age);
}
}
class Student3 extends Person3 {
private String department;
int age = 20;
public Student3(String na, String dep) {
// super(na,age);
super();
name = na;
department = dep;
super.age = 19;
//定义父类中的年龄值
System.out.println("子类Student中的成员变量age=" + age);
super.show();
System.out.println("系别:" + department);
}
}
public class App8_3 {
public static void main(String[] ages) {
Student3 stu = new Student3("李阳 " , "食品科学工程系");
}
}
运行结果为:
子类Student中的成员变量age = 20
姓名:李阳 年龄:19
系别:食品科学工程系
6.覆盖
重写(覆盖):是指在子类中,定义名称,参数个数与类型均与父类中完全相同的方法,用于实现重写父类中同名方法的功能。
覆盖 就是子类和父类的方法和成员变量和成员方法及参数什么的都一样。
即在定义父类已经有的方法时,子类应该与父类的方法有完全一样的方法名,返回值类型和参数,也就是说子类则不能继承父类的方法,是覆盖父类的方法。
@ Override注解可以检验重写是否正确
用法是:在重写方法的前一行写上@Override,要是报错则说明重写中与父类有不同的地方,需认真对比检查改写,不报错则重写正确,注释掉或者删除@Override即可;
子类重写父类时的要求:
1.父类的私有方法不能被子类重写 即子类不能继承私有的方法
2.子类的访问修饰符要比父类的访问修饰符的等级要高(public>默认(void前面没有修饰符的)>private) “要青出于蓝胜于蓝”
3.子类中不能覆盖父类中的声明为final或static的方法
通过父类的对象去访问子类的成员,只能是子类方法覆盖父类方法的情况下才行。
//向上转型:创建父类类型的变量指向子类对象,即将子类对象赋值给父类类型的变量,是将子类对象看作父类对象,是从一个较具体的类到一个较抽象的类之间对的转换,这种技术称为向上转型
向下转换:就是将父类对象通过强制转换为子类型再赋值给子类对象的技术,也就是将较抽象的类转换为较具体的类。例:Student stu = (Student)per 当使用向下转型技术时,必须使用显式类型转换。
7.final最终类
1. 凡是被声明为final的量均为常量,不可被修改,只有在定义时被赋值,且只能赋值一次,不能缺省,不能被子类所继承
赋值方式:
在定义时被赋值
在某个构造方法中进行赋值
1. 父类中被声明为final的成员在子类中可被继承,但不可被覆盖
2. final类不能有子类,被称为最终的方法
3. 被final和static所修饰的成员变量,其实就是常量,只有在定义时才能被赋值
8.object类
object类是所有类的源,或是理解为所有类的父类。而若某个类没有用extends关键字修饰,则默认为java,lang,Object类的子类。equals( )方法和getSring( )方法都是object类所定义的方法,所以两者在任何类中都可以被调用继承
理解:object 类位于类的最顶端
8.1 equals( )方法与" = = "的异同点:
(1)异:
“ = = "是用于比较两个变量中的值是否相同,而equals( )方法则是用于比较两个字符串的内容是否相同
(2)同:
两者都是用来比较两个类类型的变量是否指向同一个对象
而对于非字符串的变量而言,两者都是用来比较其所要指的对象在堆内存中的首地址
8.2 toString( )方法
其功能是将调用该方法对象的内容转换为字符串,并返回其内容,而返回的却是一些没有意义的字符串,所以要是想用其返回方法的内容需重新定义该方法去覆盖父类中的同名方法,即覆盖父类重新定义子类。
8.3.getClass( )方法!!!
功能为:返回运行时的对象所属的类
操作目的说明:因为class类没有构造方法,所以要通过object类的getClass( )方法来获取对象所对应的class对象,那么在取得class对象之后,就可以通过class对象的一些方法来获取类的基本信息
那getClass( )方法就是个"媒婆"呗!!!
8.4 对象运算符 instanceof
注:测试运算符
即可根据返回值去判断测试一个指定的对象是否指定类或它的子类的实例,是则返回true 否则返回false
因为object类中的getClass( )方法是返回运行时的对象其所属的类,返回值是为Class类型的,而class类中的getName( )方法则是返回一个类的名称,返回值是为Sring类型,遵守“即是”法则 ,即通过当前对象this去调用getClass( )方法,得到对象所属的类(class),再用Class中的getName( )方法去得到this类名的字符串,也可以用getSuperclass( )方法获得其父类。
9.抽象类(abstract)
概念:
抽象类是指创建专门的类来作为父类的类。又因为抽象类只能通过抽象类派生出的子类来创建新的对象,而不能直接用原有的抽象类创建新的类,所以抽象类就是不能用new运算符来创建实例对象的类,可以作为父类被它的所有子类所共享
目的:根据抽象类的格式来创建和修改新的类
特点:
1. 以abstract关键字开头
2. 只声明返回值对的数据类型,方法名称与所需的参数,即方法头,而没有方法体,即只需声明,而不需实现,用“ ; "结尾
3. 在抽象方法里面不能定义方法体
4. 声明中static和abstract修饰符不能同时使用
5. 抽象类必须需要被继承,所以不能用final去修饰,即不能为最终类,否则不可被继承,修改,即abstract也不能和final同时使用
6. 也不能与private或者native同时修饰同一个方法
7. 抽象类不一定包括抽象方法,但抽象方法一定要声明为抽象类
8. 抽象类可以有构造方法,并可以有其子类的构造方法所调用,但构造方法不可以被声明为抽象的
抽象类——子类——对象
定义抽象类的格式:
abstract class 类名
{
声明成员变量
返回值的数据类型 方法名(参数)
{
.
.
.
}
abstract 返回值的数据类型 方法名(参数);
}