小白学习的java第八天(上):面向对象

(最近在忙着小论文的发表,断更了几天,但是写完之后也可以分享一下我的小论文供大家参考一下!)

1.初始面向对象

我们需要知道就是之前我们学的就是面向过程,步骤很清晰,第一步第二步...处理一些简单清晰的问题。但是之后我们觉得不想把一些实际解决问题的方法写在main,所以我们又引入了方法抽出来,最后我们把实现这一类的方法再抽取出来,就行成了类,我们只需要对这个类创建对象就行了!(所以面向过程相当于执行流程,而面向对象就相当于框架,就比如洗衣机,面向过程就是里面你按洗衣机抽水泵、电机等等;但面向对象就是给你封装好了,你就只需要进行选择对象就行!)

【以类的方式组织代码,以对象的方法组织(封装)数据!】

【静态方法直接可以用类名就进行调用,但是非静态方法必须要new一个实例化对象才可以进行和调用!(原因就是静态方法是和类一起进行加载的,因此你不需要进行实例化就能用类调用,但是非静态就必须new一个对象才能进行!)】

2.对象创建分析

上面我写了一个简单的类,看到这就是想说明一下:

        1.我们创建的类都是抽象的,换句话说就是不是写死的,因为你写死也就失去了灵活性了,比如你可能会想,我创建的Jack,我直接在类里面给他赋值就可以了啊,但是tom怎么办呢,(而且我现在没有进行封装,封装的意思就是一个黑匣子就留一点一点点口,换句话,其实我并不太希望你的对象直接对我的属性就行查看!封装安全一点!)

        2.当然你会不会觉得是不是每次我们都需要在外面对对象属性进行赋值,这也太麻烦了吧,所以我们直接可以在里面就设置一些方案,直接在里面的方法就进行赋值了,放心里面的封装都会有的!!!

3.构造器

上面是我看到class文件,里面会自动生成构造器,

上面这个图就可以清楚看到构造器的作用:

        1.使用new关键字,本质上就是在调用构造器(可以自己尝试一下进行断点)

        2.就是可以用用来进行初始值,因为我们new对象都需要他,因此我们可以提前进行初始值!,当然你不写死,那就是输入两个有参就行(这里其实我原来也很疑惑,构造方法和方法有什么不一样呢,后面我们会慢慢就进行详细说明,为什么new需要构造方法,new本质就是在调用构造器!)

4.内存关系

这个图画的并不是很规范,大概意思就是new的对象实在堆里面开辟空间的!

5.面向对象三大特性

5.1封装:(我们程序设计要追求:高内聚,低耦合):

高内聚:就是类的内部数据操作细节自己完成的,不允许外部干涉;

低耦合:仅暴露少量的外面方法给外部使用

主要使用get,set方法

封装的好处:

1.提高代码的安全性,保护数据(private,就是不能直接对属性进行操作)

2.隐藏代码的实现细节(将里面具体怎么实现的,在外面是看不到的,高内聚)

3.统一接口(get,set就只在这两个地方对代码进行操作)

4.系统可维护增加(因为这个耦合性紧密,不至于在做项目的时候牵一发而动全身那种,这样维护就很困难了)

5.2继承(只有单继承,没有多继承!一个儿子只有一个爸爸,但是一个爸爸可以有多个儿子):

继承的本质就相当于把类进行更高的抽象,从而实现对现实世界更好的建模

(我第一次学的时候就感觉很麻烦,其实混淆的就是,我既然继承了,是不是就应该区别父类和子类是什么,怎么用呢,我们要明确为我们什么时候是用的父类,什么时候用的是子类,用什么进行区分!!!,带着这样的问题去学习,就会理解非常清楚!)

1.Object类(所以都是直接或者间接继承Object这个类,就像现在Person类里面没有东西,但是对象person.还是可以点出很多东西的!!!那就是Object里面的东西)

2.super(就是有个这样疑惑?还记得原来的this这个东西,就是指的是本类,那么要是我想用父类的么办呢,这样指代怎么明确了,super其实就是对于父类进行的)(对父类里面的东西,当然包括属性和方法)

super注意点:

        1.super调用父类构造方法,必须在构造方法的第一个(也就是写在最上面)

        2.super必须只能出现在子类的方法里面或者构造方法里面

        3.super和this不能同时调用构造方法

VS this:

        代表的对象不同:

                this:本身调用这个对象

                super:代表父类对象的应用

        前提:

                this:没有继承也可以使用

                super:只有子啊继承里面才可以使用

        构造方法:

                this():本类的构造

                super():父类的构造

5.3.方法重写:(方法的重写都是对方法进行重写,与属性无关)

        需要有继承关系,子类重写于父类关系(方法名相同,参数列表相同,修饰符范围可以扩大public》protected》default》private,抛出异常可以呗缩小不能扩大)

(这里我提一个问题?,就是父子类可以有相同的方法(方法名,参数什么的都一样)吗,如果你觉得可以,那么当我子类向调用这个方法的时候,到底是子类的还是父类,是不是没办法解决,那就需要重写这个@override进行重写,那么问题又来了,如果我父类调用,我还是父类的方法还是子类的方法呢!,我写一点代码看看!答案是使用重写后的方法!)

5.4多态

这里需要注意的!!!,举个例子就是子类有的,s2可以调用吗,答案是不可以的,因为对象能执行那些方法,主要看左边引用类型

再次根据这可以图可以分析,就是你创建的new Student(),他是可以和Studnet,Person进行挂钩的,但是最用决定你对象的,一定是看栈里面的引用对象!!!

------------------------------------------------------------------------

下面我想详细讲解一下多态的好处;(这也是我一直原来很困惑的地方!Father  f =  new Son() )

1.代码的扩展性很好(比如就是你们都是用父亲的,那么在不同儿子中调用也就方便一点),如果你觉得这样其实也没多方便,那么接着往下看

class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}

// 使用多态
Animal myAnimal = new Dog();
myAnimal.makeSound(); // 输出"Bark"

myAnimal = new Cat();
myAnimal.makeSound(); // 输出"Meow"

在数组中多态可是很好用的

List<String> list = new ArrayList<>(); // 可以用LinkedList替换而不影响其他代码

2.方法参数的调用(我觉得这个是我用的最舒服,也是我觉多态好的地方)如果里面不是Animal ,而是什么Dog,那就灵活了,不写死就降低了耦合性,这也是我们程序设计的目标

public void animalSound(Animal animal) {
    animal.makeSound(); // 根据实际对象类型调用相应方法
}

// 可以传入任何Animal子类
animalSound(new Dog());
animalSound(new Cat());

------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值