Java 面向对象,对象创建和使用

面向对象描述

  优点:耦合度低,扩展力强,更符合人类的思维方式

  OOA 面向对象分析; OOD 面向对象设计 ;OOP 面向对象编程

面向对象包括三大特征

  封装 、继承、多态

类和对象的概念  

什么是类?
  类实际上在现实世界当中是不存在的,是一个抽象的概念。
  是一个模板。是我们人类大脑进行“思考、总结、抽象”的一个
  结果。(主要是因为人类的大脑不一般才有了类的概念。)

  类本质上是现实世界当中某些事物具有共同特征,将这些共同
  特征提取出来形成的概念就是一个“类”,“类”就是一个模板。

  明星是一个类

什么是对象?
  对象是实际存在的个体。(真实存在的个体)

  宋小宝就是一个对象

在java语言中,要想得到“对象”,必须先定义“类”,“对象”是通过“类”这个模板创造出来的。

  类就是一个模板:类中描述的是所有对象的“共同特征信息”对象就是通过类创建出的

这几个术语你需要自己能够阐述出来:
  类:不存在的,人类大脑思考总结一个模板(这个模板当中描述了共同特征。)
  对象:实际存在的个体。
  实例:对象还有另一个名字叫做实例。
  实例化:通过类这个模板创建对象的过程,叫做:实例化。
  抽象:多个对象具有共同特征,进行思考总结抽取共同特征的过程。

  类 --【实例化】--> 对象(实例)
  对象 --【抽象】--> 类

类是一个模板,是描述共同特征的一个模板,那么共同特征包括什么呢?

  类 = 属性 + 方法

  属性来源于:状态

  方法来源于:动作

类的定义

  1、怎么定义一个类,语法格式是什么?    

      [修饰符列表] class 类名 {
        //类体 = 属性 + 方法
        // 属性在代码上以“变量”的形式存在(描述状态)
        // 方法描述动作/行为
      }

  2、为什么属性是“以”变量的形式存在的?

    是因为属性对应的是“数据”,数据在程序中只能放到变量中。

对象和引用

  

 

 

