第一篇博客《理解面向对象》里已经说了:
Java的设计就是类的设计,通过public,pretected,private三个关键字实现了封装,通过extends实现了继承,子类对象可以直接赋值给父类变量,也就是实现了多态。
但是具体的类的一下规则,还有很多细节需要掌握,本文就谈一谈这些问题。通过本文应该能解释一下表述:
- 引用变量存放在栈内存中
- new在堆内存中开辟新空间
- this关键字的两个用法
- static修饰的含义
- 方法必须被调用才能用,共有三种形式的调用
- 值传递
- 形参个数可变的方法
- 方法的递归调用
- 方法允许重载
- 类变量,实例变量,形参,方法内参数,块参数的生命周期
- 四个访问修饰符
- Java常用包
- 构造器和初始化块的作用
- 构造器继承的语法(super)
- super关键字调用被覆写方法
- 使用继承的三点注意
- 子类对象赋值给父类变量实现多态的理解
- 引用变量的强制类型转换
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(父类构造器形参列表)来调用父类构造器,且必须出现在子类构造器的第一行。
在使用继承的时候应该注意:
- 应该尽量隐藏父类的内部数据;
- 不要让子类随意访问,修改父类的方法;
- 尽量不要在父类构造器中调用将要被子类重写的方法。
8、多态
Java引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋予该变量的对象决定。当编译时类型和运行时类型不一致的时候,就出现了所谓的多态。
所谓多态,就是定义子类对象时,用了父类变量,这样定义出来的子类对象呈现出这样一种状态:它调用的方法是子类方法,但是它只有父类开辟出来的推内存,所以只能调用从父类继承的方法或者覆写的方法,而不能调用自己定义的方法,因为他的编译时类型是父类对象,但是运行时类型是子类对象,这就是子类对象的多态。
值得注意的是,只有方法具备多态性,但是属性不具备多态性,属性在声明变量类型的时候就已经确定了。
多态性就是父类的对象可以通过不同的子类开辟内存空间,从而使其的方法呈现出多功能性。
呈现多态的对象,实际类型为特殊的子类对象。这样的把子类对象赋给父类引用变量的做法被称为向上转型
引用变量的强制类型转换
只有存在继承关系的应用变量才可以强制类型转换,否者就会抛出ClassCastException异常,因此需要用instanceof关键字判断是否可以进行强制类型转换。