Java 面向对象(一)

#🔭学习内容

🔭1、基本概念

🪶(1)面向过程

    用户提出哪些要求,就针对用户的要求进行制作,直接制作出一个完整的整体

🪶(2)面向对象

    针对用户提出的要求进行分析,并将分析的结果设计成一张完整的图纸,与需求的用户确认,然后将一切的准备工作全部处理完之后再分块制作,最后将各个小的部分组装在一起

面向对象比面向过程更能适应用户的变化

面向对象有三个主要特性:

  • ✒️封装性
        一是指把对象的属性和行为看成一个密不可分的整体,将这两者“封装"在一个不可分割的独立单位(即对象)中;
        另一层含义指“信息隐蔽",把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知道,或只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节。
        封装机制一个特点是,为封装在一个整体内的变量及方法规定不同级别的“可见性”或访问权限。
  • ✒️继承性
        首先拥有反映事物一般特性的类,然后在其基础上派生出反映特殊事物的类。如己有汽车的类,该类中描述了汽车的普遍属性和行为,进一步再产生轿车的类,轿车的类是继承于汽车类,轿车类不但拥有汽车类的全部属性和行为,还增加轿车特有的属性和行为。
        在Java程序设计中,己有的类可以是Java开发环境所提供的一批最基本的程序——类库,用户开发的程序类是继承这些己有的类。这样,现在类所描述过的属性及行为,即己定义的变量和方法,在继承产生的类中完全可以使用。被继承的类称为父类或超类,而经继承产生的类称为子类或派生类。
        面向对象程序设计中的继承机制大大增强了程序代码的可复用性,提高了软件的开发效率,降低了程序产生错误的可能性,也为程序的修改扩充提供了便利。
        若一个子类只允许继承一个父类,则称为单继承;若允许继承多个父类,则称为多继承。目前许多面向对象程序设计语言不支持多继承。而Java语言通过接口(interface)的方式来弥补由于Java不支持多继承而带来的子类不能享用多个父类的成员的缺点。
  • ✒️多态性
        多态是允许程序中出现重名现象。Java 语言中含有方法重载与对象多态两种形式的多态。
         方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
         对象多态:子类对象可以与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同。
        多态的特性使程序的抽象程度和简捷程度更高,有助于程序设计人员对程序的分组协同开发。

🔭2、类与对象

🪶(1)关系

  • ✒️类:指的是一类事务,是一个抽象的概念。
  • ✒️对象:指的是属于某个类的具体实现。

关系:类是对象的抽象,对象是类的实例
一个类可以有很多对象,而一个对象必然属于某个类。

🪶(2)类的定义

类的定义语法如下:

class 类名称{
     数据类型 属性;    //声明成员变量(属性)
     …
    public 返回值的数据类型 方法名称(参数1,参数2…){
         程序语句;      //定义方法的内容
        [return表达式;]
    }
}

定义一个Person类

class Person{
  String name;          //声明姓名属性 
  int age;             //声明年龄属性
  public void tell(){  //取得信息的方法
	  System.out.println("姓名:" + name +",年龄:"+ age);
	}
}

🪶(3)对象的创建和使用

类名 对象名称=null        // 声明对象
对象名称=new 类名()     //实例化对象

用以上格式产生对象分为声明对象和实例化对象两步。
当然也可以直接通过以下方式一步完成:

类名 对象名称=new 类名()

以上格式与数组定义的格式相似,因为类和数组都属于引用数据类型,只要是引用数据类型的使用格式都可以使用如上的定义样式。

创建对象的具体范例

class Person{
  String name;              //声明姓名属性 
  int age;                  //声明年龄属性
  public void tell(){       //取得信息的方法
	  System.out.println("姓名:" + name +",年龄:"+ age);
	}
}
public class Demo{
  public static void main(String[] args){
    Person p=new Person();  //创建并实例化对象
  }
}

所有的对象名称都在栈内存中保存,而对象的具体内容则保存在对应的堆内存之中,必须使用new关键字才能开辟堆内存空间。

访问对象中的属性或方法

访问属性:对象名称.属性名
访问方法:对象名称.方法名()

范例(可以创建多个对象

class Person{
  String name;              //声明姓名属性 
  int age;                  //声明年龄属性
  public void tell(){       //取得信息的方法
	  System.out.println("姓名:" + name +",年龄:"+ age);
	}
}
public class Demo{
  public static void main(String[] args){
    Person p1=null;
    Person p2=null;
    p1.name="张三";           //为name赋初值
    p2.name="李四";
    p1.age=30;                //为age赋初值
    p2.age=32;
    p1.tell();                //调用tell方法
    p2.tell();
  }
}

对象引用传递

class Person{
  String name;              //声明姓名属性 
  int age;                  //声明年龄属性
  public void tell(){       //取得信息的方法
	  System.out.println("姓名:" + name +",年龄:"+ age);
	}
}
public class Demo{
  public static void main(String[] args){
    Person p1=null;
    Person p2=null;
    p1=new person();        //只实例化pl一个对象 
    p2=p1;                  //把pl的堆内存空间使用权给p2
    p1.name="张三";
    p1.age=30;
    p2.age=33;              //设置p2对象的内容,实际上就是设置pl对象的内容 
    System.out.print("p1的内容:");
    p1.tell();
    System.out.print("p2的内容:");
    p2.tell();
  }
}
    

运行结果:

p1的内容:姓名:张三,年龄:33
p2的内容:姓名:张三,年龄:33

从程序运行结果可以发现,两个对象的输出内容是一样的,实际上所谓的引用传递,就是将一个堆内存空间的使用权给多个栈内存空间,每个栈内存空间都可以修改堆内存的内容

一个栈内存空间只能指向一个堆内存空间,如果要想再指向其他的堆内存空间,则必须先断开已有的指向才能分配新的指向。

🔭3、封装性

     用对象直接访问类中的属性在面向对象法则中是不允许的。所以为了避免程序中这种错误的发生,在一般的开发中往往要将类中的属性封装(private),封装的格式如下:

属性封装:private 属性类型 属性名称;
方法封装:private 方法返回值 方法名称(参数列表){ }

只要是被封装的属性,则必须通过setter和getter方法设置和取得,范例如下:

class Person{
  private String name;              //声明姓名属性 
  private int age;                  //声明年龄属性
  public void tell(){               //取得信息的方法
	  System.out.println("姓名:" + this.getName() +",年龄:"+ this.getAge());   // this 强调该方法是本类中的方法,可不写
	}
	public String getName(){
	  return name;
	}
	public void setName(String n){
	  name=n;
	}
	public int getAge{
	  return age;
	}
	public void setAge(int a){
	  if(a>0 && a<150){
	    age=a;
	  }
	}
}
public class Demo{
  public static void main(String[] args){
    Person p=new Person();  //创建并实例化对象
    p.setName("张三");
    p.setAge(30);
    p.tell();
  }
}

类图的表示

                  Person
- name:  String
- age  :   int
+ tell ()                   :void
+ getName ()              :String
+ setName (String n)       :void
+ getAge()                :int
+ setAge (int a)            :void

-表示private
+表示public

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亮点菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值