画内存图

  

  
 1 public class User{
 2     // 用户id
 3     // 访问id不能这样:User.id (这是错误的,实例变量不能用类名访问。)
 4     // id的访问必须先造对象,然后对象有了,才能访问对象的id
 5     int id; //成员变量,实例变量(对象变量,一个对象一份。)
 6     // 用户名
 7     String username; // 成员变量可以不手动赋值,系统赋默认值。
 8     // 密码
 9     String password;
10 }
11 
12 // 第一步:类加载
13 // 第二步:调用UserTest类的main方法(方法调用要压栈。)
14 public class UserTest{
15 
16     // 方法体外声明的变量叫做成员变量。
17     //User u1; //成员变量。(实例变量)
18 
19     public static void main(String[] args){
20         //int i = 100;
21 
22         // 方法体当中声明的变量叫做局部变量
23         User u1 = new User();
24         // 实例变量怎么访问(属性怎么访问)?
25         // 语法是:“引用.属性名”
26         System.out.println(u1.id); //0
27         System.out.println(u1.username); //null
28         System.out.println(u1.password); //null
29 
30         u1.id = 11111;
31         u1.username = "zhangsan";
32         u1.password = "123";
33 
34         System.out.println(u1.id);
35         System.out.println(u1.username);
36         System.out.println(u1.password);
37         
38         User u2 = new User();
39         u2.id = 22222;
40         u2.username = "lisi";
41         u2.password = "456";
42 
43         System.out.println(u2.id);
44         System.out.println(u2.username);
45         System.out.println(u2.password);
46     }
47 }
View Code

  第二个

  
  1 // 住址类
  2 public class Address{
  3 
  4     // 一个家庭住址有3个属性。
  5 
  6     // 城市
  7     String city; // 实例变量
  8 
  9     // 街道
 10     String street;
 11 
 12     // 邮编
 13     String zipcode;
 14 }
 15 
 16 public class User{
 17 
 18     // 类=属性+方法
 19     // 以下3个都是属性,都是实例变量。(对象变量。)
 20 
 21     // 用户id
 22     // int是一种基本数据类型
 23     int id; // 实例变量
 24 
 25     // 用户名
 26     // String是一种引用数据类型
 27     String username; // 实例变量
 28 
 29     // 家庭住址
 30     // Address是一种引用数据类型
 31     // addr是成员变量并且还是一个实例变量
 32     // addr是否是一个引用呢?是。addr是一个引用。
 33     Address addr; 
 34 }
 35 
 36 /*
 37     到目前为止,如果什么也没听懂,怎么写代码?
 38         记住一个知识点就行,可以后期慢慢学习画图。
 39             记住一句话:里面有什么就能“点”什么。
 40 
 41             所有的实例变量(属性)都是通过“引用.”来访问的。
 42     
 43     引用和对象怎么区分?
 44         “引用”是啥?是存储对象内存地址的一个变量。
 45         “对象”是啥?堆里new出来的。
 46     
 47     通俗一点:
 48         只要这个变量中保存的是一个对象的内存地址,那么这个变量就叫做“引用”。
 49     
 50     思考:
 51         引用一定是局部变量吗?
 52             不一定。
 53 */
 54 public class Test{
 55     public static void main(String[] args){
 56 
 57         //报错了。id是实例变量,必须先创建对象,通过“引用.”的方式访问。
 58         /*
 59             User u = new User();
 60             u是引用。
 61         */
 62         //System.out.println(User.id);
 63 
 64         
 65 
 66         /*
 67         int i = 100;
 68         int j = i; // 原理:会将i中保存的100复制一份,传给j变量。
 69         */
 70         
 71         // 家庭住址对象
 72         Address a = new Address();
 73         a.city = "北京";
 74         a.street = "大兴区";
 75         a.zipcode = "121221";
 76         
 77         // 用户对象
 78         User u = new User();
 79         System.out.println(u.id); // 0
 80         System.out.println(u.username); // null
 81         System.out.println(u.addr); // null
 82 
 83         u.id = 11111;
 84         u.username = "zhangsan";
 85         u.addr = a;
 86 
 87         // 思考一个问题:
 88         // 我想直到zhangsan他是哪个城市的,代码应该怎么写?
 89         System.out.println(u.username + "是"+u.addr.city+"城市的!");
 90 
 91         // u.addr.city 这行代码可否拆分呢?u.addr.city 节省变量。
 92         // 拆分成以下代码和以上效果完全相同,原理完全相同,不同的是以下代码多了两个变量。
 93         Address ad = u.addr;
 94         String zhuZhi = ad.city;
 95 
 96         System.out.println(zhuZhi);
 97 
 98         //-----------------------是否理解以下代码---------------------------
 99         int x = 100;
100         // = 代表赋值运算,“赋值”中有一个“值”
101         // x变量中的值是100. 将100复制一份给y
102         // 表示:将x变量中保存的值100复制一份给y
103         int y = x;
104 
105         //-----------------------是否理解以下代码---------------------------
106         Address k = new Address(); // Address k = 0x1111;
107         Address m = k; // 这里表示将k变量中保存的0x1111复制了一份传给了m变量。
108 
109     }
110 }
View Code

  需要注意:

  // int x = 100 ;  -- 在栈里直接保存 100

  // = 代表赋值运算,“赋值” 中有个值;

  //  X 变量中的值是100,将100 复制一份到 y

  // int y= x;

  //-----------------------

  Address k = new Address(); // Address k = 0x1111; -- 这个是 堆中的对象的地址
  Address m = k; // 这里表示将k变量中保存的0x1111复制了一份传给了m变量。

 

空指针异常(NullPointerException)

  

 1 /*
 2     空指针异常。(NullPointerException)
 3 
 4     关于垃圾回收器:GC
 5         在java语言中,垃圾回收器主要针对的是堆内存。
 6         当一个java对象没有任何引用指向该对象的时候,
 7         GC会考虑将该垃圾数据释放回收掉。
 8     
 9     出现空指针异常的前提条件是?
10         "空引用"访问实例【对象相关】相关的数据时,都会出现空指针异常。
11 */
12 public class NullPointerTest{
13     public static void main(String[] args){
14         // 创建客户对象
15         Customer c = new Customer();
16         // 访问这个客户的id
17         System.out.println(c.id); // 0
18 
19         // 重新给id赋值
20         c.id = 9521; // 终身代号
21         System.out.println("客户的id是=" + c.id);
22 
23         c = null;
24         // NullPointerException
25         // 编译器没问题,因为编译器只检查语法,编译器发现c是Customer类型,
26         // Customer类型中有id属性,所以可以:c.id。语法过了。
27         // 但是运行的时候需要对象的存在,但是对象没了,尴尬了,就只能出现一个异常。
28         System.out.println(c.id);
29     }
30 }
31 
32 class Customer{
33     // 客户id
34     int id; // 成员变量中的实例变量,应该先创建对象,然后通过“引用.”的方式访问。
35 }

 

方法调用参数传递

    java中规定:参数传递的时候,和类型无关,不管是基本数据类型还是引用数据类型

          统一都是将盒子中保存的那个“值”复制一份,传递下去。

    java中只有一个规定:参数传递的时候,一定是将“盒子”中的东西复制一份传递过去。

              内存地址也是值,也是盒子中保存的一个东西。

   View Code
   View Code

 

    

ps  Java中没有指针,通过引用访问堆内存的数据

posted @ 2020-08-29 12:10  一叶扁舟,乘风破浪  阅读(676)  评论(1编辑  收藏  举报