Java面向对象编程(OOP)

面向过程和面向对象

  • 面向过程

    • 步骤清晰简单,第一步做什么,第二部做什么…
    • 面向过程适合处理一些较为简单的问题
  • 面向对象
    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
  • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

面向对象编程(Object-Oriented Programming,OOP)

面向对象的本质:以类的方式组织代码,以对象的方式组织(封装)数据

核心知识点:抽象、三大特性(封装、继承、多态)

  • 从认知论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。

  • 从代码运行的角度考虑是先有类后有对象。类是对象的模板。

类和对象的创建

类和对象的关系

类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。

  • 动物、植物、手机、电脑…
  • Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为。

对象是抽象概念的具体实例。

  • 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例。
  • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。

创建与初始化对象

  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
//学生类
public class Student {//属性:字段String  name;//默认nullint age;//默认 0//方法public void study(){System.out.println(this.name+"想学习");}
}
public class Application {public static void main(String[] args) {//类:抽象的,需要实例化//类的实例化后会返回一个自己的对象//student对象就是一个Student类的具体实例Student stu1 = new Student();Student stu2 = new Student();stu1.name = "xiaoming";stu1.age = 9;System.out.println(stu1.name);//xiaomingSystem.out.println(stu1.age);//9System.out.println(stu2.name);//nullSystem.out.println(stu2.age);//0}
}

构造器详解

  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点:

