java-继承之后
发布日期:2021-05-04 14:57:13 浏览次数:24 分类:精选文章

本文共 4970 字,大约阅读时间需要 16 分钟。

零.什么是继承

  • 1.子类可以继承父类里面的东西,这样可以是多项相同数据简化
  • 2.extends关键字
    • 父类就跟普通的类定义的方法一样
    • 子类在定义类时后面加一个 extends 父类名
      • public class Techer extends Employee(){…}
    • 定义了子类对象然后调用父类的方法和变量时,就跟普通的调用一样,对象名.方法()。

一.继承的一些规则

**1.子类可以访问父类,,父类不能访问子类****2.当父子的继承关系中有重名的**	-直接通过子类对象访问成员变量		*对象定义的类是谁就优先在谁里面找,没有就向上找(就近原则)	-间接通过成员方法访问成员变量		*方法调用的谁的,就优先用谁的变量,倘若子类方法没有这个变量,可以向上找。	-方法有重名的,对象是谁就优先用谁的方法,没有就可以向上找	 并且只有子类可以向父类找,父类不能像子类找**3.区分子类方法中重名的3种变量**	-System.out.println(nmu); //局部变量	-System.out.println(this.nmu); //本类变量	-System.out.println(super.nmu); //父类变量**4.方法的重写(覆盖)**	-创建的是子类对象,则优先用子类方法	-@Override写在方法前面,可以用来检测是不是正确的方法重写	-子类方法的返回值必须【小于等于】父类方法的返回值		*提示:java.lang.Object类是所有公共类的最高级类(祖宗类)	-子类的方法权限必须【大于等于】父类方法的修饰权限		*提示:public > protected >(default) > private		 备注(default)不是关键字,而是什么都不写	-super关键字的三大用法		*在子类的成员方法中,访问父类的成员变量		*在子类的成员方法中,访问父类的成员方法		*在子类的构造方法中,访问父类的构造方法	-this关键字的三大用法		*在本类的成员方法中,访问本类的成员变量		*在本类的成员方法中,访问本类的另一个成员方法		*在本类的构造方法中,访问本类的另一个构造方法	-注意this(....)和super(...)调用必须是构造方法的第一个语句【不写会免费送一个super】	-super和this两种构造调用,不能同时使用[并且构造方法不用‘.’]**5.继承中构造方法的访问特点**	-子类必须调用一个父类的构造方法		*子类构造方法如果什么都没有写,自动赠送一个“super.()”调用,使用是先执行父类构造		*如果父类只有有参构造,那么在子类构造要手写super.(xxx);	-super必须只能是第一行,所以只能由一个super在子类构造的第一行**6.继承的特点**	-java语言的继承的单继承的,一个类只能继承一个父类	-java语言可以多级继承,父类可以有父类	-java语言中一个父类可以有很多子类

二.抽象

**1.抽象方法和抽象类的定义**	-一个类里面有抽象方法就一定是抽象类	-抽象类里面也可以定义普通的成员方法	-抽象方法		*在类型的前面加上“abstract”关键字,然后在小括号后面直接加分号;		  public abstract void eat ();	-抽象类		*在class前面加上“abstract”关键字,		  public abstract class Animal(){...}**2.抽象类的使用**	-不能直接定义抽象类的对象	-必须用一个子类来继承抽象父类	-子类必须覆盖重写父类方法当中的抽象方法。	 覆盖重写:子类可以去掉抽象方法中的abstract关键字,然后补上方法体和{};	-创建子类对象可以自接使用	**3.注意事项**	-抽象类不能创建对象,只能创建非抽象类的子类对象	-抽象类中可以有构造方法,为子类提供初始数据的	-抽象类中不一定有抽象方法,但抽象方法一定在抽象类中	-抽象类的继承子类,如果没有重写所有的抽象方法,那么这个子类也是抽象类,但是已重写的方法就不是抽象方法了,

三.接口

