super关键字 抽象类和接口

与类中this关键字相似,java语言中使用关键字super表示父类对象。通过在子类中使用super做前缀可以引用被子类隐藏的父类变量或被子类重写的父类方法。super用来引用当前对象的父类

假如成员变量x和方法y()分别是被子类隐藏的父类的变量和方法,则:

super.x//表示父类的成员变量x

super.y()//表示父类的成员方法y()

还有系统默认有super(),即调用父类不带参数的构造方法

 

java语言中用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract关键字修饰一个方法时,这个方法叫抽象方法。抽象类就是不能用new方法进行实例化的类,对象不能由抽象类直接创建,只能通过抽象类派生出新的子类,再由其子类来创建对象。

抽象方法只需要声明而不需要实现,当一个方法为抽象方法时,意味着这个方法必须被子类的方法重写,否则其子类的方法仍然是abstract的。

抽象类中不一定包含抽象方法,但包含抽象方法的类一定要被声明为抽象类。

 

接口是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法。

在类的声明中implement子句来表示一个类使用某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implemnets子句中用逗号分开。

下面是一个关于接口的例子

 interface one{//定义第一个接口
  double pi=3.14;
  abstract double area();
}
 interface two//定义第二个接口
{
  abstract void setColor(String c);
}
interface all extends one,two//定义第三个接口,并实现多重继承
{
  abstract void volume();
}
class  all_linder implements all //以第三个接口实现类
{
  double radius;
  int height;
  String colors;
  public all_linder(double r,int h)
  {
  radius =r;
  height =h;
  }
  public double area()//实现第一个接口的方法
  {
  return radius*radius*pi;
  }
  public void setColor(String c)//实现第二个接口的方法
  {
  colors=c;
  System.out.print("形状的颜色:"+colors);
  }
  public void volume()//实现第三个接口的方法
  {
  System.out.println("圆柱体的体积"+area()*height);
  }
}
 class three
 {
 public static void main(String argS[])
 {
 all_linder o=new all_linder(3.0, 5);
 o.setColor("红色");
 o.volume();
 }


 }
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好啊好啊 抽象类接口Java最重要部分之一,这里用较大的篇幅来下这部分的笔记. 1. final关键字Java, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来声明常量,请遵守以下常规: final标记的变量名,所有单词字母都需大写. -------------------------------------------------------------------------------- 2. 抽象类抽象类的定义必须先讲抽象方法的定义. 所谓抽象方法,是指只声明而未实现(即没有{}包围的方法体)的方法. 而含有一个或多个抽象方法的类就称为抽象类. 抽象类 = 普通类 + 抽象方法 对于抽象类,时刻需要谨记: 抽象类是不能够直接实例化的, 如果要使用一个抽象类,就必须要有该抽象类子类. 如果抽象类子类不是抽象类的话,就一定要复写该抽象类的所有抽象方法. 如下面代码示例: view plaincopy to clipboardprint? abstract class Person { //全局常量的命名一定要采取全部字母大写的方式 public static final String NAME = "newsainton"; //print()方法有方法体,所以不是抽象方法 public void print() { System.out.println("非抽象方法,Name = "+NAME); } //fun()方法不含方法体,为抽象方法 public abstract void fun(); } //B类继承自A类,但B未声明为抽象类,则必须要复写A类所有的抽象方法 class Student extends Person { public void fun() { System.out.println("抽象方法,Name = "+super.NAME); } } public class Demo01 { public static void main(String args[]) { Student s = new Student(); s.fun(); s.print(); } } abstract class Person { //全局常量的命名一定要采取全部字母大写的方式 public static final String NAME = "newsainton"; //print()方法有方法体,所以不是抽象方法 public void print() { System.out.println("非抽象方法,Name = "+NAME); } //fun()方法不含方法体,为抽象方法 public abstract void fun(); } //B类继承自A类,但B未声明为抽象类,则必须要复写A类所有的抽象方法 class Student extends Person { public void fun() { System.out.println("抽象方法,Name = "+super.NAME); } } public class Demo01 { public static void main(String args[]) { Student s = new Student(); s.fun(); s.print(); } } 另外一个需要考虑的问题是: 抽象类可否有自己的构造方法? 答案是: 抽象类允许有自己的构造方法,但是该构造方法并不能直接实例化自己的对象. 如果在抽象类存在有参构造方法,则必须在子类明确的使用super([参数列表])指明要调用父类的哪个构造方法. 这里举例如下: view plaincopy to clipboardprint? abstract class Person { // 应该有姓名和年龄属性 private String name ; private int age ; public Person(){} // 如果已经不是无参的,则必须在子类明确调用无参构造 public Person(String name,int age) { this.name = name ; this.age = age ; } public String getName() { return this.name ; } public int getAge() { return this.age ; } // 定义一个输出方法,但是此方法为抽象方法 public abstract String getInfo() ; } class Student extends Person { public Student(String name,int age) { // 调用Person类有两个参数的构造方法 super(name,age) ; } public String getInfo() { return "姓名 = "+super.getName()+",年龄 = "+super.getAge() ; } } public class Demo05 { public static void main(String args[]) { Student s = new Student("张三",30) ; System.out.println(s.getInfo()) ; } } abstract class Person { // 应该有姓名和年龄属性 private String name ; private int age ; public Person(){} // 如果已经不是无参的,则必须在子类明确调用无参构造 public Person(String name,int age) { this.name = name ; this.age = age ; } public String getName() { return this.name ; } public int getAge() { return this.age ; } // 定义一个输出方法,但是此方法为抽象方法 public abstract String getInfo() ; } class Student extends Person { public Student(String name,int age) { // 调用Person类有两个参数的构造方法 super(name,age) ; } public String getInfo() { return "姓名 = "+super.getName()+",年龄 = "+super.getAge() ; } } public class Demo05 { public static void main(String args[]) { Student s = new Student("张三",30) ; System.out.println(s.getInfo()) ; } } -------------------------------------------------------------------------------- 3. 接口(interface) 3.1 接口的概念 接口是抽象方法与常量的结合. 接口的定义方式为: interface 接口名 { 数据类型 常量名 = 常量值; 返回值类型 方法名(); .......} 在Java,一个类只能继承一个类,但是却可以实现(implements)多个接口. 如果实现接口的类不是抽象类的话,则该子类必须复写接口所有的抽象方法. 例如如下代码示例: view plaincopy to clipboardprint? interface Person { //接口包含了抽象类和抽象方法 public static final String NAME = "newsainton"; public abstract void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo02 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } interface Person { //接口包含了抽象类和抽象方法 public static final String NAME = "newsainton"; public abstract void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo02 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } 3.2 接口的两点注意之处 (1). 抽象类使的是extends关键字表示一个类只能继承一个父类,但是接口使用的是implements,一个类可以同时实现多个接口,但是此时子类就必须同时覆写好多个接口的抽象方法。 (2). 既然定义已经明确说明了接口是抽象方法和全局变量的集合,因此,我们可以如下例一样,对代码进行简化: view plaincopy to clipboardprint? interface Person { //接口包含了抽象类和抽象方法 //public static final String NAME = "newsainton"; public String NAME = "newsainton"; //public abstract void fun(); public void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo03 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } interface Person { //接口包含了抽象类和抽象方法 //public static final String NAME = "newsainton"; public String NAME = "newsainton"; //public abstract void fun(); public void fun(); } // 一个类可以继承多个接口,但如果该类不是抽象类的话,则必须实现抽象类的所有抽象方法 class Student implements Person { public void fun() { System.out.println("name = "+NAME); } } public class Demo03 { public static void main(String args[]) { Student s = new Student(); s.fun(); } } 3.3 接口接口之间的关系 一个接口可以使用extends关键字去继承一个或多个已有的接口,但在子类的实现时,也必须全部实现所有接口的抽象方法. 一个接口去继承并实现多个接口的例子如下: view plaincopy to clipboardprint? interface A { public void printA() ; } interface B { public void printB() ; } interface C extends A,B { public void printC() ; } class X implements C { // 如果实现了(继承)C接口,则在子类就必须覆写全部的抽象方法 public void printA() { System.out.println("A --> HELLO") ; } public void printB() { System.out.println("B --> HELLO") ; } public void printC() { System.out.println("C --> HELLO") ; } } public class Demo04 { public static void main(String args[]) { X x = new X() ; x.printA() ; x.printB() ; x.printC() ; } } interface A { public void printA() ; } interface B { public void printB() ; } interface C extends A,B { public void printC() ; } class X implements C { // 如果实现了(继承)C接口,则在子类就必须覆写全部的抽象方法 public void printA() { System.out.println("A --> HELLO") ; } public void printB() { System.out.println("B --> HELLO") ; } public void printC() { System.out.println("C --> HELLO") ; } } public class Demo04 { public static void main(String args[]) { X x = new X() ; x.printA() ; x.printB() ; x.printC() ; } } 3.4 这里,如果一个子类既要继承一个抽象类,又要实现一个接口,该怎么写呢? 我们采取的是: class 类名称 extends 抽象类 implements 接口 这样的语法格式. 下面是同时继承一个抽象类,又实现接口的具体实例: view plaincopy to clipboardprint? interface X { public void printX() ; } interface Z { public void printZ() ; } // 一个抽象类也是可以实现接口的 abstract class Y implements Z { public abstract void printY() ; } // D类同时继承Y类和实现X接口 class D extends Y implements X { public void printX() { System.out.println("X --> HELLO .") ; } public void printY() { System.out.println("Y --> HELLO .") ; } public void printZ() { System.out.println("Z --> HELLO .") ; } } public class Demo13 { public static void main(String args[]) { D d = new D() ; d.printX() ; d.printY() ; d.printZ() ; } } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newsainton/archive/2009/08/03/4405346.aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值