    • 1.必须和类的名字相同。
    • 2.必须没有返回类型,也不能写void。
public class Person {//一个类即使什么都不写,会自动生成构造方法//也可显示的定义构造器String name;int age;//实例化初始值//使用new关键字,本质是在调用构造器//用来初始化值public Person(){//this.name = "longbao";}//有参构造:一旦定义有参构造,无参构造就必须显示定义public Person(String name) {this.name = name;}//alt+insert快捷键public Person(String name, int age) {this.name = name;this.age = age;}/*构造器:1、和类名相同2、没有返回值作用:1、new本质是调用构造方法2、初始化对象值注意:1、定义有参构造之后,如果想使用无参构造,需要显示定义一个无参构造*/
}//一个项目应该只存在一个main方法
public class Application {public static void main(String[] args) {//new  实例化Person person = new Person("longshen");System.out.println(person.name);}
}

创建对象内存分析

https://www.bilibili.com/video/BV12J41137hu?p=65

文笔有限,建议观看视频

封装、继承、多态

封装(数据的隐藏)

通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。

属性私有,get/set

//类
public class Student {private String name;private int id;private char sex;private int age;//提供一些可以操作这个属性的方法//public的get/set//get 获得这个数据public String getName(){return this.name;}//set 给这个数据设置值public void setName(String name){this.name = name;}//alt+insertpublic int getId() {return id;}public void setId(int id) {this.id = id;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {if(age>150||age<0){//不合法this.age = 3;}else{this.age = age;}}
}————————————————————————————————————————————————
public class Application {public static void main(String[] args) {Student s1 = new Student();s1.setName("刘傲");System.out.println(s1.getName());s1.setAge(222);//不合法System.out.println(s1.getAge());}/*封装的意义1.提高程序的安全性,保护数据2.隐藏代码的实现细节3.统一接口4.系统的可维护性增加了......*/
}

继承

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

extends的意思是“扩展”。子类是父类的扩展。

JAVA中类只有单继承,没有多继承!

继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。

继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。

子类和父类之间,从意义上讲应该具有"is a"的关系.

//在java中,所有的类,都默认直接或者间接继承Object
//父类
public class Person {//public//protected//default默认//privateprivate int money = 1000000;protected String name = "liuao";public Person() {System.out.println("Person无参执行");}public void say(){System.out.println("shuohua");}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}public void print(){System.out.println("Person");}}————————————————————————————————————————————//子类继承父类,就会拥有父类的全部方法public
//子类
public class Student extends Person {private String name = "wanhan";public Student() {//隐藏代码:调用了父类的无参构造super();//调用父类的构造器,必须要在子类构造器的第一行System.out.println("Student无参执行");}public void test(String name){System.out.println(name);//pengfanSystem.out.println(this.name);//wanhanSystem.out.println(super.name);//liuao}public void print(){System.out.println("Student");}public void test2(){print();//Studentthis.print();//Studentsuper.print();//Person}
}
————————————————————————————————————————————
//子类
public class Teacher extends Person {}————————————————————————————————————————————
public class Application {public static void main(String[] args) {Student student = new Student();student.say();System.out.println(student.getMoney());Person person = new Person();person.say();student.test("pengfan");//运行观看结果student.test2();}
}
//子类在继承父类后,创建的对象可以直接调用父类中的public方法

object类:在java中,所有的类,都默认直接或者间接继承Object

super和this:

super注意点:1. super调用父类的构造方法,必须在构造方法的第一个2. super必须只能出现在子类的方法或者构造方法中!3. super和 this不能同时调用构造方法!对比 this:代表的对象不同:this:本身调用的这个对象super:代表父类对象的引用前提this:没有继承也可以使用super:只能在继承条件下才可以使用构造方法this(); 本类的构造super(); 父类的构造!|

方法重写:

重写: 需要有继承关系,子类重写父类的方法!1. 方法名必须相同2.参数列表列表必须相同3.修饰符:范围可以扩大但不能缩小: public>protected>default>private4.抛出的异常:范围,可以被缩小,但不能扩大重写时,子类的方法和父类必要一致:方法体不同!为什么需要重写:1-父类的功能,子类不一定需要.或者不一定满足!//重写都是方法的重写,与属性无关
public class B {public void test(){System.out.println("B=>test()");}
}
————————————————————————//重写都是方法的重写,与属性无关
public class A extends B {@Override//注解public void test() {//super.test();System.out.println("A=>test()");}/*public void test(){System.out.println("A=>test()");}*/
}
——————————————————————————————————public class App {public static void main(String[] args) {A a = new A();a.test();//父类的引用指向了子类B b = new A();//子类重写了父类的方法b.test();}}

多态

  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。

  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。

  • 多态存在的条件:

    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类对象
  • 注意:多态是方法的多态,属性没有多态性。

  • instance of 类型转换(引用类型)

//Person类
public class Person {public void run(){System.out.println("run");}}/*
多态的注意事项:
1、 多态是方法的多态,属性没有多态
2、 父类和子类,有联系 类型转换异常!
3、 存在条件:继承关系,方法需要重写,父类引用指向子类对象不能重写:
1.static方法,属于类,不属于实例
2.final 常量
2.private方法*///Student类
public class Student extends Person {@Overridepublic void run() {System.out.println("sonrun");}public void eat(){System.out.println("eat");}public void go(){System.out.println("go");}
}//Teacher类
public class Teacher extends Person {}//测试
public class Application {public static void main(String[] args) {/*//一个对象的实际类型是确定的//但可以指向的引用类型就不确定了:父类的引用指向子类//子类能调用的方法都是自己的或者继承父类的方法Student s1 = new Student();//父类可以指向子类,但是不能调用子类中独有的方法Person s2 = new Student();s2.run();//子类重写了父类的方法,执行子类的方法s1.run();//对象能执行哪些方法,主要看对象的左边的类型,和右边关系不大s1.eat();//s2.eat();错误//查看类之间的关系Object object = new Student();System.out.println(object instanceof Student);//trueSystem.out.println(object instanceof Person);//trueSystem.out.println(object instanceof Object);//trueSystem.out.println(object instanceof Teacher);//falseSystem.out.println(object instanceof String);//false//System.out.println();Person person = new Student();System.out.println(person instanceof Student);//trueSystem.out.println(person instanceof Person);//trueSystem.out.println(person instanceof Object);//trueSystem.out.println(person instanceof Teacher);//false//System.out.println(person instanceof String);//编译报错System.out.println();Student student = new Student();System.out.println(student instanceof Student);//trueSystem.out.println(student instanceof Person);//trueSystem.out.println(student instanceof Object);//true//System.out.println(student instanceof Teacher);//编译报错//System.out.println(student instanceof String);//编译报错*///类型之间的转换//父类转子类Person stud1 = new Student();//stud.go();//错误//将stud这个对象转换为Student类型,我们就可以使用Student类型的方法了((Student)stud1).go();//子类转换为父类,可能丢失自己本来的一些方法Student stud2 = new Student();stud2.go();Person per1 = stud2;//per1.go();//无法调用}
}/*
1.父类引用指向子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型:强制转换
4.方便方法的调用,减少代码的重复,简洁*/

static

public class Student {private static int age = 1;//静态的变量private double score = 60;//非静态的变量public void run(){//非静态方法}public static void go(){//静态方法}public static void main(String[] args) {Student s1 = new Student();System.out.println(Student.age);//System.out.println(Student.score);报错System.out.println(s1.score);System.out.println(s1.age);go();Student.go();s1.go();s1.run();//Student.run();//报错}
}
//类被final后无法被继承
public final class Person {{//匿名代码块//程序执行时不能主动调用//创建对象时自动创建,在构造器之前//一般用来赋初始值System.out.println("匿名代码块");}static {//静态代码块,类加载时执行,永久只加载一次System.out.println("静态代码块");}public Person() {System.out.println("构造方法");}public static void main(String[] args) {Person p = new Person();Person p2 = new Person();}
}
//静态带入包
import static java.lang.Math.PI;
import static java.lang.Math.random;public class Test {public static void main(String[] args) {System.out.println(random());System.out.println(PI);}
}

抽象类

  • abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
  • 抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。
  • 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
  • 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
//抽象类
public abstract class Action {//abstract,抽象方法,只有方法名,没有方法的实现!public abstract void doSomething();/*不能new出抽象类,只能靠子类实现抽象类中可以写普通的方法抽象方法必须在抽象类中*/public void go(){}//提高开发效率
}//继承抽象类的子类必须实现抽象类的所有方法,除非子类也是抽象类
public class A extends Action {public A() {System.out.println("A的构造器");}@Overridepublic void doSomething() {}}

接口

  • 普通类:只有具体实现
  • 抽象类:具体实现和规范(抽象方法)都有!
  • 接口:只有规范!
  • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人。
  • 接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
  • OO的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
  • 声明类的关键字是class,声明接口的关键字是interface
//接口
public interface UserService {//常量-pubic static finalint age = 99;//接口中所有的定义方法其实都是抽象的 public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);}//接口
public interface TimeService {void time(String time);
}//实现
public class UserServiceImp implements UserService,TimeService {//利用接口实现多“继承”@Overridepublic void add(String name) {//代码}@Overridepublic void delete(String name) {//代码}@Overridepublic void update(String name) {//代码}@Overridepublic void query(String name) {//代码}@Overridepublic void time(String time) {//代码}
}
接口:1.是代码的约束2.定义一些方法,让不同的人使用3.接口中的方法-public abstract4.接口中的常量-public static final5.接口不能被实例化,其中没有构造方法6.implements 可以实现多个接口7.必须要重写接口中的方法

内部类

内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。

1.成员内部类

2.静态内部类

3.局部内部类

4.匿名内部类

//类
public class Outer {private int id=99;public void out(){System.out.println("外部类方法");}//成员内部类public class Inner{public  void in(){System.out.println("内部类方法");}//可以获得外部类的私有属性public void getId(){System.out.println(id);}}//静态内部类public static class Inner1{public  void in(){System.out.println("静态内部类方法");}}//局部内部类public void method(){class Inner2{public void in2(){System.out.println("局部内部类的方法");}}}}//一个java类中可以有多个class类,但是只能有一个public cLass
class A{public static void main(String[] args) {}
}//测试
public class Testapp {public static void main(String[] args) {Outer outer = new Outer();//通过外部类来实例化内部类Outer.Inner inner = outer.new Inner();inner.in();inner.getId();//没有名字的初始化类,不用将实例保存到变量中//匿名对象的使用new Apple().eat();new UserService(){@Overridepublic void hello() {System.out.println("hello");}};}
}class Apple{public void eat(){System.out.println("eat");}}interface UserService{void hello();
}

https://www.bilibili.com/video/BV12J41137hu?p=60

Java面向对象编程(OOP)相关推荐

  1. python oop编程_23 Python - 面向对象编程OOP

    面向对象编程OOP 01 方法__repr__()和__str__() __repr__()方法类似java中的toString方法,用于反馈类的相关信息且可以自己定义,一般用于开发人员控制台调试 _ ...

  2. 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)

    文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...

  3. java面向对象编程基础

    java面向对象编程基础 前言:什么是java 是咖啡飘香的清晨 - 是斯坦福校园意浓情深 - 是James的思想睿智 是剁手党双十一挥舞的利刃 是大数据云计算驰骋的平台 - 是ATM上吐出的钞票 - ...

  4. python oop求三角形面积公式_Python面向对象编程-OOP

    Python面向对象编程-OOP 20141216 Chenxin整理 OOP的3大特性: 封装,继承,多态 一.封装 OOP目的,OOP为了代码重用 :分解代码 ,最小化代码的冗余以及对现在的代码进 ...

  5. 5.Java面向对象编程

    文章目录 05 Java面向对象编程 1. 面向过程与面向对象比较 2. 类和对象 2.1 对象的属性和方法 2.2 类的属性和方法 2.3 定义一个类 2.4 创建和使用对象 2.5 对象和类的总结 ...

  6. opp原则_面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

  7. 【廖雪峰Python学习笔记】面向对象编程OOP

    面向对象编程 OOP:Object Oriented Programming 程序的基本单元:对象 [ = 数据 + 操作数据的函数] [属性 + 方法] 三大特点:数据封装.继承和多态 OPP中的计 ...

  8. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

  9. 面向对象编程OOP的三大特性

    面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类 ...

  10. Java面向对象编程篇6——注解与反射

    Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...

最新文章

  1. Glide源码解析-加载流程
  2. 驭下术:如何让下属老实听话?用这3招,让你不怒自威
  3. JVM的监控工具之jstack
  4. PaperWeekly 第28期 | 图像语义分割之特征整合和结构预测
  5. php中的控制器是什么意思,理解PHP中的MVC编程之控制器_php
  6. ASP.NET MVC5使用AjaxHelp
  7. Qt-按钮无文本显示
  8. 计算机视觉目标检测算法总结5——RCNN系列算法
  9. Leetcode每日一题:52.N-Queens II(N皇后Ⅱ)
  10. 虚函数和虚析构函数的实现原理--虚函数表
  11. atitit.自适应设计悬浮图片的大小and 位置
  12. DXGI 方式采集流程
  13. java ipv6工具,支持通过IPv6地址和子网大小 计算开始结束地址
  14. 磁珠 符号_磁珠。标有FB的应该是磁珠!
  15. ip okhttp 设置_okhttp3及httpclient中的代理设置
  16. 《唯有时间能证明伟大:极客之王特斯拉传》读后感
  17. java + selenium 实现QQ快速安全登录xx网站
  18. windows防火墙规则_如何在Windows防火墙中创建高级防火墙规则
  19. Matlab含新能源(风电光伏)和多类型电动汽车配电网风险评估
  20. 微信引流最有效的方法

热门文章

  1. 望海潮·无处闻三年六月歌
  2. WiFi模块种类二:单WiFi功能双频WiFi模块
  3. 数竞党必看!数学竞赛权威赛事大合集,先马后看
  4. 计算机专业有必要数学竞赛吗,高中数学竞赛必要吗
  5. sqlserver2000安装时提示挂起并重启
  6. GEE学习笔记 七十七:GEE学习方法简介
  7. 网站打开速度慢是什么原因导致
  8. 放慢脚步是为了走得更快
  9. 交会定点(前方交会、测边交会、后方交会)程序C++代码
  10. redux 的入门级别使用 讲解