java面向对象白话解说
面向对象的程序设计:
1.什么事面向过程的程序设计,面向过程的程序设计注重程序执行的流程和顺序,典型的是C语言。
2.面向对象的程序设计,设计者变成了调用者,找到了对象就找到了对象的功能,用来解决一些复杂分业务和大型的应用,典型的面型对象程序语言,典型的像java、C++、C#
对象是一个具体的实体,类是一个抽象的概念,类是多个具有相同属性和形为的对象抽取出来的。定义类的过程是一个抽象的过程。
变量的作用域:
1.变量定义的位置决定了该变量的可见度,在类中定义的变量通常叫做成员变量
成员变量和局部变量:
1. 变量定义的位置决定了该变量的可见度,在类中定义的变量,通常是成
员变量,这些变量可以被类中所有的方法访问,甚至可以被其它类的方法访
问。在方法内定义的变量,是局部变量,它的可见度是局部于定义它的方法的,
所以只能在定义它的方法内访问。
2. 成员变量在堆中分配置存储空间,而局部变量在方法调用的栈区中分配
置存储空间,成员变量会自动被初始化为和数据类型相关的一个初值,而局
部变量不会进行自动进行初始化,所以必须要先定义,再赋值,再使用。
3. 成员变量和局部变量的生命周期不一样,成员变量在对象回收时才会释
放存储空间,而局部变量在方法调用结束就释放存储空间。
构造方法:
与类同名且没有任何的返回值,就连void也没有。构造方法是在实例化类的对象时通过new关键字调用的。当类中没有显式的定义任何构造方法时,jvm会为这个类创建一个默认的无参数的无法。如果自定义了构造方法,则jvm不再分配置默无参数构造方法。 构造方法中一般会写创建对象时就要执行的内容。 构造方法也可以被重载。 一般,如果自定义了带参的构造方法,最好再定义一个无参构造。
this关键字的使用:
在一个类中所有成员变量和成员方法,访问时需要通过对象来访问,这个对象的表示方法就是this,指代类的一个虚拟对象。
this();表示构造方法的调用,只能在构造方法中调用,只能在第一行
构造代码块:
在构造方法之前执行的代码块,放在所有方法之外
{
方法或语句
}
局部代码块是在方法内定义的,只能在方法内使用
局部代码块可以加速内存空间的回收,可以提高内存空间的利用率
匿名对象:
面向对象的三大特征:
1.封装 2.继承 3.多态
封装 :
广义角度的封装:类的定义的过程,就是一个封装的过程
狭义上的封装: 是指属性私有化,并对这些私有化的属性对外提供公有地访问方法
private 私有的
封装的好处,可以让用用户按照设计者设计方式来访问数据,能够隐藏事物的实现细节,降低使用的难度,保证数据的完整和有效
封装代码实现,私有化成员变量,提供共有的setter方法,供用户写入数据,提供的getter方法,供用户读取数据
继承
子类不断向上抽取的结果,继承可以减少重复的代码,实现代码的重用。继承要符合is---a原则
继承的单根性和传递性 单根性:
在设计阶段,先通过子类去得到父类,在编码阶段先定义父类在派生子类,父类也成为基类,子类也叫派生类。一个父类可以派生多个子类,但是在java中一个子类只能有直接的一个父类,java不支持多继承。
传递性:
java中类可以派生子类,子类又可以派生子类,类的继承是可以传递的
多继承:
一个类可以有多个直接的父类,C++支持多继承。
java中的访问修饰符:
1. private 在类中被private修饰的成员只能在本类中可见。
2. public修饰的成员,本类可见,子类可见,同包类可见,不同包类可见。
3. 默认的访问修饰 本类及同包类可见,不同包类不可见。
4. protected 修饰的成功本类及子类可见,不同包中的非子类不可见。
方法的重写:在继承关系中,如果子类具有和父类相同签名的方法,方法的返回值类型和方法名都相同,,子类方法对父类方法进行了重写,重写的关键字是@override
重写的原则:
1. 方法的签名必须相同
2. 如果父类返回值类型是基本数据类型/void,则子类返回值类型必须和父类返回值类型完全一致。
3. 子类方法的访问修饰符要大于等于父类方法的访问修饰符级别
4. 父类方法的返回值类型如果是引用类型,子类方法的返回值类型可以是引用类型的子类或引用类型本身。
super关键字 指父类的对象的引用,是父类的一个虚拟对象。
super()调用父类的无参构造方=,在一个类中,所有的构造方法中的第一行都会默认调用类的无参构造方法,这时如果父类没有提供默认的无参构造,当前类的定义就会出现错误,解决办法有两种:
1.在父类中定义一个无参构造方法
2.在藻类的构造方法中显式的调用父类的带参构造方法
在继承关系下,当创建子类对象的时候,想创建父类对象,在创建子类对象
多态
什么是多态?事物在不同场合表现出不同的形态,称为多态。
实现多态的方法:
1.方法的重载
public class Actor{
public void play(剧本);
public void play(唱歌);
public void play(弹琴);
}
方法重载实现多态不利于维护,面向对象开发原则开闭原则,对增加代码是开放的,对修改代码是封闭的
2.方法的重写
public class Pet {
public void eat() {
System.out.println("宠物吃饭......");
}
}
public class Cat extends Pet{
@Override
public void eat() {
System.out.println("小猫吃鱼......");
}
}
public class Dog extends Pet{
@Override
public void eat() {
System.out.println("小狗吃肉......");
}
}
public class Master {
public void feed(Pet pet) {
pet.eat();
}
}
public static void main(String[] args) {
Cat cat=new Cat();
Dog dog=new Dog();
Rabbit rabbit=new Rabbit();
Master master=new Master();
master.feed(rabbit);
}