再谈面向对象

第一篇博客《理解面向对象》里已经说了:

Java的设计就是类的设计,通过public,pretected,private三个关键字实现了封装,通过extends实现了继承,子类对象可以直接赋值给父类变量,也就是实现了多态。

但是具体的类的一下规则,还有很多细节需要掌握,本文就谈一谈这些问题。通过本文应该能解释一下表述:

  1. 引用变量存放在栈内存中
  2. new在堆内存中开辟新空间
  3. this关键字的两个用法
  4. static修饰的含义
  5. 方法必须被调用才能用,共有三种形式的调用
  6. 值传递
  7. 形参个数可变的方法
  8. 方法的递归调用
  9. 方法允许重载
  10. 类变量,实例变量,形参,方法内参数,块参数的生命周期
  11. 四个访问修饰符
  12. Java常用包
  13. 构造器和初始化块的作用
  14. 构造器继承的语法(super)
  15. super关键字调用被覆写方法
  16. 使用继承的三点注意
  17. 子类对象赋值给父类变量实现多态的理解
  18. 引用变量的强制类型转换

1、对象、引用和指针

定义类就是定义“构造器”,“成员变量”,“方法”的过程,这三样东西都可以有0个或多个,创建对象的根本途径是通过new关键字使用构造器。Person p=new person();这句话实际上有几成含义,第一:p是一个存放在栈内存里面的引用变量,new在堆内存中新开辟的内存空间里储存了对象的成员变量。所以Java中引用变量的含义就是C语言中的指针。堆内存中的对象可以有多个栈内存引用变量同时引用,但是如果没有引用变量的时候,就变成了垃圾。


Java提供了一个this关键字,这个关键字总是指向调用该方法的对象。若是在构造器中使用就是在引用构造器正在初始化的对象的成员,而不是构造器本身的参数。但是方法引用本类中的其他方法的时候可以省略this。


但是如果方法被static修饰,这个方法就存在于栈内存中,不能使用this调用。并且static修饰的静态成员不能访问非静态成员。也就是static修饰的方法是类的方法,没有static修饰的方法是实例的方法。

2、方法详解

方法是不能独立存在的,所有的方法的调用都必须是“类.方法”或者“对象.方法”,在方法中调用方法时,其实是在用this(非静态)或者类(静态)来调用。(静态方法也可以被对象调用)。
Java方法的传递唯一方式是——值传递,也就是将实际参数值的副本传入方法内,而参数本身不受任何影响。
Java允许定义形参个数可变的方法,只需要在形参的类型名后面加上

即可。
一个方法调用方法本身,被称为递归方法,递归方法本身是一种隐式循环,但是在使用递归循环的时候,要注意,必须在某个时刻方法的返回值是确定的,否则就成了死循环。
Java允许在同一个类里定义多个同名方法,只要形参列表不同就行,这叫方法重载

3、成员变量和局部变量

有static修饰的变量被称为类变量,其生命周期与类相同,可以”类.变量名”或者”对象.变量名”来访问。没有static修饰的变量被称为实例变量,只有实例存在的时候才存在,用“对象.变量名”来访问。

其中形参在方法内有效,方法内参数从定义有效,方法结束失效,快参数,定义处有效,块结束失效。
其中类变量在加载类的时候就开辟了堆内存,对象变量只有在实例化对象时才开辟堆内存。
变量在使用的过程中应该遵循尽量缩小内存占用的原则。

4、隐藏和封装

这里写图片描述
上图中的4个访问修饰符要灵活使用。

5、Java常用包

可以参加http://blog.youkuaiyun.com/ayanami001/article/details/48103835

这里写图片描述

6、深入构造器

构造器的作用就是在创建实例的时候进行初始化,在创建对象时,所有的成员变量默认为0或者false或者null,执行构造器将进行初始化。同一个类可以有多个构造器,他们的形参列表不同。


初始化块:java允许用初始化块初始化对象,初始化块就是类中定义的只有static修饰或者没有修饰的程序块,不能被调用修改,初始化对象时一定会被执行,初始化块是对构造器的补充。

7、类的继承

通过extends关键字实现,Java继承具有单继承的特点。子类可以重写父类的方法,也可以增加新的成员变量和方法。父类中的方法被覆写后,子类对象可以用super关键字来调用。
子类不会获得父类的构造器,需要用super(父类构造器形参列表)来调用父类构造器,且必须出现在子类构造器的第一行。
在使用继承的时候应该注意:

  1. 应该尽量隐藏父类的内部数据;
  2. 不要让子类随意访问,修改父类的方法;
  3. 尽量不要在父类构造器中调用将要被子类重写的方法。

8、多态

Java引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋予该变量的对象决定。当编译时类型和运行时类型不一致的时候,就出现了所谓的多态。
所谓多态,就是定义子类对象时,用了父类变量,这样定义出来的子类对象呈现出这样一种状态:它调用的方法是子类方法,但是它只有父类开辟出来的推内存,所以只能调用从父类继承的方法或者覆写的方法,而不能调用自己定义的方法,因为他的编译时类型是父类对象,但是运行时类型是子类对象,这就是子类对象的多态。
值得注意的是,只有方法具备多态性,但是属性不具备多态性,属性在声明变量类型的时候就已经确定了。
多态性就是父类的对象可以通过不同的子类开辟内存空间,从而使其的方法呈现出多功能性。
呈现多态的对象,实际类型为特殊的子类对象。这样的把子类对象赋给父类引用变量的做法被称为向上转型

引用变量的强制类型转换

只有存在继承关系的应用变量才可以强制类型转换,否者就会抛出ClassCastException异常,因此需要用instanceof关键字判断是否可以进行强制类型转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值