1 继承
继承关键字 :extends
格式 :
class 类名{
//公共属性和方法
}
class 类名1 extends 类名{
//子类持有的方法和属性
}
子类继承父类的公共方法属性,不能继承final private关键字
super 关键字:
1调用父类的变量 super.
2调用父类的构造方法 super();super(参数)
3调用父类的方法super.方法名
注意 super关键字不能调用private修饰的变量
(调用 封装方法修改变量)
super关键字的使用必须为第一条语句(this 调用本类,super调用父类)
在继承过程中实例化子类对象默认会执行父类的无参构造,再执行子类的无参构造
子类不能继承父类的构造方法,但可以通过关键字super去访问
构造有参方法:在此过程从主方法中给子类实例化,默认调用子类中的构造方法子类的构造方法默认调用父类的构造方法
如果没有super(有参/无参)则系统会默认调用父类中的无参构造
public class Zy4_1 {
int age;
int score;
/*
* 一下行成构造方法重载
* */
//无参构造方法
public Zy4_1(){
}
//有参构造方法
public Zy4_1(int age){
System.out.println("我是父类的有参构造");
this.age=age;
}
}
public class Zy4_2 extends Zy4_1{
String name;
public Zy4_2(){
//此处系统默认调用父类的无参构造 即:super();
}
public Zy4_2(int age1,String name){
super(age1);
System.out.println("我是子类的有参构造");
this.name=name;
}
}
如果给子类实例化(有参),则会先调用父类的有参构造 在调用子类的有参构造
先输出我是父类的有参构造,在输出我是子类的有参构造
2 方法重写
在子类中使用父类的方法并且加入父类没有的需要元素,这种情况就需要对父类进行重写
方法重写的规则 :
1方法名相同
2参数列表相同
3两者关系为继承关系(父子类)
4返回类型相同或其子类
5修饰符要求不能严于父类(父类<子类:protected<public)
注释:4中的子类
//父类定定的Text1
Text1 b;
public Text1 show(){
return b;
}
//子类名为Text2
Text2 a;
public Text2 show(){
return a
}
返回类型可以是当前父类也可以是当前子类类型
重写(Overriding)和重载的区别(Overloading)
重写:把父类的方法添加到子类的方法再加入子类的一些输出元素,构成 新的方法
重载:按照原先的方法添加或删除(参数 增加删除 类型 个数)构成的新的方法
重载和重写的本质原因为:重载后可以调用两个方法,而重写是构造成了一个新方法
位置 | 方法名 | 参数表 | 返回值 | 修饰符 | |
方法重写 | 父类与子类 | 与类名相同 | 相同 | 相同 | 不严于父类 |
方法重载 | 本类 | 与类名相同 | 不同 | 无关 | 无关 |
继承关系中分为:
1 多级继承(A为父类 B为子类1 C为子类2 A被B继承,B被C继承 C包含了A中的方法属性和B中的方法属性)
2 多重继承(一个子类继承多个父类,在Java中没有这个关系只有多级继承单级继承关系 C语言中有多重继承)
Object 重写
常见:equals重写
可以在软件中打出equals+Alt+/
@Override //监控重写equals过程
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return super.equals(obj);
}
@Override
public boolean equals(Object obj){
Dog d=(Dog)j//强制类型转换
if(j.age ==age && j.name.equals(name)){
return true;
}else{
return false;}
return super.equals(obj);
}
public static void main(String [] args){ //测试类结果
Zy3_1 j=new Zy3_1();
j.name="张三";
j.age=18;
Zy3_1 j1=new Zy3_1();
j1.name="张三";
j1.age=18;
System.out.println(p1.equals(p));
}
这是对equals的改用,如果没有加入方法重写则会出现false;
原因:equals默认对比的为对象即存放在栈内存中,而堆内存中的age ,name则不会对比
(默认为判断其对象名是否相等 j是否等于j1)
3 抽象方法抽象类 abstract
在定义抽象类中 使用关键字 abstract
在访问修饰符后加入 abstract 此类为抽象类
在方法中加入abstract 此方法为抽象方法
定义抽象类的好处:某些类并不需要实例化,实例化违反oop思想 多此一举就把此类定义成抽象类
功能:该类不能被实例化
抽象方法的格式:修饰符 abstract 返回类型 方法名( );
定义抽象方法的好处:首先定义抽象方法此类必须为抽象类(必要条件)好处在于此类中定义抽象方法
要求 在子类中必须方法重写,或者子类也为抽象类,(哪些功能必须被实现)
原因: 抽象方法必须在抽象类中
功能:子类必须重写抽象方法
4 final
final修饰的 为最终的最终值 如final修饰的变量为常量,final修饰的方法为最终方法 final 修饰的类为最终类不能被继承
final 与 abstract 功能相反
final不能修饰构造方法与abstract相同
final 修饰类:此类将不能被继承
final 修饰属性:变量为常量不能修改不能赋值
final 修饰方法:final修饰的方法为最终方法不能被修改 也不能重写;
在final修饰对象过程中对象后值不能重新修改
如:
public class Zy4_3 {
public static void main(String [] args){
//次行加上final 对象变为不能修改
final Zy4_2 p=new Zy4_2(18,"lili");
//利用p.变量是不会报错的 因为final修饰的只是对象p
p.age=18;
//此行就会出现报错
//p=new Zy4_2(20,"kk");
}
}
结尾
final 修饰的类不能被继承 属性为常量 方法为最终方法
abstract 修饰的类不能被实例化 修饰的方法必须被重写(或子类为抽象类);
两者容易混淆。