java学习对象笔记



java中的对象理解

这篇文章是写个自己的一个阶段性总结,也是写个那些对java有一定学习的人,共同探讨对对象的理解

对象有三个特性,封装性、多态性、继承性

一.封装性

封装性就是对象的核心思想,就是把对象抽象出来形成一个类,其中的属性,方法等都对外不公开细节。

这时候我们首先要明白对象的概念和类的概念。对象就像语文中的解释:目标,或者是描写一个特定的人或物,(当然还有处对象那个对象,这里不说这个)。换句话说也就是个物质。但在java中扩展了也可以是一个动作。后面会说。类就是对一系列相似的对象的一个抽象。做个比方,张三,王五。他们都是人,他们都可以抽象出人这个类。

java中所说的属性(变量)就是这个类的属性,都是实际中的抽象,就像人都要有名字吧,所以就有了name的属性。都有年龄吧,就有了age的属性,但是怎么区分这个类是人不是动物呢,这就看你对事物的理解能力和抽象能力,比如说人或说话,动物不会这就区分开了,但是这时候你又会发现,speak不是一个属性,因为说话有好多,你可以说好多词,好多种语言,这就可以是一个方法,还有人的直立行走都是一个方法,因为它有很多种变形,比较复杂。

总结一下,物质都可以抽象为类,实例化就成为了对象,类中的属性就是名词,如人的姓名什么的,动作动词就是方法比如说什么。

好了继续,属性一般为private 不能让别人更随便更改的,而方法是public的可以让人调用,为什么这样呢,还是以人为例,name是随便更改的,可以更改但是不是随便更改的(类是现实的抽象,所以尽量符合现实),但是说话是每个人都会的,每个实例化的对象,都可以用这个方法。这时候我们就像到了一个东西叫构造方法,什么是构造方法呢?大部分都是用来初始化类的属性的,就像人一生下来就要命名的。这里会讲到this关键字(这里不详细讲,就一句话this可以看做指向当前类的指针,试着理解),这里还会讲到方法的重载,为什么重载?因为我们有的时候不是把什么name啊。studentNumber等都是一次性构建出来的,可能只构建一部分,所以要重载,构造方法,来实现健壮性。

这时候我们有想到,要是改名字了怎么办?我们设计了一种get和set方法,人们不是随便改你的名字,但是有的时候可以改,我们调用set方法来实现。

还有什么想要如sun一样,世界上只有一个不让外界实例化的,我们可以采用static的属性和static的get ,set方法 private的构造方法(这个不是本次博客的重点,有兴趣自己理解)。

二、继承性

继承性源于java中对于extends的理解。java的继承源于现实的父子啊什么,还有什么猫科类动物,是老虎,猫的鼻祖了啥的。怎么来的这里不讨论了,主要就这个特性,是的面向对象的语言可以好用,因为以前你写的东西,或者别人写的都可以拿来用,别人写了个apple你也可以进行继承补充。写一个SonApple extends apple 。然后加一些方法,或者重写一些方法。这时候涉及到一个问题,比如权限的问题,假设Father父类中有个去洗浴中心的方法。Son子类继承了父类,但是父亲不想让儿子会这个方法就把这个方法设置成为private,但是有的方法不想让外界调用,但希望子类使用,这时候我们就用protect来修饰。但是同一个包下是可用的,这时候我们就的去了解一下包的用途和概念,包类似于windows下的文件夹,你解压一个程序的时候,大部分他们都有一个文件夹,比如英雄联盟也都放到一个文件夹下。包和这个类似。你写程序的时候把一些可以相互调用的类写到一起。不能的写到别的地方,防止你意料不到的权限冲突。这里说一个取巧的方法,如果子类继承了父类但是有些方法不想让别人调用但是父类的这个时候最好override一下写个空方法。

这时候我们有考虑一个问题,比如猫科类动物,是老虎和猫的源头,但是他们的叫声有很大的区别,这时候你写一个一个猫科类的动物,但是他的sound的方法不能实现其中的具体代码,这个时候java提供了一种叫做abstract (抽象的)方法和类。注意:抽象方法只能在抽象类中

abstract class  AbLei{

public abstract void   ceShi();

}

然后继承这个类的类,必须实现这个抽象方法,而且抽象类是不可以实例化的。而且不能上转,也许你会说在Eclipse中我实现的抽象父类的实现。但是那是使用了内部类直接实现了它的抽象方法。不是直接实现了父类。

这个时候我们会发现, 我们可以是用 Father son=new son();

这是我们就进入了第三阶段

3.多态性

让我们分析一下,我们在编译的时候,是使用父类的类型,这就确定了这个类中的属性和方法都有什么,但是实例化的是在后面的new 就是在堆内存中画出的内存区域的代码,是son的,也就是如果父类没有name 的这个属性,子类有,但是实例化的时候我们是不能调用name这个属性的,因为在栈内存中是不存在的。但是在堆内存是存在的,也就是。

 

Son的代码

package test.abstractText.exercise1;

public class ASon extends AFather{
 
 String name="xiaoliu" ;
     @Override
    public void sound() {
       System.out.println("miaomiao");
    }
     @Override
    public void play() {
     System.out.println(name+"wan");
    }
     public void run(){
      System.out.println("pao........");
     }
}


Father 中的代码

public abstract class AFather {

 
    int  age ;
   
 public abstract void sound();
 
    public void play(){
     System.out.println("wan");
    }
 public static void main(String[] args) {

  AFather aSon=new ASon();
  aSon.play();

  aSon.name="wwwww";//这句是错误的
        
 };
}


就像图中一样,我们不能直接调用name但是我们可以再play中调用Name

哈哈,这样你就懂了,继承和上转型对象了,这个很有用,我们的框架构建了,一个猫科动物,方法属性是定好的。你继承了,可以使用上转行对象来防止继承中添加的方法,但不是猫科动物所具有的,错误的实现。(这里是逻辑错误,如果你确定你要添加的属性和方法你可以不适用上转,可是直接用ASon来实现)。

 

 这个时候我们在override 中总是看到

一个东西 super;这个东西个this是一样的,super.play();就是父类的play 方法,super.name;就是父类的name属性,super();就是父类的空构造方法。你可以去常识理解this ,super是指向子类和父类的指针,但是实际不是这样的(因为java中不谈指针),我们只是可以这样理解,学过C得很容易理解,对记忆super,this的用法记忆有很大帮助。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值