`
jgnan
  • 浏览: 88901 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

每天简单JAVA教学:类继承,重写、重构及重载,final的用法

阅读更多
昨天事忙,所以没时间给大家写blog,抱歉一下。

今天说的内容有三个,首先来说java的类继承:
前面已经说过,要继承,只要在定义class的类名后面使用关键字extends,然后再在后面声明当前的类是继承哪个类就好了。
package extendsdemo;

public class Child extends Father
{
    public Child()
    {
        System.out.println("I'm the child");
    }

    public static void main(String[] args)
    {
        new Child();
    }
}

class Father extends Grandfather
{
    Father()
    {
        System.out.println("I'm the father");
    }
}

class Grandfather
{
    Grandfather()
    {
        System.out.println("I'm the ancestor");
    }
}


上面就是个继承的例子。首先大家会发现,一个java文件其实是可以定义多个class的对吧?不过有个规则,一个java文件里面只能有一个public的class,而且这个class名字还是要和文件名一致。第二点就是,console最后跑出以下内容:


这说明了继承类实例的构造过程是先调用最顶级的构造函数,按照继承关系自上而下的,最后调用自己的构造函数。为什么呢?

因为继承的实际用法就是要让子类继承父类的public、protected及default属性及方法。修改一下上面的例子:
package extendsdemo;

public class Child extends Father
{
    public Child()
    {
        System.out.println("I'm the child");
    }

    public static void main(String[] args)
    {
        Child child = new Child();
    }
}

class Father extends Grandfather
{
    Father()
    {
        System.out.println("I'm the father");
    }
    
    protected void goldenDish()
    {
        System.out.println("It is for me and my son!");
    }
    
    private void football()
    {
        System.out.println("Personal collection!");
    }
}

class Grandfather
{
    Grandfather()
    {
        System.out.println("I'm the ancestor");
    }
    
    public void myStory()
    {
        System.out.println("For every body");
    }
    
    protected void treasureMap()
    {
        System.out.println("For whole family");
    }
    
    private void wife()
    {
        System.out.println("My dear of life!");
    }

    void garden()
    {
        System.out.println("All neighbours can visit it");
    }
}


然后,我们在Child类的main方法里面尝试打"child."然后使用eclipse的content assist功能,热键是Alt+/,就会出现以下的画面:



这些都是子类可以访问到的方法。其中蓝色三角表示default方法,黄色菱形表示protected方法,而绿色圆圈表示public方法。

大家可能会奇怪,为什么除了Father和Grandfater之外,child类还能访问很多其它方法,比如equals。那好,我们就来看看这个方法来自什么地方。调用child.equals(object),然后按住Ctrl键用鼠标左键点一下这个方法可以查看这个方法的源代码(如果有源代码可查的话)。大家就会发现我们被带到Object这个类里面来了。

原来在java的类世界里面,所有的class都是默认继承Object这个类的。也就是说所有类的根都是Object,可以用Eclipse的Hiearchy视图证明这点。随便点哪个类,然后按F4键就可以打开这个继承关系视图:


看到了吧,这个Object就像是夏娃那样,是所有类的祖先。而且你不需要写extends去继承它!

好了,言归正传,刚刚说到继承的作用,就是把已有的类模板的public、protected及default的字段和方法拷贝到自己的类模板里面。其实以其说是拷贝,倒不如说是引用更加贴切。正因如此,所以我们才需要先初始化最上级资源的地址,再逐级下来初始化各层级的资源。否则如果是自下而上的初始化,当子集某些资源会调用到父级资源的时候,那就要死翘翘了。这也是为什么继承的时候所有父级成员的构造函数都要被调用一次的原因。

说到继承就会提及重写。而提起重写就往往也会提起重构和重载这两个名词。为了省事我就一次过再此说明了:
首先说重构,在java里面规定,同一个类里面,不允许有两个方法名相同而且参数相同的方法,例如:
public void sameMethod(String param1, Integer param2)
{
}

// the same with previous one
private String sameMethod(String param1, Integer param2)
{
}

// also the same
public void sameMethod(String aa, Integer bb)
{
}


不允许在同一个class里面这样定义,编译器会报错。只要方法名和()里面的类型相同就会出错。注意括号里面我们只看类型是否相同,而这个相同指的是按照顺序对照的相同,而且参数数目也要求相同,以下方法不算相同的两个方法:

public void sameMethod(String param1, Integer param2)
{
}

//Not the same with previous one
public void sameMethod(Integer param2,String param1)
{
}


这个原因我们会在日后说映射的时候说明。现在大家只要记住这点就好了。

那好,上面的例子给了我们一个启示,只要不是名字相同而且参数类型相同的话,在同一个类里面写两个相同名字的方法,是可能的,例如:
package refact;

public class Overload {
	public void overload(){}
	public void overload(String p1){}
	private String overload(Integer p2){return null;}
	protected static void overload(String p1,String p2){}
	
}


上面四个方法都是叫overload,但是它们的调用参数类型不一样,数目不一样,甚至是返回类型都不一样。所以这些方法都不算同一个方法。而我们对于这类从同一个方法名衍生出多个方法的做法叫做方法的重载(overload)。重载体现出类行为的多态,在实际应用中会让代码可读性和可用性都得到提高。

刚刚说了java只是不允许同一个类里面有两个相同的方法,那么在继承类里面,允不允许呢?答案是肯定的,而这种做法,我们叫做方法的重写。
package extendsdemo;

public class Overwrite extends Parent
{
    public void overwrite()
    {
        System.out.println("I'm overwritten!");
    }

    public static void main(String[] args)
    {
        new Overwrite().overwrite();        
    }
}

class Parent
{
    public void overwrite()
    {
        System.out.println("I'm the original one!");
    }
}


在上面例子里面,我们把Parent的overwrite方法重写了,自然,控制台最后打出来的结果就是"I'm overwritten!"。

但是,重写时不能够改变父类方法原有的返回类型,可以改变modifier,但是只能够往高开放程度的方向改。

modifier的开放程度:
private < default < protected < public

而由于继承时不会继承private方法的,所以重写的规则对于父类的private方法无效。。。。

所以下面的重写是不正确的重写:
class Child extends Parent
{
    void overwrite(){...}
}

class Parent
{
    public void overwrite(){...}
}


下面的也不正确
class Child extends Parent
{
    String overwrite(){...}
}

class Parent
{
    void overwrite(){...}
}


重写可以改变父类的行为,这个就是它的作用。但是如果我们要在子类重写了父类的一个方法,比如时方法a(),但是又想调用父类原本方法a()的代码时要怎么办呢?这时候就需要用关键字super和this来区分父类的方法a()和子类的方法a()了。这个就是我们下节课的内容。

好了,到最后一个名词,重构。什么叫重构?这个是一个应用项目中使用的名词。如字面的意思一样,就是重新构造。无论是对类的重写,对逻辑的重新实现等,都叫做重构。这并不是代码级别的行为,而是项目级别的行为。

好了,今天最后的内容,也是为了和之前的内容相呼应,我们来说final这个关键字的用法。它的其中一个功能简单来说就是不允许子类对其进行重写,这是当我们在声明方法时使用它的时候的功效。而另一个功能则是在我们用它来声明变量或者字段时的功效,就是说这个变量或者字段的值不允许被修改。

所以从本质上说,这个关键字的功用就是声明其休息对象的内存地址段内容不允许被修改。就这么简单。

好了,今天的内容就这么多,多谢大家观看。有问题欢迎随时提问或者指正。
  • 大小: 4.9 KB
  • 大小: 4.9 KB
  • 大小: 7.9 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    JAVA中的方法重写与方法重载区别

    JAVA中的方法重写与方法重载区别 JAVA 中的方法重写和方法重载是两个重要的概念,在面向对象程序设计语言中尤为重要。方法重写和方法重载都是多态性的体现,但它们之间有着本质的区别。 方法重写(Override)是指...

    重载、重写、重构.md

    总结来说,重载、重构和重写是C#中非常重要的概念,它们分别涉及方法的命名、代码结构的优化以及继承关系中的方法实现。掌握这些概念有助于编写更高质量的代码,并能够更好地应对未来的需求变化。

    Java方法的艺术:重载与重写的深度解析

    在这个例子中,`Dog` 类继承自 `Animal` 类并重写了 `sound` 方法。当我们通过 `Animal` 引用来调用 `sound` 方法时,实际上执行的是 `Dog` 类中的实现。这种多态性使得我们可以编写更加通用的代码,并且可以根据...

    Java 继承和方法重写

    Java 继承是面向对象编程中的一个核心概念,它允许一个类(子类或派生类)从另一个类(父类或基类)继承特性,从而实现代码的复用和扩展。方法重写则是继承机制中一个关键的特性,允许子类对父类的方法进行定制化,...

    Java重写和重载概念及区别梳理

    在编程语言中,Java的重写(Override)和重载(Overload)是两个非常重要的概念,它们在类与对象的多态性中起到关键作用。理解并掌握这两个概念是成为一名合格的Java开发者的基础。 首先,我们来谈谈重写(Override...

    java 重载,重写以及继承,多态的区别

    重载是指同一个类中的多个同名方法,重写是指子类对父类方法的重新实现,继承是指子类继承父类的成员变量和方法,而多态是指父类可以调用子类的方法。 在实际开发中,重载、重写、继承和多态都是非常重要的概念,...

    [Java]重载,重写以及继承,多态的区

    在这个例子中,`Triangle`类继承了`Shape`类,并重写了`getSides`方法。 ### 多态(Polymorphism) 多态是指一个接口可以被不同的类所实现,从而展现出不同的行为。在Java中,多态主要通过继承和重写实现。多态...

    java中的重载和重写的区别

    Java中的重载(Overloading)和重写(Overriding)是面向对象编程中两个重要的概念,它们体现了Java的多态性。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。 首先,让我们详细解释一下方法的重载。重载...

    JAVA重写和重载.pdf

    JAVA重写和重载(Overriding和...* 重载是指类中可以创建多个同名的方法,而重写是指子类继承父类的方法并作出修改。 在实际应用中,重载和重写都是JAVA多态性的一种表现形式,都是为了提高代码的灵活性和可扩展性。

    java 重载,继承,重写和多态的区别. doc

    总结起来,重载用于在同一类中创建具有相同名称但行为不同的方法,继承使得子类可以继承并扩展父类的功能,重写允许子类定制父类方法的行为,而多态则让程序更加灵活,可以使用父类引用处理各种子类对象。...

    Java重写重载线程

    给定代码中,`Person`类创建了三个子类:`Doctor`、`Teacher` 和 `Baby`,这些子类都继承自`professional`类,并且重写了`speak`方法: ```java class professional { void speak() { System.out.println("我的...

    Java中重载和重写总结

    子类可以继承父类中的方法,而不需要重新编写相同的方法,但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。 1. 方法重写的定义 方法重写是父类与子类之间的多态性,对...

    Java的重载和重写

    重载,简单来说,就是在一个类中定义多个同名方法,但这些方法的参数列表必须不同,即参数的个数、类型或顺序至少有一项不同。这使得我们可以使用同一个方法名,但根据传入的参数不同,执行不同的操作。例如,你可以...

    Java中extends类的继承

    - 这里,`Child`类继承了`Parent`类的所有非私有(public和protected)成员。 2. **单一继承** - Java遵循单一继承原则,即一个子类只能有一个直接父类,但可以间接继承多个父类(通过多层继承)。 - 多层继承的...

    java中重载与重写

    在Java编程语言中,方法的重载(Overloading)与重写(Overriding)是两个非常重要的概念。它们虽然只有一字之差,但其实质却大相径庭。理解这两者的不同对于深入掌握Java语言至关重要。 ### 一、重载(Overloading...

    Java面向对象之继承练习题.doc

    `People`类继承`Monkey`,重写`speak()`方法,并添加`think()`方法。在主类中创建这两个类的对象并测试它们的功能。 7. **Human、Man和Woman类**:创建一个`Human`类,然后创建它的两个子类`Man`和`Woman`。在主类`...

    Java课件 第一章 继承 类的重写

    在Java编程语言中,类的继承是面向对象编程的一个核心概念,它允许我们创建新的类,这些类基于现有的类(称为基类或父类)进行扩展。这种机制使得代码复用变得简单,同时还能增强代码的灵活性和组织性。继承的意义...

    Java--类的继承

    如果子类需要修改父类的方法实现,可以使用方法重写。在子类中定义与父类同名、同参数列表的方法即为重写。重写后,当通过子类实例调用该方法时,会执行子类的版本,而不是父类的。 5. 自动转型: Java支持向上...

    Java中方法重写与方法重载的比较.pdf

    Java中的方法重写(Overriding)与方法重载(Overloading)是面向对象编程中两个重要的概念,它们在实现多态性和代码复用时起到关键作用。本文将深入探讨这两个概念,以及它们在Java编程中的具体应用和区别。 1. **...

Global site tag (gtag.js) - Google Analytics