在Java中,每一个类只能有一个父类,这是所谓的单一继承(single inheritance),但相反的,一个父类可以拥有一个以上的子类,这点与C++稍有不同。C++允许多重继承(multiple inheritance),但Java并没有这个设计,虽然如此,Java的接口(interface)还是可以实现多重继承。
经过继承之后,子类便可拥有父类的成员,包括所有的数据成员与成员函数,但这并不意味着在子类中可以完全没有限制地访问这些成员,如父类中的private 成员便不能直接在子类中被访问。父类中声明为public的成员,或者是没有进行public/private声明的成员,继承到子类之后,其访问的属性并不会改变。
值得一提的是,在父类中private成员经继承后,子类依然可以拥有它,但不能在子类中直接对它访问;要访问它,只能通过由父类继承而来的函数成员。此外,构造函数和设定终止继承的成员都不能继承给子类。
在Java继承的机制中,执行子类的构造函数之前,可以编写程序代码来调用父类的构造函数,其目的是为了要帮助继承自父类的成员进行初始化。当父类的构造函数执行完毕后,才会执行子类的构造函数。如果子类没有编写程序代码来调用父类的构造函数,则Java会自动调用父类默认的构造函数。而如果父类中有数个构造函数,则在子类的构造函数中,可以通过super()来调用父类中特定的构造函数。
代码实例
class CCircle {
public CCircle() {
System.out.println("CCircle() constructor called");
}
public CCircle(double r) {
System.out.println("CCircle (double r) constructor called");
}
}
class CCoin extends CCircle {
public CCoin() {
System.out.println("CCoin() constructor called");
}
public CCoin(double r,int v) {
super(r);
System.out.println("CCoin(double r,int v) constructor called");
}
}
public class Test {
public static void main(String args[]) {
CCoin coin1 = new CCoin();
CCoin coin2 = new CCoin(2.5,10);
}
}
程序输出
CCircle() constructor called
CCoin() constructor called
CCircle (double r) constructor called
CCoin(double r,int v) constructor called
注意:
调用父类构造函数的super()必须写在子类构造函数中的第一个语句处,不能置于其他位置,否则编译时将出现错误信息;
super()可以重载,也就是说,super会根据参数的数量及类型,执行相对应的父类的构造函数;
Java在执行子类的构造函数之前,如果没有用super()来调用特定父类的构造函数,则会先调用父类中“没有参数的构造函数”。因此,如果父类中只定义了有参数的构造函数(此时Java不再提供父类默认的构造函数),而在子类的构造函数中又没有用super()来调用父类中特定的构造函数的话,则编译时将发生错误,因为Java在父类中找不到“没有参数的构造函数”可供执行。
构造函数里的this()与super()
this()是在同一类中调用其他的构造函数,而super()则是从子类的构造函数调用其父类的构造函数。
虽然使用的时机不同,但this()与super()还是有其相似之处
(1)当构造函数有重载时,this()与super()均会根据所给予的参数类型与个数,正确执行相对应的构造函数。
(2)this()与super()均必须编写在构造函数中的第一行,正因为这个原因,this()与super()无法同时存在于同一个构造函数中。
super后面也可加上数据成员或method的名称,如此便可利用下面的语句
super.数据成员名称
super.method名称来访问父类的数据成员与method.
this除了可用来调用同一类中的其他构造函数之外,如果同一类中“实例变量”与“局部变量”的名称相同时,也可利用它来调用同一类中的“实例变量”。
把成员声明成protected可同时兼顾到成员的安全性与便利性,因它只能提供父类与子类的内部访问,而外界则无法更改或读取它。另外,父类中的protected成员继承到子类之后,其访问属性还是protected。
通过父类变量,依然可以访问到子类对象的成员,但子类的变量不能将它指派给父类的对象 ,而且通过父类变量访问子类对象的成员,只限于“覆载”的情况发生时,也就是说,父类与子类的method名称、参数个数与类型必须完全相同,才可通过父类的变量调用子类的method,如果某一method 仅存在于子类,以父类变量调用它时,则编译时将产生错误信息。
当类、method、或是变量不想被继承、覆载或是被修改时,只要加上修饰符final即可。
重写方法不能使用比被重写方法更严格的访问权限,严格顺序private>default>protected>public
类之源--Object类
如果某一类没指定其父类,则Java会自动设定该类继承自Object类,而成为它的子类。
Object类里常用的method
getClass() method的返回值是Class类型,所以先声明一个Class类型的变量来接收它,注意Class的"C"是大写"C",它是定义于Java.lang类库里的一个类,且直接继承自Object类 ; 。
equals()method可用来比较两个类变量是否指向同一个对象。如果是,则返回true,否则返回false;
toString()method的功能是将对象的内容转换成字符串并返回转换后的结果。默认的toString()会返回对象的代码,因此多半需要覆载toString(),使得它返回的字符串更能表达对象的内容。事实上,也可以直接把变量名称当成println()的参数打印,此时Java先调代用toString()method,然后再把结果当成println()的参数打印,如此一来,在使用上更加方便。
接口的结构和抽象类非常相似,接口本身也具有数据成员与成员函数,但它与抽象类有两点不同:
1)接口的数据成员必须初始化;
2)接口里的method必须全部声明为abstract,也就是说,接口不能像抽象类一样有一般的method,而必须全部是“抽象函数”。
多重继承
借由接口机制,多重机制的处理还是可以实现的,其做法是,用类来实现两个以上的接口。如此一来,类里的method只要明确定义每一个接口中的method,便可达到多重继承的目的。
接口的延伸
接口与一般类一样,可通过继承的技术来衍生出新的接口,同样的,接口的继承也是关键字extends。一个接口可以继承自多个接口。
分享到:
相关推荐
public class PKCard extends JLabel implements MouseListener, MouseMotionListener{ //纸牌的位置 Point point = null; Point initPoint = null; int value = 0; int type = 0; String name = null; ...
public class FirstApplet extends Applet { public void paint(Graphics g) { g.setColor(Color.blue); g.drawString("这是一个Java Applet 程序",10,30);//在Java Applet中绘制一行文字:“这是一个Java ...
public class PKCard extends JLabel implements MouseListener, MouseMotionListener{ //纸牌的位置 Point point = null; Point initPoint = null; int value = 0; int type = 0; String name = null; ...
public class Card extends JLabel implements MouseListener, MouseMotionListener { public Point point, oldPoint; CardMain m = null; public String name; public String up = "rear"; public int ...
斗地主 发牌 打牌 非常完美ublic class PKCard extends JLabel implements MouseListener, MouseMotionListener { private Point point = null; private Point initPoint = null; private int value = 0; ...
简单计算器public class Calculator extends JFrame implements ActionListener { // JFrame jf=new JFrame("计算器"); Panel jpanel1, jpanel2, jpanel3; JTextField jtextfield1; String s ; Button add1,...
<package name="default" namespace="/" extends="struts-default"> <!-- ... --> </interceptors> <!-- ... --> </actions> <!-- ... --> </global-results> <converter key="point" class=...
public class MyApplet extends Applet implements ImageObserver { // ... } ``` 接着,我们需要确定图像的路径。通常,图像文件可以与Applet在同一目录下,或者位于Web服务器的某个特定位置。可以使用`...
class myfr extends JFrame implements ActionListener{ String str,strnext,path,fname; //部分变量的声明 JPanel mainpane; JFileChooser choose = new JFileChooser(); //文件对话框 Dialog find,replace; ...
public class MainActivity extends AppCompatActivity implements BaiduMap.OnMapStatusChangeListener { private MapView mMapView; private BaiduMap baiduMap; @Override protected void onCreate(Bundle ...
public class MainActivity extends AppCompatActivity implements BaiduMap.OnMapStatusChangeListener { private MapView mMapView; private BaiduMap mBaiduMap; @Override protected void onCreate(Bundle...
public class ChessBoard extends JPanel implements MouseListener, MouseMotionListener { // 添加监听器... @Override public void mouseClicked(MouseEvent e) { // 检查并放置棋子... // 检查游戏状态......
class ZoomPanel extends JPanel implements MouseListener, MouseMotionListener { private Point clickPoint; private Image originalImage; private int zoomFactor = 3; // 放大倍数 public ZoomPanel...
public class MainActivity extends Activity implements OnClickListener { ``` - 定义了一个名为`MainActivity`的公共类,继承自`Activity`并实现了`OnClickListener`接口。 3. **成员变量**: - 数字按钮:...
public class Touch extends Activity implements OnTouchListener, OnClickListener { private static final String TAG = "Touch" ; // These matrices will be used to move and zoom image Matrix matrix = ...
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { private MapView mapView; private GoogleMap googleMap; @Override protected void onCreate(Bundle ...
public class DraggableComponent extends JComponent implements MouseListener, MouseMotionListener { private Point dragOrigin; // 记录鼠标按下的位置 public DraggableComponent() { addMouseListener...
public class greedsnake extends JFrame implements KeyListener, ActionListener { static int ik = 0, jk = 0, flag = 0; Boolean running = true; String direction = "DOWN"; String pre_dir = "DOWN"; ...
public class MainActivity extends AppCompatActivity implements OnMapClickListener { private MapView mapView; private GoogleMap googleMap; @Override protected void onCreate(Bundle ...
class DragTree extends JTree implements DragGestureListener, DragSourceListener, DropTargetListener { /** * */ private static final long serialVersionUID = 1L; BufferedImage ghostImage; ...