200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 面向对象的四大特征(非常重要)

面向对象的四大特征(非常重要)

时间:2019-08-11 07:18:28

相关推荐

面向对象的四大特征(非常重要)

面向对象四大特征:抽象,封装,继承,多态(非常重要)

1.抽象

定义:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面,抽象只关注对象的哪些属性和行为,并不关注这此行为的细节是什么
1.1 研究事物的静态特征(属性)
1.2 研究事物的动态特征(方法/函数)
1.3 形成结果(类,class)
1.4 类和对象相互转变(new)

举例说明:

学生有姓名,有年龄,有身份证号,这些都是静态特征,即属性

学生会吃饭,会睡觉,会学习,这些都是动态特征,即行为。

代码实现:

Student.java

public class Student {//1.1 研究事物的静态特征(属性)String name;int age;String cardNo;//1.2 研究事物的动态特征(方法/函数)/** 吃饭*/void eat(){System.out.println("吃饭.....");}/** 睡觉*/void sleep(){System.out.println("睡觉.....");}/** 学习*/void learn(){System.out.println("学习.....");}public static void main(String[] args) {//声明一个学生类型的变量,指向内存当中学生的一个实例(1.3-1.4)Student s1 = new Student(); //类到对象s1.name = "李四";s1.age = 23;s1.cardNo = "13012411";System.out.println("姓名:"+s1.name+",年龄:"+s1.age+",身份证号:"+s1.cardNo);s1.eat();s1.sleep();}}

2.封装

定义:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口.面向对象的本质就是将现实世界描绘成一系列完全自治,封闭的对象,可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。封装给对象提供了隐藏内部特性和行为的能力,对象提供一些能这被其它对象访问的方法来改变它内部的数据。

2.1.提供构造方法(有了构造方法才能通过new去构建一个对象1.构造方法必须和类名称一样2.构造方法不能有返回值)

空参构造系统默认存在,但是当你手动加入了有参构造,默认的空参构造将不再存在

//空参构造public Student(){ };//有参构造Student(String name){this.name = name;System.out.println("初始化成功...");}//有参构造Student(String name,int age,String cardNo){this.name = name;this.age = age;this.cardNo = cardNo;System.out.println("初始化成功...");***********************//有了构造,在主方法中便可以创造对象Student s1 = new Student(); 空参构造Student s2 = new Student("王五"); //有参构造Student s3 = new Student("赵六", 22, "13012412"); //有参构造}

许许多多的构造方法形成了多态(重载),这个下边会讲到。

2.2 静态块(做的类的初始化的工作,执行在new之前)

静态块用于放创建对象前要做的一系列事情,比如说一个学生,首先要被孕育,然后出生…等等

static{yunyu();born();}static void yunyu(){System.out.println("孕育");}static void born(){System.out.println("出生");}

2.3 控制访问

具体情况具体分析

3.继承(关键字:extends)

目的:对父类和方法的复用

继承是从已有类得到继承信息创建新类的过程,继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段.子类继承父类属性(静态特征)和方法(动态特征),继承必须遵循封装当中的控制访问

举个例子

动物分为哺乳动物和爬行动物,哺乳动物又包括人类,所以说,哺乳动物,爬行动物都与动物存在父子关系,而哺乳动物与人类也存在父子关系,父亲有的行为和属性,儿子理应也有

代码说明:

Animal.java

package com.oracle.object.extend;/*** 动物类* @author **/public class Animal {String name;int age;int sex;void eat(){System.out.println(name + "is eating.......................");}void sleep(){System.out.println(name + "is sleeping.......................");}}

BuRuAnimal.java

package com.oracle.object.extend;public class BuRuAnimal extends Animal{public static void main(String[] args) {BuRuAnimal zhangSan = new BuRuAnimal();zhangSan.age = 21;zhangSan.name = "张三";zhangSan.sex = 0;System.out.println(zhangSan.name + "的年龄是" + zhangSan.age + "岁,性别是:" + (zhangSan.sex == 0 ? "男" : "女"));zhangSan.eat();zhangSan.sleep();}}

PaXingAnimal.java

package com.oracle.object.extend;public class PaXingAnimal extends Animal{public static void main(String[] args) {PaXingAnimal paXingAnimal = new PaXingAnimal();paXingAnimal.age = 10;paXingAnimal.name = "鳄鱼";paXingAnimal.sex = 0;System.out.println(paXingAnimal.name + "的年龄是" + paXingAnimal.age + "岁,性别为:" + paXingAnimal.sex);paXingAnimal.eat();paXingAnimal.sleep();}}

Person.java

package com.oracle.object.extend;public class Person extends BuRuAnimal{String job;String jobAdress;void speak(){System.out.println("speak................");}public static void main(String[] args) {Person liSi = new Person();liSi.age = 21;liSi.name = "李四";liSi.sex = 0;System.out.println(liSi.name + "的年龄是" + liSi.age + "岁,性别是:" + (liSi.sex == 0 ? "男" : "女"));liSi.eat();liSi.sleep();}}

从上边的代码中可看出,子类中不要再定义属性和行为,直接继承父类,便有了父类的属性和行为,注意:访问修饰符决定了是否可继承

4.多态

多态性是指允许相同或不同子类型的对象对同一消息作出不同响应

4.1 重载:同一个动作作用在同一个对象上拥有不同的解释 overload

重载又称静态多态,编译时多态

4.2 重写:同一个动作作用在不同的对象上拥有不同的解释 override

重写又称动态多态,运行时多态

狭义的多态指重写

多态(重写)的机制:

4.2.1 声明一个父类型的引用指向具体子类型的实例

Person p = new Student();

4.2.2 运行时才能绑定

Person p = new Student();解释一下非运行时绑定:Student s = new Student();

4.2.3 运行时可变

p = new Teacher();p = new Junren();

举例说明:图形类包含矩形类,圆类,三角类(此时以等边三角形举例)

Shape.java

package com.tao.object.extend;/*** 图形类* @author 天外飞星**/public class Shape {public Shape(){}public Shape(int a){this.a = a;}public Shape(int a,int b){this.a = a;this.b = b;}protected int a;protected int b;/*** 计算周长* @return*/public double countZhouChang(){System.out.println("计算周长");return 0;}/*** 计算面积* @return*/public double countArea(){System.out.println("计算面积");return 0;}}

Triangle.java

package com.tao.object.extend;/*** 正三角形* @author **/public class Triangle extends Shape {public Triangle(){}public Triangle(int a){this.a = a;}//重写/*** 计算当前三角形的面积*/public double countArea(){return Math.pow(3, 0.5) / 4 * Math.pow(a, 2);}//重写@Overridepublic double countZhouChang() {// TODO Auto-generated method stubreturn 3*a;}//以下是重载的体现,都是求area但是,方法各不相同,即同一个动作作用在同一个对象上拥有不同的解释/*** 计算边长为b的三角形的面积*/public double countArea(int b){return Math.pow(3, 0.5) / 4 * Math.pow(b, 2);}/*** 计算底为c,并且高为h的三角形的面积*/public double countArea(int c,int h){return 0.5 * c * h;}/*** 计算边长为d,并且此边长与斜边的夹角为e的的三角形的面积*/public double countArea(int d,double e){return d / 2 * Math.sin(e) * d;}public static void main(String[] args) {Triangle triangle = new Triangle();triangle.a = 10;//triangle.countArea();//triangle.countZhouChang();/*double area = triangle.countArea();System.out.println(area);*///double area = triangle.countArea(20);//System.out.println(area);//System.out.println(triangle.countArea(10, 8));System.out.println(triangle.countArea(10, Math.PI / 3));}}

Rectangle .java

package com.tao.object.extend;public class Rectangle extends Shape{public Rectangle(){}public Rectangle(int a,int b){this.a = a;this.b = b;}}//重写@Overridepublic double countZhouChang() {return 2*(a+b);}@Overridepublic double countArea() {// TODO Auto-generated method stubreturn a*b;}}

Ring.java

package com.tao.object.extend;public class Ring extends Shape{public Ring(){}public Ring(int r){this.a = r;}@Overridepublic double countZhouChang() {// TODO Auto-generated method stubreturn 2*Math.PI*a;}@Overridepublic double countArea() {// TODO Auto-generated method stubreturn Math.PI*Math.pow(a,2);}}

test.java

package com.tao.object.extend;public class test {public static void main(String[] args) {//声明一个父类型的引用指向具体子类型的实例Shape shape=new Triangle(10);double zhouchang =shape.countZhouChang();System.out.println("三角形周长:"+zhouchang);double area=shape.countArea();System.out.println("三角形面积:"+area);//不用重新声明局部变量,体现了运行时可变shape=new Rectangle(10,20);zhouchang=shape.countZhouChang();area=shape.countArea();System.out.println("矩形周长:"+zhouchang);System.out.println("矩形面积:"+area);//不用重新声明局部变量,体现了运行时可变shape=new Ring(10);zhouchang=shape.countZhouChang();area=shape.countArea();System.out.println("圆周长:"+zhouchang);System.out.println("圆面积:"+area);}}

有惊喜哟~

关注公众号,随时学习最新内容,并与博主零距离交流!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。