java之面向对象三大特性的总结

java中面向对象的三大特性:封装、继承、多态

封装

把抽象的数据和对数据的操作封装在一起, 隐藏变量的实现细节 。数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问。

1、原则

将不需要对外提供的内容都隐藏起来

把属性都隐藏,提供公共方法对其访问

2、好处

将变化隔离

便于使用

提高重用性

提高安全性

class FengZhuang{

    private int age = 15;

    public void setAge(int age) {

        if (age > 0) {

            this.age = age;

        }

    }

    public int getAge() {

        return this.age;

    }

}

继承

java支持单继承,不直接支持多继承。

因为如果支持多继承,会产生调用的不确定性。(当继承的两个父类含有相同名字的方法时,不确定调用哪个。

继承可以解决代码复用的问题 ,当多个类存在相同的属性和方法时,我们可以从这些类中抽取出父类,在父类中定义这些属性和方法,只需要通过extends语句来声明继承父类。

父类的哪些属性可以被子类继承:

public

protected

默认修饰符

private( 只是继承后,相应的变量仍是私有的,不能直接访问 )

1、 子父类成员属性的特点

package 继承;

public class Test1 {

    public static void main(String[] args) {

        Zi zi = new Zi();

        zi.num = 3;//zi对象中没有自己写num属性,这个num属性是从父类中继承过来的

        zi.show();

        Zii zii = new Zii();

        zii.show();  //奇怪,zi.num = 3 不是改变了父类中的num的值嘛?zii.show中的num不也应该等于3嘛?可是为什么等于2.可以知道成员继承只是实现了代码的复用,而不是内存的复用

    }


}

class Fu{

    int num1 = 1;

    int num = 2;

}

class Zi extends Fu{

    int num2 = 4;

    public void show() {

        System.out.println(num + "..." + num);//3...3

        System.out.println(this.num + "..." + super.num);//3...3

        System.out.println(num2 + "..." + num1);//4...1

    }

}

class Zii extends Fu{

    public void show() {

        System.out.println(this.num + "..." + super.num);//2...2

    }

}

从上面的例子看成员变量的内存分析图。

2、 子父类成员方法的特点

public class Test2 {

    public static void main(String[] args) {

        Demo1 d = new Demo1();

        d.show();

    }

}

class Demo{

    String name;

    public void show() {

        System.out.println("fu show run");

    }


    public Demo() {


    }


    public Demo(String name) {//构造方法的重载

        this.name = name;

    }

}

class Demo1 extends Demo{

    public void show() {//父类方法的重写

        System.out.println("zi show run");

    }

}

函数的两个特性

1、重载(同一个类中)

方法名可以相同

方法的参数类型、个数、顺序至少有一项不同

方法返回值类型可以不同

方法的修饰符可以不同

仅仅只是返回类型或修饰符不一样,不能构成重载

2、重写(子父类中)

子类的方法的返回类型、参数、方法名、要和父类的完全一致(也就是说修饰符可以不一致,请看第二条),否则就不构成重写

子类方法不能缩小父类方法的访问权限(即修饰符问题)

什么时候使用重写:当对一个类进行子类的扩展时,子类需要保留父类的功能声明。但是要定义子类中该功能特有的内容时,可以使用重写。

3、 子父类构造函数的特点

public class TestSuper2 {

    public static void main(String[] args) {

        System.out.println("开始创建一个ChildClass对象");

        new ChildClass1();


    }

}

class FatherClass1 {

    int m = 12;

    static {

        System.out.println("hello");

    }

    public FatherClass1() {

        System.out.println(m);

        System.out.println("创建FatherClass");

        show();

    }

    public void show() {


        System.out.println("Father show");

    }

}

class ChildClass1 extends FatherClass1 {

    int num = 15;


    static {

        System.out.println("hello1");

    }


    public void show() {

        System.out.println("Child show..." + num);

    }


    public ChildClass1() {

        super();

        //super执行完后,才对子类ChildClass1进行成员变量的显示初始化

        System.out.println(num);

        System.out.println("创建ChildClass");

    }

}

直接看运行结果,我们再来分析。在分析之前,我们先明确一个概念: 构造函数用于对象的初始化,而静态初始化块用于类的初始化 。

开始创建一个ChildClass对象

hello

hello1

12

创建FatherClass

Child show...0

15

创建ChildClass

分析:

程序首先从main方法入手,先打印出“开始创建一个ChildClass对象”。之后创建一个ChildClass1的实例。

在实例化之前,先进行类加载。先沿着继承树上溯到Object类。先执行Object类的静态初始化块,在向下执行子类的静态初始化块,直到我们实例化类的静态初始化块为止。类的初始化过程只进行一次。(即先进行类加载,类加载过程只进行一次)。这就是为什么会先后打印出hello和hello1。

在堆内存中开辟空间,分配地址。并在对象空间中,对对象中的成员变量进行默认初始化。

调用构造函数,进行特定数据的初始化(即this.name = name等)。这里要注意: 在调用构造函数前已经完成成员变量的默认初始化。

进入构造函数时,第一行会先调用父类的构造函数进行父类初始化。(调用父类的构造函数前,也已经完成了父类的默认初始化)。先后打印出:12,创建FatherClass,Child show...0。

父类的super()函数执行完毕后,执行栈返回子类的构造函数,再对子类的成员变量进行显示的初始化。(此时输出15)

最后进行的是对特定数据的初始化。即this.name = name等。

需要注意的是: 成员变量的默认初始化是在调用构造函数之前,而显示初始化是在进入构造函数调用父类的super()方法之后。特定数据的初始化则在最后进行。

多态

1、 成员属性的特点

package 多态;

public class chengyuanshuxing {

    public static void main(String[] args) {

        Fu zi = new Zi();

        System.out.println(zi.num);//4

    }

}

class Fu{

    int num = 4;

}

class Zi extends Fu{

    int num = 5;

}

多态时,成员属性的特点:

编译时,参考父类型上是否有调用的成员属性,有则编译通过,没有则编译失败。

运行时,参考父类型中是否有该成员属性,运行该成员属性。

简单说编译和运行都参考左边

2、成员函数的特点

package 多态;

public class chengyuanshuxing {

    public static void main(String[] args) {

        Fu zi = new Zi();

        zi.show();//"zi show"

    }

}

class Fu{

    void show() {

        System.out.println("fu show");

    }

}

class Zi extends Fu{

    void show() {

        System.out.println("zi show");

    }

}

多态时,成员函数的特点:

编译时,参考父类型上是否有调用的成员方法,有则编译通过,没有则编译失败。

运行时,参考的是对象所属的类中是否有该成员方法,运行该成员方法。

简单说编译看左边,运行看右边

虽然类型是父类型,但是运行时this指向的是当前new实例的引用。

3、静态方法的特点

package 多态;

public class chengyuanshuxing {

    public static void main(String[] args) {

        Fu zi = new Zi();

        zi.show();//"fu show"

    }

}

class Fu{

    static void show() {

        System.out.println("fu show");

    }

}

class Zi extends Fu{

    static void show() {

        System.out.println("zi show");

    }

}

多态时,静态方法的特点:

编译时,参考父类型上是否有调用的静态变量,有则编译通过,没有则编译失败。

运行时,参考父类型中是否有该静态变量,运行该静态变量。

简单说编译和运行都参考左边

静态方法是基于类的,而多态是基于对象的 ,所以调用时,该对象是那个类型的就调用相应类的静态方法。且 静态方法不具有多态性

写在最后:欢迎留言讨,欢迎关注小编  (#^.^#)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 1,600评论 4 12
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,645评论 18 399
  • 大概两三年前,和朋友在外面吃饭,旁边一桌年轻人,他们推杯换盏,大声欢笑,气氛不要太热闹。当时朋友不无感慨地说,年轻...
    丹顶鹤昌阅读 389评论 0 2
  • 今日在群里学到两个新知识点: 【线性增长】和【指数增长 】 有的人接收新事物特别快,表现特别突出,可时间长了,就不...
    晏某人阅读 296评论 4 0
  • 1 一见钟情易 “素筏,你又跑哪边去了,师傅喊你练功。”我坐在屋顶看着大师姐归尘喊我, “知道了。”我百无聊...
    素筏生花阅读 327评论 0 1