面向对象
一、面向对象
1、什么是面向对象、什么是面向过程
面向对象是基于面向过程优化而来的。
面向过程:强调的是过程,也就是完成功能的每一个步骤都需要自己来实现!
面向对象:强调的是对象,由对象帮助我们完成具体的功能!
举例:吃烤鸭
面向过程:买一只小鸭子--买一些饲料--开始养--养大了--杀死--拔毛--煮熟--烤一烤--开吃
面向对象:去全聚德买一份烤鸭--开吃
2、通过举例总结面向对象的特点:
A.更符合人们思想习惯的思想(懒人思想)
B.将复杂的事情简单化
C.将程序员由执行者变成了指挥者
二、类与对象
1、 A:什么是类:
物以类聚,类是一种抽象的泛泛的概念
比如说:动物类、水果类、汽车类~~
B:什么是对象:
对象是某一类事物的一个具体的体现
比如说:动物类中的猫就是一个动物中的具体的对象
C:属性:
属性对应成员变量
属性就是某一个事物中的具体描述信息
D:行为:
行为对应成员方法
行为就是某一个事物中可以做哪些事情
2、使用类:
A:创建对象
类名 对象名 = new 类名();
B:使用成员变量
对象名.成员变量;
C:使用成员方法
对象名.成员方法();
3、内部类
分类:成员内部类 局部内部类 匿名内部类
1、成员内部类:一个类的内部再创建一个类(Outer.Inner i = new Outer().new Inner();)
public static void main(String[] args) { Person.Hert h = new Person().new Hert(); h.jump(); } } class Person{ String name = "王外"; class Hert{ String name = "晨内"; public void jump(){ String name="张内法"; System.out.println(Person.this.name+" 心脏在跳动!");//王外 System.out.println(this.name+" 心脏在跳动");//晨内 System.out.println(name+" 心脏在跳动");//张内法 } }
2、局部内部类:一个类的方法里再创建一个类(出了这个方法这个局部内部类就消失了)
3、匿名内部类:一个没有名字的局部内部类(new 类/接口(){//重写方法};可将匿名内部类看成一个对象来处理。
public class NinameTest03 { public static void main(String[] args) {
//创建匿名内部类 new Inter(){ @Override public void print() { System.out.println("打印"); } }.print();
创建匿名内部类 Abclass a = new Abclass() { @Override public void eat() { System.out.println("eat"); } @Override public void drink() { System.out.println("drink"); } }; a.eat(); a.drink(); } } //创建接口 interface Inter{ public abstract void print(); }
//创建抽象类 abstract class Abclass{ public abstract void eat(); public abstract void drink(); }
结果:
三、构造方法
1.空参构造方法的格式:
public 方法名() {
}
2.构造方法的注意事项:
A:如果构造方法不写,那么系统会提供一个默认的空参构造方法
B:如果我们给出任意的有参构造方法,那么系统就不再提供空参构造了
3.两种方式为成员变量赋值
A:setXxx();
B:有参构造方法;
四、面向对象的三大特征:
1.封装
封装就是将不需要对外开放的成员隐藏起来。仅对外提供公共的访问方式。
封装可以提高代码的安全性和维护性
2.继承
继承就是让类与类之间产生了子父类关系。
java中继承的特点:只支持单继承,但是可以多层继承!
继承的好处和弊端:
好处就是提高了代码的复用性。如果发现问题了,直接将父类进行修改。那么所有的子类中的问题也会随之解决
弊端就是耦合性太强了。如果父类中出现了一个子类不需要的功能,那么根据继承的特点,子类也会具备该功能
继承也属于封装的一种体现形式
子类只能继承父类中的非私有成员。对于子类中成员访问的顺序。要根据就近原则来使用
如果子类中有局部变量,优先使用子类的局部变量。
如果子类中没有局部变量,但是有成员变量,那就使用子类成员变量
如果子类中既没有局部变量,也没有成员变量。那么就使用父类的成员变量。如果父类也没有,就报错了
抽取父类的原则:将子类中的共性功能进行向上抽取。然后由子类去继承父类
但是有的时候,向上抽取出的共性功能,并不能满足具体的需求,所以父类中的功能就不能有方法体。
如果没有方法体的方法,我们就要声明为抽象的,从而这个类也必须声明为抽象类。由子类继承父类,去强制重写抽象方法。重写后的就可以满足具体的需求了
但是抽象类的设计初衷,是抽取一些共性的功能,但是还有一些子类中的特性功能,这个时候我们就可以使用接口来定义这些特性的功能
接口可以打破java中单继承的弊端,因为接口可以多实现。还可以在继承一个类的同时,实现多个接口。
注:接口和抽象类的区别:
成员区别
成员变量:
接口中只有常量
抽象类中既可以有常量,也可以有变量
成员方法:
接口中只有抽象方法
抽象类中既可以有抽象方法,也可以有非抽象方法
构造方法:
接口中没有构造方法
抽象类中有构造方法
接口和抽象类都不能创建对象
关系区别:
接口和类之间是实现关系。一个类可以实现多个接口,还可以在继承一个类的同时实现多个接口
接口和接口之间是继承关系,既可以单继承、也可以多继承
抽象类也属于类,类与类之间是单继承关系。不能多继承、可以多层继承
设计思想:
抽象类完成的是一些共性的功能
接口完成的是一些特性中的共性的功能
3.多态
A:多态的前提:
继承或者实现关系
要有方法的重写
要有父类引用指向子类对象
B:多态的成员特点:
成员变量:编译看父类,运行也看父类
成员方法:编译看父类,运行看子类
静态方法:编译看父类,运行也看父类
C:多态的好处和弊端:
好处:
提高了代码的复用性(由继承来保证)
提高了代码的扩展性(由多态本身保证)
弊端:
不能使用子类特有的成员。如果想使用,需要使用instaceOf关键字进行类型匹配,从而向下转型使用子类特有功能
D:多态的使用场景:
一般用于方法的参数传递或者方法的返回值使用。
如果一个方法中参数使用的是父类类型,那么调用该方法,就可以传递任意该父类的子类类型对象
如果一个方法中返回值使用的是父类类型,那么调用该方法,方法中就可以返回任意该父类的子类类型对象
public class Duo { public static void main(String[] args) { Dad d = new Kid(); System.out.println(d.num); d.method(); d.function(); } } //创建父类 class Dad{ int num=12; public void method(){ System.out.println("我是父类的方法"); } public static void function(){ System.out.println("我的父类的静态方法"); } } //子类继承父类 class Kid extends Dad{ int num=11; public void method(){ System.out.println("我是子类的方法"); } public static void function(){ System.out.println("我是子类的静态方法"); } }
结果: