Java面向对象知识点整理

不定期更新,欢迎指正

1. 重载、重写和隐藏

1). 重载(overload):

方法重载就是多个方法名称相同但是参数类型或者参数个数不同的方法,与返回值类型和修饰符无关

class Test {
    public int test(int a) {
        return a;
    }
    
    public String test(String a) {
        return a;
    }

    public float test(int a, String b) {
        return 0f;
    }

    public float test(String a, int b) {
        return 1.0f;
    }

    String test(float a) {
        return "";
    }

    String test(int a) {//该方法不是重载  
        return "";
    }
}  

前面五个互为重载,第一个和第六个虽然返回值类型不同,但参数相同,所以第一个和第六个参数不是重载

2). 重写(override):

子类继承父类时,子类的方法名称、参数类型、参数个数与父类完全相同,则认为子类重写了父类的方法。

方法重写规则:

  • 参数列表和原方法完全相同
  • 返回值类型和原方法相同或者为父类返回值类型的子类型
  • 不能比原方法限制更严格的访问级别(举例:父类方法为public,那么子类不能为protected、private)
  • 父类方法被定义为final时,则不能被重写
  • 父类方法被定义为static时,不能被重写,但是可以重写声明一个相同的方法(参考隐藏
  • 不能抛出新的异常或比原方法更广泛的异常(父类抛出IOException,重写方法不能抛出Exception只能抛出IOException或者IOException子类异常)
3). 隐藏:

隐藏是针对于父类的成员变量和静态方法而言的。子类中声明了和父类相同的变量名或静态方法(方法名相同、参数列表相同、返回类型相同)则实现了对父类成员变量和静态方法的隐藏,下面举个例子有助理解:

class A {  
    static int a = 1;  
    static int b = 2;  
    int c = 33;
  
    public static void printA() {  
        System.out.print(a);  
    }  
  
    public static void printB() {  
        System.out.print(b);  
    }  
  
}

class B extends A {  
    static int a = 3;  
    static int b = 4;
    int c = 44;
  
    public static void printB() { 
        System.out.print(b);  
    }  
}

public class Test {  
    public static void main(String[] args) {  
        B.printA();
        B.printB();
        System.out.print(B.a);  
        
        A a = new B();
        B b = new B();

        a.printB();
        b.printB();
        System.out.print(a.c);
        System.out.print(b.c);
    }  
}  

输出结果:
1 4 3 2 4 33 44

如果子类中有相同名称的静态方法或变量父类的会被隐藏,如果子类中存在同名的静态方法或变量,则会隐藏父类中得静态方法或变量,此时子类调用的就是子类中自己的静态方法或变量;如果子类中不存在同名的静态方法或变量,则会调用父类中的静态方法或变量;父类调用的始终是其本身的静态方法和变量。

2. 封装:

封装是把对象的属性和操作结合为一个独立的整体,隐藏对象内部操作的实现,用户只需要通过其对外提供的方法来访问该对象,无需知道其内部实现细节。

优点:

  • 隐藏内部实现细节,提供公共访问方式
  • 类内部可以自由修改不影响其调用者
  • 减少耦合度,提高安全性

3. 继承:

继承是一个对象获取另一个对象属性的过程,关键字为extendsimplements

1). IS-A关系(一个对象所属于另一个对象):
方式一. 用extends来实现继承:
public class Animal {
    public void eat() {
        System.out.println("Animal eating...");
    }
}

public class Mammal extends Animal {
    public void eat() {
        System.out.println("Mammal eating...");
    }
}

public class Dog extends Mammal {
    public void eat() {
        System.out.println("Dog eating...");
    }
}
方式二. 用implements来实现继承:
public interface Animal {
    void eat();
}

public class Mammal extends Animal {
    public void eat() {
        System.out.println("Mammal eating...");
    }
}

public class Dog extends Mammal {
    public void eat() {
        System.out.println("Dog eating...");
    }
}

无论方式一还是方式二,我们都可以用instanceof关键字检查得出:Mammal是一个Animal(哺乳动物也是动物);Dog既是一个Mammal,也是一个Animal(狗既是哺乳动物也是动物)。

public class Test {  
     /**
      * instanceof关键字检查代码
      */
    public static void main(String[] args) {
        Mammal m = new Mammal();
        Dog d = new Dog();
        System.out.print(m instanceof Animal);
        System.out.print(d instanceof Mammal);
        System.out.print(d instanceof Animal);
    }
}

输出结果:
true true true
2). HAS-A关系(一个对象含有另一个对象的一些属性):
public class Car{}

public class Speed{}

public class Benz extends Car{
    private Speed sp; 
}

Benz含有Spend属性,但Benz不是Spend

4. 多态:

实现多态的三个必要条件:继承、重写、父类引用指向子类对象。

1). 向上转型:

我们实例化一个Dog对象可以用 Dog d = new Dog(); 我们也可以用 Animal d = new Dog();,后者就是向上转型(父引用指向子对象),上面两种方式创建出来的对象d,调用d.eat();输出的结果都是Dog eating...,这就体现出了java得多态。向上转型创建的对象会遗失掉和父类不同的方法和变量(不能用来调用子类特有的方法和变量)。

2). 举例说明:
class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    }
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
    }

    public String show(A obj) {
        return ("B and A");
    }
}

class C extends B {}

class D extends B {}

class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println(a1.show(b)); //  ①
        System.out.println(a1.show(c)); //  ②
        System.out.println(a1.show(d)); //  ③
        System.out.println(a2.show(b)); //  ④
        System.out.println(a2.show(c)); //  ⑤
        System.out.println(a2.show(d)); //  ⑥
        System.out.println(b.show(b));  //  ⑦
        System.out.println(b.show(c));  //  ⑧
        System.out.println(b.show(d));  //  ⑨
    }
}

输出结果:
A and A //  ①
A and A //  ②
A and D //  ③
B and A //  ④
B and A //  ⑤
A and D //  ⑥
B and B //  ⑦
B and B //  ⑧
A and D //  ⑨

前三个比较简单不容易出错,看看下面几个:

  • ④:a2是A的引用指向B对象,向上转型创建的对象会遗失掉和父类不同的方法和变量,所以a2只能调用show(D obj)show(A obj)两个方法,所以a2.show(b)应该调用show(A obj)方法,B中重写了该方法,所以运行时JVM会调用B类中重写的show(A obj)方法,所以输出B and A
  • ⑤: 原理同④;
  • ⑥:a2.show(d)应该调用show(D obj)方法,B中没有重写该方法所以调用的为A类中的该方法,所以输出为A and D;
  • ⑦⑧⑨:b为B类对象,可调用A类中show(D obj)、B类中show(B obj)、B类中show(A obj)方法,所以输出如上。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,582评论 0 11
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,055评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 6,937评论 0 62
  • 今天下午放学后领导让我到老校区一趟,刚到教导处一会儿,再次接到正在上高二女儿的电话,今天上午女儿打电话说她感...
    佳玉儿阅读 762评论 0 0