美文网首页你不知道的JAVASE
你不知道的JAVASE(2)——面向对象

你不知道的JAVASE(2)——面向对象

作者: CANAlan | 来源:发表于2020-04-15 00:55 被阅读0次

    心情: 凑活

    笔名: 花美

    行业: telecommunication

    TIME: 2020-4-13

    程序中面向对象的意义

    名言: 万物皆对象 !

    类和对象

    1. 类是模子,确定对象将要拥有的特征(属性)和行为(方法)
    1. 对象是类的实例化的表现形式
    1. 类是对象的类型
    1. 对象是特定类型的数据

    属性和方法:

    • 属性——对象具有的各种静态特征,就是对象有什么东西
    • 方法——对象具有的各种动态行为,就是对象能做什么事情

    面向对象——单一职责(功能)原则:

    Why use it:解耦和提高复用性

    How to use:一个类class干一件事,职责分发到不同class中

    例子:cat 定义成一个类(拥有属性和行为),testcat定义成一个类(实例化:new一个cat类。并且写出怎么测试cat类代码)

    实例化对象的过程为 3个部分:

    — 声明对象 Cat one

    image.png

    — 实例化对象 new Cat();

    image.png

    — 赋值指向 Cat one = new Cat();

    image.png

    注意1:实例化两个Cat —— 在堆(Heap)中开辟 2个独立空间用于存放数据,one对象属性修改数据,对two对象不影响。栈-stack中存储的是堆-heap中的地址引用,也就是对象引用

    Cat one = new Cat();
    Cat two = new Cat();
    
    image.png

    形象化:老张和老王一人有一个家具装修一模一样的房子,但是房子的所属者不同——每人都有一把与对方不相同的钥匙,所以对任何一个房子的重新装修,都不会影响对方

    1586695817730.png

    注意2:下列是另一种创建对象方法</mark>表示将one的内存地址赋值给了two(图一),也就是将one的钥匙给了two(图二),结果(图三),此时one和two都有对cat的修改权限,当然谁最后赋值就决定cat属性值是什么,毕竟做什么事情都是一步一步来的嘛!

    Cat one = new Cat();
    Cat two = one;
    
    image.png image.png
    image.png

    构造方法

    1. 构造方法与类名相同且没有返回值(不需要写void),在cat类里构造方法写法是

    无参:public cat(){} | 有参:public Cat (String name){}

    1. 只能在对象实例化时候调用——new的好搭档(是的,new保养了他)
    1. 在没有写构造方法时,系统会自动的添加一个无参数的构造方法,使对象完成实例化操作

    这就是为什么new Cat( )时候,需要加个( ),因为这哥们是一个方法啊。

    1. 如果你手欠写了一个构造方法(无参有参都可以)这里举例有参:public Cat (String name){},那么你就没有无参构造方法了也就是系统给你添加的无参构造方法:public Cat(){}不会提供给给你了,就是系统不分配了。这时候在测试类中实例化写法是:Cat one = new Cat("小奶狗"),乳沟你还挺倔强的,就像用无参实例化:Cat one = new Cat( )没问题,你可以在cat类里自己多写一个:public cat(){}
    1. 构造方法不允许被类内的非构造方法的 方法直接调用比如:public void run(){Cat()}这种是不可以的
    1. 构造方法定义时候可以相互调用——也就是重载构造方法public Cat(String name){this();}函数内执行的是无参构造方法
      tip:this()必须放在方法体内第一行
     System.out.print("这是cat类的构造方法,new实例化的时候最先执行一次这个cat()方法,因为实例化都在程序的最开头嘛,很显然我这里是输出这句话");
     }
    

    有参构造方法对象实例化对类数据初始化问题与 THIS

    class Cat{
    String name;
    public Cat(String sname){
    name = sname; 
    
    // 这里你的形参: sname 必须和属性值:name 不一样 
    //如果你写成这样  public Cat(String name){ name=name }
    //因为java有就近原则 找到的其实就是你形参自己 根本没传到 Cat定义的name中——也就是cat类中第一行的name
    
    }
    public void run(){
    System.out.println(name);
    }
    public void eat()
    {
    System.out.println(name+" eating! ");
    }
    
    }
    class TestCat{
    public static void main(String[] args){
    Cat one = new Cat("小奶狗");
    one.run();
    }
    
    // 结果:
    // 小奶沟
    
    }
    

    关于this:

    this范围:当前对象 ,this可调用属性也可以是方法this.name | this.eat

    解决成员属性与局部变量重名冲突(上边例子)

    //上边的代码其中有参构造方法也可以这么写:
     public Cat(String name)
     {
     this.name = name;
     }
    

    相关文章

      网友评论

        本文标题:你不知道的JAVASE(2)——面向对象

        本文链接:https://www.haomeiwen.com/subject/wqgfvhtx.html