一:面向对象----Object
本人为自学Java系列,内容来自于中国大学mooc华东师范大学陈育良教授《Java核心技术》,在此感谢老师!
在Java中引入了对象和类的概念
- 对象是一个变量--------具体的东西;
- 类就是类型(是规范,是定义),从万千对象中抽取共性;
- 类规定了对象应该有的属性内容和方法;
- 对象就是类的具体实现,是活生生的;
- 例如:土豆丝菜谱是类,一盘土豆丝就是对象
- 从程序员的发展角度来理解,OO-Oriented Object是对OP—Oriented Procedure的一种改造。
- OP面向过程更强调方法和动作,所有的变量是被动参与进来的,没有自主决定权
- OO面向对象属于每个对象的。能否实现由每个对象说的算,有主人翁精神
OP代码实例:
- public class OpExample {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a,b,c;
- a = 1;
- b = 2;
- c = add(a,b);
- System.out.println(c);
- }
- public static int add(int m,int n) {
- return m+n;
- }
OO实例:
- public class OoExample {
- private int a;
- public void set(int a) {
- this.a = a;
- }
- public int add(int b) {
- return this.a+b;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int b = 5;
- OoExample obj = new OoExample();
- obj.set(10);
- System.out.println(obj.add(b));
- }
- }
二:Reference和基本类型
对象基本定义:
类型 变量名 = new 类型(参数)
A obj = new A(形参) int a=new int(5)等价与 int a=5
A obj1 = new A() A obj2 = new A()
以上有个对象,它们的类型都是A,但是两个不同的对象,在内存中有不同的存放的地址。因此没有完全两个对象是相同的
Obj可以看做是内存中一个对象的句柄,在C/C++中称为指针,在Java中是Reference。
对象赋值是Reference赋值,基本类型是直接拷贝。下面两个例子就是区分两者的区别。
- public class Reference {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int num1 = 5 ;
- int num2= num1;
- System.out.println("num1: "+num1+", num2: "+num2);
- num2 = 10;
- System.out.println("num1: "+num1+", num2: "+num2);
- Mynumber obj1 = new Mynumber();
- Mynumber obj2 = new Mynumber();
- System.out.println(obj1.num);
- System.out.println(obj2.num);
- System.out.println("=========接下来输出新值===========");
- obj2 = obj1;
- obj2.num = 10;
- System.out.println(obj1.num);
- System.out.println(obj2.num);
- }
- }
- public class Mynumber {
- int num =5 ;
- }
输出结果:
- num1: 5, num2: 5
- num1: 5, num2: 10
- 5
- 5
- =========接下来输出新值===========
- 10
- 10
基本类型是值的copy,num2被num1赋值为5,所以内存num1和num2分别指向的就是内存中不同的地方,但是值都是5。当num2赋值为10时,num1的值不变。
Reference赋值就是第二种情况,obj2被obj1赋予值,这个时候,obj1和obj2作为指针都是指向内存中同一地址,任何一个值被初始化改变,两者都会改变。
有一个同样的例子可以证明:
- public class ArguementPassing {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- int a =1; int b = 2;
- swap(a,b);
- System.out.println("a is: "+a+", b is: "+b);
- Mynumber obj1 = new Mynumber();
- Mynumber obj2 = new Mynumber();
- obj2.num = 10;
- swap(obj1,obj2);
- System.out.println("obj1 is "+obj1.num+", obj2 is "+obj2.num);
- }
- public static void swap(int m,int n) {
- int s = m;
- m = n;
- n = m;
- }
- public static void swap(Mynumber obj3, Mynumber obj4) {
- int s = obj3.num;
- obj3.num = obj4.num;
- obj4.num = s;
- }
- }
输出结果:
- a is: 1, b is: 2
- obj1 is 10, obj2 is 5
- 第一个swap函数进行ab的交换并没有成功,因为第6行在调用swap函数,等于是将1和2 赋值给m和n了,这个时候 a b m n四个数字分别指向四个不同的内存地址。所以m和n的交换并不会改变a和b的值。
- 第二个swap函数是对象的赋值,成功交换值。Obj1和obj3指向同一块内存地址,obj2和obj4指向同一块内存地址。对象赋值是Reference赋值。
三:数据初始化
New出对象后,内部属性值默认是多少?
- public class Initialization {
- boolean v1;// boolean v1 = new b
- byte v2;
- char v3;
- double v4;
- long v5;
- int v6 ;
- float v7;
- short v8;
- public static void main(String[] args) {
- Initialization obj = new Initialization();
- System.out.println("the value of boolean is "+obj.v1);
- System.out.println("the value of byte is "+obj.v2);
- System.out.println("the value of char is "+obj.v3);
- System.out.println("the value of double is "+obj.v4);
- System.out.println("the value of long is "+obj.v5);
- System.out.println("the value of int is "+obj.v6);
- System.out.println("the value of float is "+obj.v7);
- System.out.println("the value of short is "+obj.v8);
- }
- }
输出结果:
同时有一点需要注意:类的成员变量,javac会直接赋值,但是对于函数内部的局部变量不会给默认值,需要初始化后才能使用。
函数内部的a没有初始化赋值,直接报错了。
原文地址:https://www.cnblogs.com/yblecs/p/12232321.html
时间: 2024-11-07 16:16:06