Java_继承、重写( Override) 、重载(Overload)和重写(Override)的区别?、 抽象类 、接口、 总结_接口 多态 、向上(下)转型 、final类_学习笔记

本文详细讲解了Java中继承的特性,包括重写与重载的区别,抽象类和接口的使用,以及多态、向上转型和final类的作用。重点介绍了方法重写的要求和注意事项,以及抽象类和接口中常量、抽象方法和默认/静态方法的规则。
摘要由CSDN通过智能技术生成

继承

在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式;
直接通过子类对象访问成员变量:

  • 等号左边是谁,就优先用谁,没有则向上找。

间接通过成员方法访问成员变量:

  • 该方法属于谁,就优先用谁,没有则向上找。

重写( Override)

概念:在继承关系当中,方法的名称一样,参数列表也—样。
重写(Override): 方法的名称一样,参数列表【也一样】。覆盖、覆写。
重载(Overload): 方法的名称一样,参数列表【不一样】。
o
方法的覆盖重写特点: 创建的是子类对象,则优先用子类方法。

重载(Overload)和重写(Override)的区别?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

方法覆盖重写的注意事项:

  • 必须保证父子类之间方法的名称相同,参数列表也相同。
    @verride: 写在方法前面,用来检测是不是有效的正确覆盖重写。这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
  • 子类方法的返回值必须**【小于等于】**父类方法的返回值范围。
    小扩展提示:java.lang.object类是所有类的公共最高父类(祖宗类),java.Lang.String就是object的子类。。
  • 子类方法的权限必须**【大于等于】**父类方法的权限修饰符。小扩展提示: public > protected > (default) >
    private备注:(default)不是关键字default,而是什么都不写,留空。

继承关系中,父子类构造方法的访问特点:

  • 子类构造方法当中有一个默认隐含的"super()"调用,所以一定是先调用的父类构造,后执行的子类构造。
  • 子类构造可以通过super关键字来调用父类重载构造。
  • super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。
  • 总结: 子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个。

抽象类

**抽象方法:**就是加上abstract关键字,然后去掉大括号,直接分号结束。
**抽象类:**抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可。
如何使用抽象类和抽象方法:

  • 不能直接创建new抽象类对象。
  • 必须用一个子类来继承抽象父类。
  • 子类必须覆盖重写抽象父类当中所有的抽象方法。
  • 覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
  • 创建子类对象进行使用

接口

接口使用步骤;

  • 接口不能直接使用,必须有一个“实现类”崃“实现”该接口。格式:
public class实现类名称impLements接口名称{
 //****方法
}
  • 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。实现:去掉 abstract关键字,加上方法体大括号。 创建实现类的对象,进行使用。
  • 注意事项: 如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。

总结_接口

  • 成员变量其实是常量,格式:
 [public] [static] [final]数据类型常量名称=数据值;
  • 注意:
    常量必须进行赋值,而且一旦赋值不能改变。常量名称完全大写,用下划线进行分隔。
  • 接口中最重要的就是抽象方法,格式:
  [public] [abstract]返回值类型方法名称(参数列表);
  • 注意:实现类必须覆盖重写接口所有的抽象方法,除非实现类是抽象类。
  • 从Java 8开始,接口里允许定义默认方法,格式:
 [public] default返回值类型方法名称(参数列表){
 方法体
 }
  • 注意:默认方法也可以被覆盖重写
  • 从Java 8开始,接口里允许定义静态方法,格式:
  [public] static返回值类型方法名称(参数列表){
  方法体
 }
  • 注意:应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法
  • 从Java9开始,接口里允许定义私有很乏,格式:
普通私有方法: 
	private返回值类型方法名称(参数列表){
	方法体
	} 
静态私有方法:
   private static返回值类型方法名称(参数列表){方法体}
  

注意:

  • private的方法只有接口自己才能调用,不能被实现类或别人使用。
  • 在java中继承的优先级远远高于接口的

多态

代码当中体现多态性,其实就是一句话:父类引用指向子类对象。
两种格式:

  1. 父类名称对象名= new子类名称();
  2. 接口名称对象名= new实现类名称();

多态中访问成员变量的两种方式:。

1.直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找

2.间接通过成员方法访问

向上(下)转型

注意事项:

  1. 向上转型一定是安全的。从小范围转向了大范围,从小范围的猫,向上转换成为更大范围的动物.

类似于:
double num = 100;//正确,int --> double,自动类型转换。

  1. 对象的向下转型,其实是一个【还原】的动作。格式:子类名称对象名=(子类名称)父类对象;含义:将父类对象,【还原】成为本来的子类对象。
Animal animal = new Cat0;//本来是猫,向上转型成为动物
Cat cat = (Cat) animal;//本来是猫,已经被当做动物了,还原回来成为本来的猫
注意事项;
a.必须保证对象本来创建的时候,就是猫,才能向下转型成为猫。
b.如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错。ClassCastException类似于:
int num = (int) 10.0;//可以
int num = (int) 10.5;//不可以,精度损失

final类

当final关键字用来修饰一个类的时候,

格式:public final class类名称{
/ / ...
}

含义: 当前这个类不能有任何的子类。(太监类)

注意: 不是使用final修饰的类作为父类,那么其中的成员方法也不能进行重写覆盖

当final关键字用来修饰一个方法的时候,这个方法就是最终方法,也就是不能被覆盖重写。

格式:
修饰符final返回值类型方法名称(参数列表){/方法体
}
*/

final修饰成员变量

对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。

  1. 由于成员变量具有默认值,所以用了final之后必须手动赋值,不会再给默认值了。
  2. 对于final的成员变量,要么使用直接赋值,要么通过构造方法赋值。二者选其一。
  3. 必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值。
public class Person {
	private final String name/* ="小王"*/;
	public Person() {
		name =“小王的女朋友";
	}
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
}

Java中有四种权限修饰符:

			public > protected> (default)>private
同一个类      YES       YES 			YES 	YES
同一个包		 YES       YES			YES		No
不看同包子类   YES	   YES			No		No
不同包非子类	 YES	    NO			No		No

注意事项: (default)并不是关键字"default”’,而是根本不写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值