**1.定义接口的格式**	-在创建的时候勾选interface	-public interface 接口名称{接口类容}	-换成了interface之后.编译生成的字节码文件仍然是:.java-->.clsaa**2.接口的抽象方法定义**	-public abstract 返回值类型 方法名称(参数列表)	-接口当中的抽象方法,修饰符必须是两个固定的关键:public abstract	-但是这两个字可以省略(刚学建议不省略)**3.接口抽象方法使用**	-接口不能直接使用(new),必须有一个“实现类”来“实现”接口		*实现格式   public class 实现类名称 implements 接口名称{}	-接口的实现类必须覆盖重写(实现)接口当中的所有抽象方法**4.接口中的默认方法default**	-接口类里面也可以拥有默认方法,默认方法也可以被“继承”,相当于一个普通方法【反正不用去重写它】	-public default 类型 方法名(){方法体}**5.接口中的静态方法static**	-就是将abstract或者default换成static【带上方法体】	-public static 类型 方法名(){方法体}	-注意事项		*错误:不能通过接口的实现类对象去访问接口的静态方法		*正确:直接通过接口名调用其中的静态方法		*格式:接口名称.静态方法(变量)     [可以不用new对象]**6.接口中的私有方法**	-抽取一个共有的代码去解决两个默认方法之间重复代码的问题	-但是这个共有方法不应该让实现类使用,是私有化的	-普通私有方法    【多个默认方法之间的重复】		*private 返回值类型 方法名称(参数列表){			方法体		}	-静态私有方法    【多个静态方法之间的重复代码】		*private static 返回值类型 方法名称(参数列表){			方法体		}**7.接口常量定义使用**	-格式:public static final 数据类型 常量名称 = 数据值		*备注:一旦用final关键字进行修饰,说明不可改变。	-接口中的常量可以省略public static final,但是效果依然还是在(默认自动有)	-接口中的常量”必须“进行赋值	-接口中的常量名称,使用完全大写的字母,用下划线分割(推荐)	-使用它,直接接口名称.常量名称**8.接口和继承的注意**	(1).接口是没有静态代码块或者构造方法	(2).一个类的直接父类是唯一的,但是接口可以有很多个		-格式:public class MyInterfaceImpl implments MyInterfaceA,MyInterfaceB{			覆盖重写所有的抽象方法		}	(3).如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。	(4).如果实现类没有重写所有的抽象方法,那么这个实现类也是一个抽象类	(5).如果实现类的多个接口当中,存在重复默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写	(6).一个类如果父类和接口方法重名,优先父类【继承>接口】**9.接口的多继承**	-格式:public MyInterface extends MyInterfaceA,MyInterfaceB{}	-类于接口		*类与类之间是单继承的,直接父类只有一个		*类与接口之间是多实现的,一个类可以实现多个接口		*接口与接口之间是多继承的。	-注意事项		*多个夫接口当中的抽象方法重复,没关系		*多个夫接口当中的默认方法重复,必须重新,带default

四.多态

**1.英文名:polymorphism**		*也可以称呼为:Multi**2.格式:父类引用指向子类对象**	(1).父类名称 对象名 = new 子类名称();	(2).接口名称 对象名 = new 实现类名称();**3.成员变量的访问**	-直接通过对象名称访问成员变量:看等号【左边】是谁,就用谁,没有就向上找	-间接通过成员方法访问成员变量:看该方法属于谁,就用谁,没有就向上找		*自创小技巧:变量优先看左边,方法优先看右边【等号】		*【方法这里必须是父类有这一个方法才能运行,倘若只有子类有这不行】【编译看左】**4.成员方法的访问**	-new是谁,就优先用谁	-编译看左边		*要编译运行通过,就要看是否符合左边的类		*比如fu类没有,zi类有的方法,是不通过的	-对比:         【编译都要看左边】		变量:编译看左,运行看左		变量:编译看左,运行看右**5.向上转型【创建猫,当做动物】**	-格式:父类名称 对象名 = new 子类名称();	-含义:右侧创建一个子类对象,把它当做父类来看待使用	-注意:向上转型一定是安全的,从小范围转向了大范围		*类似于double num=100 //正确 int-->double,自动类型转换	-缺点:一旦转型为父类,子类的特有方法就无法调用【可以向下转型】**6.向下转型【本来是猫,当做动物,还原成猫】**	-格式:子类名称 对象名=(子类名称) 父类对象	-含义:将父类对象,【还原】成本来的子类对象	-注意:a.必须保证对象本来创建的时候,就是猫,才能转型成猫		   b.如果创建的是猫,但非要转型为其他,就会报错【ClassCastException】		   *类似于:int num = (int)10.0//ok    int num=(int)10.5//精度损失**7.instanceof**	-格式:对象 instanceof 类名称		*这样会得到一个boolean值的结果,可以用来判断	-例如:	if(animal instanceof Dog){		Dog dog = (Dog) animal;		dog.watchHouse();	}	if(animal instanceof Cat){		Cat cat = (Cat) animal;		Cat.catchMouse();	}**8.参数传递的向上转型**	-如果形参的"大",传递的"小",那么可以自动转型为大的		*例如method(double num);			method(10.0) // 可以double-->double			method(10  ) //可以int-->double		*父类子类的多态继承也可以			method(USB usb);			method(mouse);			method(keyboard);

伍.final

**1.可以用来修饰一个类**	-格式:public final class 类名称{...}	-含义:这个类不能有子类(太监类)	-注意:其中的所有方法不能被重写(无子类),但是可以重写父类**2.可以用来修饰一个方法**	-格式:修饰符 final 返回类型 方法名(){...}	-含义:这个方法不能被重写【这个方法是最终方法】	-注意:对于方法来说,abstact,final,不能同时存在【abstact一定要被重写,final一定不能重写】**3.还可以用来修饰一个局部变量**	-格式:final 类型 名称=值(可以后面再赋值),或者在定义final变量后,后面再赋值一次	-含义:一旦使用了final,这个变量就不能被改变【相同的值也不行】	-注意:对于基本类型来说,不可变的是数值		   对于引用类型来说,不可变的是地址【但是对象里面的值(例如set)还是可以进行改变的】**4.还可以用来修饰一个成员变量**	-格式:修饰符 final 类型 名称 = 值	-含义:由于成员变量有默认值,使用用了final后必须手动赋值	-注意:要么在定义的时候直接赋值		   要莫在构造方法里面赋值
上一篇:java-重要知识总结(修饰符,内部类,集合,接口,泛型,异常,线程,IO流)
下一篇:java-面向对象初

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月05日 19时59分46秒