类继承与接口(一)
- 格式:doc
- 大小:46.50 KB
- 文档页数:6
C#虚基类继承与接⼝的区别类定义新的数据类型以及这些新的数据类型进⾏相互操作的⽅法定义⽅式:class Cat{}class Cat:object{}C#中所有的类都是默认由object类派⽣来的,显⽰指定或者省略效果是⼀样的,所以上⾯的两个例⼦是完全相同的。
C#中类包括:抽象类、密封类、⾮抽象类abstract:表⽰修饰的类不完整,也就是抽象类,只能⽤做基类。
在使⽤是不能直接实例化,不能使⽤new运算符。
sealed:表⽰修饰的类不可派⽣,也就是密封类。
base:访问最近的基类,也就是当前类继承的类class Cat:Animal{public void Cat(){base.Eat();}}以上例⼦中base代表Animal。
注意:base只能在类的内部使⽤。
接⼝⼀个接⼝定义⼀个协定。
接⼝可以看成是特殊的抽象类,但是⼜有所区别。
⼀个接⼝可以从多个基接⼝继承,⽽⼀个类或结构可以实现多个接⼝。
接⼝可以包含⽅法、属性、事件和索引器。
接⼝本⾝不提供它所定义的成员的实现,⽽抽象类中可以提供定义成员的实现。
接⼝只指定实现该接⼝的类或结构必须提供的成员。
接⼝本质上是⼀种类不过他与类的区分还是很明显的——不能实例化他的精髓在于提供⼀些类共同的地⽅,⽽且能“多继承”我们知道所谓对象其实是数据和⽅法的封装。
接⼝的作⽤更多的是⼯程上的,⼀般上我们⽤他来封装通⽤的⾏为,来达到程序的多态。
不必⽤object的观点来统⼀接⼝,在我的感觉中,继承简化对象结构,增加代码重⽤,接⼝抽象⾏为。
1. 接⼝本质上是类吗这个,要看你认为“类的本质是什么”了,过多纠缠于这个说法,很容易陷⼊⽂字之争,意义不⼤。
2. 接⼝和类有什么区别和联系,主要是联系区别:类的定义需要“实现”,接⼝的定义只需要“声明”;类能实例化出⼀个对象,接⼝不能;类只能单根继承,接⼝可以多根继承;继承⼀个类,相当于借⽤了它已实现的功能,实现⼀个接⼝,相当于对外做了⼀个承诺;……联系:类可以“实现”接⼝3. 接⼝是否具备类的特征这要看你认为哪些是“类的特征”,hehe,⽐如,“编译后会⽣成⼀个 .class⽂件”算不算特征……4. 接⼝是否是Object不是。
基类显式继承接⼝,类继承基类时⼜继承同⼀接⼝,引发接⼝⽅法混乱(显式继承接⼝的弊端)基类BaseOutput显式继承了⼀个接⼝IOutput,之后类TrackOutput继承BaseOutput,同⼀时候⼜继承了IOutput接⼝。
假定IOutput有⽅法Output,这样在TrackOutput中就有两个Output⽅法,⼀个源于基类BaseOutput,于个源于接⼝IOutput。
这样就引发了混乱。
要怎么办?先看以下的⼀段代码interface IOutput{void output();}class BaseOutput : IOutput{void IOutput.output(){Console.WriteLine("IOutput...");}}class TrackOutput : BaseOutput, IOutput{public void Output(){Console.WriteLine("TrackOutput...");base.Output();}}在编译时。
base.Output会报错,提⽰BaseOutput中不包括output的定义。
这怎么会这样?BaseOutput不是继承了IOutput的⽅法,并实现了IOutput中的output的⽅法了吗?假设把BaseOutput中对IOutput中的output显式实现。
改动为隐式实现。
新代码例如以下:class BaseOutput : IOutput{public void output(){Console.WriteLine("IOutput...");}}这样编译就能够通过。
并且也可正常执⾏了,測试代码例如以下:static void Main(string[] args){TrackOutput t = new TrackOutput();t.Output();Console.ReadLine();}输出正常。
Java Abstract方法继承一、什么是Abstract方法Abstract方法是Java中一种特殊的方法,它只有声明而没有具体的实现。
在定义一个Abstract方法时,需要使用abstract关键字修饰方法,并且该方法所在的类必须是抽象类或者接口。
Abstract方法的定义如下:public abstract void methodName();二、抽象类与接口抽象类(Abstract Class)是一个不能被实例化的类,它可以包含Abstract方法和具体的方法实现。
抽象类通过使用abstract关键字进行修饰。
接口(Interface)是一种纯抽象的类,它只包含Abstract方法和常量。
接口定义方法时,默认使用public abstract修饰。
抽象类和接口的区别如下: - 抽象类可以有构造方法,而接口不能有构造方法。
- 类只能继承一个抽象类,但可以实现多个接口。
- 抽象类可以有成员变量,而接口只能有常量。
- 接口中的方法默认是public的,而抽象类中的方法可以有不同的访问修饰符。
三、Abstract方法的继承方式Abstract方法在继承关系中有以下几种继承方式:子类覆盖方法、子类重载方法、子类继续声明抽象方法。
1. 子类覆盖方法当一个子类继承自一个抽象类或者实现一个接口时,它必须实现抽象类或接口中的所有Abstract方法。
子类通过覆盖Abstract方法来提供具体的实现。
例如,有一个抽象类Animal,其中定义了一个Abstract方法eat(),如下所示:public abstract void eat();}如果一个子类Dog继承自Animal,则必须实现eat()方法:public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃骨头");}}2. 子类重载方法除了覆盖Abstract方法,子类还可以重载Abstract方法。
JA V A继承、抽象类、接口编辑人:星辰·樱联系QQ:838826112一.类的继承通过继承可以实现代码的复用,被继承的类称为父类或超类(superclass),由继承而得到的类称为子类(subclass)。
一个父类可以拥有多个子类,但一个类只能有一个直接父类,这是因为JA V A语言中不支多重继承。
子类继承父类的成员变量和成员方法,同时可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量或成员方法。
JA V A语言中有一个名为ng.Object的特殊类,所有的类都是直接或间接地继承该类而得到的。
1.子类的创建类的继承是通过extends关键字来实现的,在定义类时若使用ectends关键字指出新定义类的父类,就是在两个类之间建立了继承关系。
新定义的类称为子类,它可以从父类那里继承所有非private的成员作为自己的成员。
子类的创建:* 格式:class SubClass extends SuperClass* {* .* .* .* }2.调用父类中特定的构造方法在没有明确地指定构造方法时,子类还是会先调用父类中没有参数的构造方法,以便进行初始化的操作。
在子类的构造方法中可以通过super()来调用父类特定的构造方法。
例://以Person作为父类,创建学生子类Student,并在子类中调用父类里某指定的构造方法。
class Person2{private String name;private int age;public Person2()//定义Person2类的无参构造方法{System.out.println("调用了Person2类的无参构造方法");}public Person2(String name,int age)//定义Person2类的有参构造方法{System.out.println("调用了Person2类的有参构造方法");=name;this.age=age;}public void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student2extends Person2//定义继承自Person2类的子类Student2{private String department;public Student2()//定义Student2类的无参构造方法{System.out.println("调用了学生类的无参构造方法Student2()");}public Student2(String name,int age,String dep)//定义Student2类的有参构造方法{super(name,age);//调用父类的胡参构造方法department=dep;System.out.println("我是"+department+"学生");System.out.println("调用了学生类的有参构造方法Student2(String name,int age,String dep)");}}public class App8_2 {public static void main(String[] args){Student2 stu1=new Student2();//创建对象,并调用无参构造方法Student2 stu2=new Student2("李小四",23,"信息系");//创建对象并调用有参构造方法stu1.show();stu2.show();}}/*在子类中访问你类的构造方法,其格式为super(参数列表)。
接⼝能被继承吗?
1、接⼝可以继承接⼝
2、抽象类可以实现接⼝
3、抽象类可以继承实体类
注意:接⼝不能被实体类继承
扩展资料:
1、Java继承或实现接⼝时需要遵循的原则:
(1)类优先于接⼝。
如果⼀个⼦类继承的⽗类和接⼝有相同的⽅法实现。
那么⼦类继承⽗类的⽅法。
(2)⼦类型中的⽅法优先于⽗类型中的⽅法。
(3)如果以上条件都不满⾜,则必须显⽰覆盖/实现其⽅法,或者声明成abstract。
2、Java实现多继承的⽅式:
(1)Java中⼀个类不能继承多个具体class。
(2)⼀个类只可继承⾃⼀个具体 class,但可实现多个接⼝。
interface不涉及到实现细节,不与任何存储空间有关连。
新类可继承⾃⼀个具象class,其余继承都得是interfaces。
(3)outer class不可继承⾃多个具体class,可在其内部设多个inner class,每个inner class都能各⾃继承某⼀实现类。
inner class不受限于outer class是否已经继承⾃某⼀实现类。
(4)inner class可以说是多重继承问题的完整解决⽅案。
⼀个类不能继承⾃多个⼀般类。
但我们可以让其内部的多个inner class各⾃继承某⼀实现类达到类似的⽬的。
参考资料来源:。
一、选择题1、为了区分重载多态中同名的不同方法,要求(A )。
A) 采用不同的参数列表B) 返回值类型不同C) 调用时用类名或对象名做前缀D) 参数名不同2、定义主类的类头时可以使用的访问控制符是( C)。
A) private B) protected C) public D) private protected3、下列整型的常量属性i 的定义中,正确的是( A)。
A) static final int i=100; B) final int i;C) static int i; D) final float i=1.2f;4、设x,y 均为已定义的类名,下列声明对象x1的语句中正确的是( C)。
A) public x x1= new y( ); B) x x1=x( );C) x x1=new x( ); D) int x x1;5、下列方法定义中,正确的是( D)。
A) int x( int a,b ) B) double x( int a,int b){ return (a-b); } { int w; w=a-b; }C) double x( a,b ) D) int x( int a,int b){ return b; } { return a-b; }6、为了使包sos在当前程序中可见,可以使用的语句是( A)。
A)import sos.*; B)package sos.*;C)sos import; D)sos package;7、设i、j、k 为类x 中定义的int 型变量名,下列类x 的构造函数中正确的是( )。
A) x( int m){ ... } B) void x( int m){ ... }C) x( int m, int n){ ... } D) x( int h,int m,int n){ ... }8、下列类头定义中,正确的是( )。
CA) class x B) public x extends y{ .... } { .... }C) public class x extends y D) class x extends y implements y1{ .... } { .... }9、下面是有关子类继承父类构造函数的描述,其中正确的是(C )。
Java枚举继承和接口实现枚举是继承了ng.Enum类,所以枚举不可以再进行继承。
但可以实现接口和重写抽象方法。
下面举例说明下具体使用方法。
接口实现的方式接口实现代码片段:1.interface BaseColor {2.3.void print(String mobile);4.5.}6.7.public enum Color implements BaseColor {8. RED(10, "红色"),9. GREEN(11, "绿色"),10. BLUE(12, "蓝色"),11. YELLOW(13, "黄色");12.13./**14. * 构造的入参顺序,和枚举值定义的属性顺序是一致的15. *16. * @param code17. * @param text18. */19. Color(int code, String text) {20.this.code = code;21.this.text = text;22. }23.24.private int code;25.26.private String text;27.28.public int getCode() {29.return code;30. }31.32.public String getText() {33.return text;34. }35.36.@Override37.public void print(String mobile) {38. System.out.println(mobile + "的颜色是:" + this.text);39. }40.}41.42.class Test {43.public static void main(String[] args) {44. Color.RED.print("华为Mate50");45. Color.GREEN.print("小米13");46. }47.}打印输出的内容为:通过定义一个接口,枚举实现接口,在枚举类中重写接口方法,通过枚举值调用方法即可。