1.类和对象:
对象的定义:广义地说,任何可以被 理解,被 感知 的东西都可以称之为对象。
类的定义:一般我们把一组具有类似属性和行为的对象叫做类。
笔者认为,类是一组具有相似性质的对象的集合,是将对象的本质属性抽象出来的概念,而集合是类在不同情景下的具体体现,是类的一种实例。
由于JAVA是一种纯面向对象的编程语言,如果对每一种对象都单独描述属性和行为,其工作量未免太大。特别在一些大型工程上,类的概念大大减小了工作量。
2.封装
封装是一种将对象的对外接口和内部实现区分开来的机制(顾名思义,就是把你想要的东西打包)。如果从对象的外部视角去 “观察” 某个对象,我可以只在乎它的功能作用和特性,不必考虑其内部实现的步骤(而这一点恰恰是面向过程设计程序的关键,如C语言等),该对象的内部信息被隐藏起来,仅留一个接口与外界联系。当然,与此同时也增加了访问对象的难度。
封装的实现:
(1) 需要修改属性的访问控制符(修改为private);
(2) 创建getter/setter方法(用于属性的读写);
(3)在getter/setter方法中加入属性控制语句(用于判断属性值的合法性);
3.继承
实际编程中,类和类不一定都是孤立的,类和类之间也可能存在某种内在联系。如果若干个类之间有公共的特性,则可以将共同的部分抽取出来,定义到一个公共的类中(称之为父类或者基类),其他的类则可以与之形成继承关系(称之为子类或者派生类)。并且子类一般比父类具有更多的信息和属性,功能一般也更加强大(不妨把子类看作父类的Pro.Plus.Max.+(hhhhh稍微吐个槽))。继承不但减少了代码量,能很好的提高复用率,并且是实现多态的前提。
继承的实现:
继承通过extends关键字实现
格式:class 子类 extends 父类 { }
注意:(1)JAVA是单继承,即每个子类仅有一个父类。例如:suv类可以看作机动车类的子类,但不能看作非机动车的子类。
(2)JAVA允许多重继承,即父类和子类的概念是相对的,在A—>B—>C(—>表示前者是后者的父类)中,B既是A的子类,又是C的父类。例如:SUV类是机动车类的子类,同时又是路虎类的父类。(一般不建议继承层数超过三层)
(3)子类可以直接访问父类的非私有化成员变量,访问父类的私有化成员变量可以使用super.get()方法。
(4)继承某个类时要存在从属关系,不要仅仅为了获取某个功能而贸然继承。(即使wjl再有钱也是王校长的爸爸,而不是你爸爸(手动狗头))
(5)JAVA的继承与生理学上的继承最大的区别在于时间连续性。客观上说,生理上的 “子” 在诞生之后不会因为随着 “父” 的改变而发生改变,不存在耦合关系。而JAVA程序设计中,改变了父类,子类也会随时发生改变,具有某种耦合效应。
4.多态
在介绍多态之前不得不引入重写(overriding)的概念,即对于父类中定义的一个成员方法,在子类中又重新定义一遍,虽然接口完全相同,但是实现的功能不同。
多态的定义:所谓多态,指的是一个引用变量根据它所指向的对象类型来改变其行为的能力。这允许不同子类的多个对象可被视为同一个父类的对象,却又能根据各个对象所属的子类自动选择合适的成员函数执行。
多态的三要素:
1.必须有父类和子类,具有继承或者实现继承的能力
2.子类必须重写父类的方法
3.父类的引用变量指向子类的对象
多态具有一个重要的性质:合而不同
//举个栗子吧
class Animal {
public void sound(){
System.out.println("动物的叫声");
}
}
class Cat extends Animal{
public void sound(){ //重写
System.out.println("喵喵");
}
}
class Dog extends Animal{
public void sound() { //重写
System.out.println("汪汪");
}
}
class Duck extends Animal{
public void sound(){ //重写
System.out.println("呱呱");
}
}
public class MainClass {
public static void main(String [] args){
Dog dog = new Dog();
Cat cat = new Cat();
Duck duck = new Duck();
dog.sound();
cat.sound();
duck.sound();
}
}
以上程序在编写代码时将各种子类对象按照相同类型来处理,以简化代码;而在运行时,分别绑定到各自不同的实现函数。这就是多态。
5.异常处理
在我们编写程序时,出现BUG是最正常不过的事了,程序员大多都有“一杯咖啡一根烟,一个BUG找一天”的悲惨经历。在软件开发中,产品的可靠性和安全性是至关重要的,所以我们需要对于异常进行处理。
所谓异常,指的是某个非正常的事情发生,妨碍了程序的正常运行。
在程序中可能会出现好多次异常,而每次异常都可以看成是一个对象,并且异常有不同的类型,故每次异常都可以看成某个类的一个对象。
JAVA在处理异常的方法主要包括两个环节:
1.抛出(throw)异常,即创建一个相应类型的异常对象,其中包含一些有用的信息,然后将它抛给运行时的系统。
2.捕获(catch)异常,即接收并处理该异常。
//再来举个栗子吧
public class Example01 {
public static void main(String [] args){
int [] a = {1,2,3,4};
try{
for(int i =1;i<=4;i++)
System.out.println(a[i]);
System.out.println("我能执行到吗");
}catch(IndexOutOfBoundsException e) {
System.out.println("出现了数组越界错误!");
}
}
}
上述代码运行结果截图如下:
显然这里存在数组下标越界的问题,所以产生一个异常,所以在异常之后的代码就不再执行了,所以并没有打印“我能执行到吗”。接着程序跳转到catch寻找相应的处理方法。这里正好有一个数组下标越界的错误,于是执行异常处理代码,打印"出现了数组越界错误!"