java入门12

面向过程与面向对象

  • 面向过程思想

    • 步骤清晰,线性思维
    • 适合处理简单问题
  • 面向对象思想

    • 分类思维,对不同类的任务单独思考

    • 适合复杂问题,多人合作

什么是面向对象

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

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

  • 抽象

  • 三大特性

    • 封装
    • 继承
    • 多态
  • 从代码角度,先有类后有对象,类是对象的模板

类与对象的关系

  • 类是对某一类事物的定义,是抽象的数据类型,对象是抽象概念的具体实例

创建与初始化对象

  • 使用new关键字创建对象
  • 使用new时,除了分配内存空间,还会为创建的对象进行默认初始化以及对类中构造器的调用
  • 类中的构造器也叫构造方法,是创建对象时必须调用的,构造器特点:
    • 必须和类名相同
    • 必须没有返回类型,也不能写void

比如创建一个学生类:

package oop;//学生类
public class Student {//属性String name;int age;//方法public void study(){System.out.println(this.name+"在学习");}
}

实例化对象:

package oop;public class Demo01 {public static void main(String[] args) {//实例化//类实例化后会返回一个自己的对象//student对象就是一个Student类的具体实例Student srrdhy1 = new Student();Student srrdhy2 = new Student();srrdhy1.name = "艾伦耶格尔";srrdhy1.age = 19;System.out.println(srrdhy1.name);System.out.println(srrdhy1.age);srrdhy1.study();//艾伦耶格尔//19//艾伦耶格尔在学习}
}

有参构造与无参构造

类:

package oop;public class Hero {//一个类即使什么也不写,也有一个方法//显示的定义构造器String name;//实例化初始值//使用new关键字,本质在调用构造器//用来初始化值public Hero(){this.name = "奥克斯";}//有参构造:一旦定义了有参构造,无参必须显示定义public Hero(String name){this.name = name;}
}

主函数执行:

package oop;public class Demo01 {public static void main(String[] args) {//实例化一个对象Hero hero1 = new Hero();Hero hero2 = new Hero("黑魔");System.out.println(hero1.name);System.out.println(hero2.name);//奥克斯//黑魔}
}
//alt + insert用于生成构造器
public Hero(String name) {this.name = name;}public Hero() {}

选择Constructor,直接OK生成有参构造,选择Select None生成无参构造。

封装

  • 程序设计追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量方法给外部使用

  • 封装(数据的隐藏)

    • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
  • 属性私有,get/set

创建一个类:

package oop.demo02;//学生类  private:私有  不能直接在main方法调用了
//这时我们使用public的get和set方法来操作
public class Student {//名字private String name;//学号private int id;//性别private char sex;//get获得这个数据public String getName(){return this.name;}//set给这个数据设置值public void setName(String name){this.name = name;}

主函数:

public class Main {public static void main(String[] args) {Student s1 = new Student();s1.setName("srrdhy");String name1 = s1.getName();System.out.println(name1);//srrdhy}
}

快捷操作:

    //alt + insert选择Getter and Setter//自动生成public 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) {this.age = age;}

设置一个999岁,但999年龄是不合理的:

s1.setAge(999);
System.out.println(s1.getAge());//非法年龄

规避操作:

    public void setAge(int age) {if (age<120 && age>0){this.age = age;}else {System.out.println("输入非法");}}

封装好处:

  • 提高程序安全性,保护数据
  • 隐藏代码实现细节
  • 统一接口get、set
  • 系统可维护性提高

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
  • extends意为扩展,子类是父类的扩展
  • java类只有单继承(一个子类不能有多个父类)
  • 除了继承,类与类间的关系还有依赖、组合、聚合
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
  • 子类与父类间从意义上具有"is a"的关系
  • object类
  • super
  • 方法重写

我们建立一个父类并赋予一个方法:

//人类 父类
public class Person {public void speak(){System.out.println("说了些什么");}
}

建立一个子类继承父类,什么方法也没有写:

//学生 子类
public class Student extends Person{}

这时在主程序中new一个Student对象,使用speak():

public class Main {public static void main(String[] args) {Student student1 = new Student();student1.speak();}
}

可以输出,这表示子类可以调用父类的方法

再比如我们在父类中增加

public int money = 10_0000_0000;

调用:

System.out.println(student1.money);

也可以输出,子类会继承父类的一切

但如果我们把父类的money改为私有的:

private int money = 10_0000_0000;

子类就调用不了了

对于调用权限,由高到低为:

public
protected
default
private

使用快捷键ctrl+H会生成树结构(要把鼠标点在需要的类里)

可以发现,父类上还有一个类,因为在java中,所有的类默认继承Object类

现在我们在父类建立一个名字,采用protected。

public class Person {protected String name = "srrdhy";
}

子类中用private建立一个不同的名字,再写一个输出名字的方法,分别输出三种名字:

public class Student extends Person{private String name = "琪亚娜";public void printname(String name){System.out.println(name);System.out.println(this.name);System.out.println(super.name);}
}

主程序运行:

public class Main {public static void main(String[] args) {Student student1 = new Student();student1.printname("雷电芽衣");}//雷电芽衣//琪亚娜//srrdhy
}

如果我们在父类中写一个print方法:

public void print(){System.out.println("Person");}

又在子类中写一个同名方法:

public void print(){System.out.println("Student");}

那么主程序调用print方法时,会调用子类的print

注意,private无法继承,super也不行

现在我们在子类父类各写一个无参构造:

public Student() {System.out.println("Student无参执行");}
public Person() {System.out.println("Person无参执行");}

主程序中单纯new一个student,什么也不做,会输出:

Person无参执行
Student无参执行

先输出了Person无参执行,说明public Student()里隐藏调用了父类的无参构造,隐藏了一个super()

调用父类的构造器,必须要在子类的第一行

父类没有无参时,子类也不能写无参,只能调用有参。一般我们会把无参写上再接着写有参。

方法重写

  1. 重写都是方法的重写,与属性无关

  2. 子类重写父类的同名方法,参数列表相同

  3. 修饰符:范围可以扩大不能缩小:public>protected>default>private,当然private不能重写

  4. 抛出异常:范围可以缩小不能扩大:ClassNotFoundException–>Exception(大)

子类方法与父类一致,方法体不同

为什么要重写:

  • 父类功能子类不一定需要,或不一定满足

我们建一个子类A,父类B,并写同名方法:

public class A extends B{public static void text(){System.out.println("A");}
}
public class B {public static void text(){System.out.println("B");}
}

调用方法:

public class Main {public static void main(String[] args) {//方法的调用只和左边,定义的数据类型有关A a = new A();a.text();//A//父类的引用指向了子类B b = new A();b.text();//B}
}

删去A、B的static,发现左边都多了一个东西:

其实就代表重载

删掉A中方法,alt+insert选择方法重载,直接回车生成方法:

@Override//注解,有功能的注释public void text() {super.text();}

继续执行主程序,输出BB,把super.text();改回System.out.println(“A”);,继续执行主程序,输出却变成了AA

所以我们可以补全刚刚的结论:

  • 静态方法(有static):方法的调用只和左边,定义的数据类型有关
  • 非静态方法:重写(比如B b = new A();b.text();)

注意重写的方法只能是public,换成private就不行了

java入门12--面向对象(上)相关推荐

  1. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  2. 一文回顾 Java 入门知识(上)

    Java前世今生 Java最早是由SUN公司(已被Oracle收购)的詹姆斯·高斯林(高司令,人称Java之父)在上个世纪90年代初开发的一种编程语言,最初被命名为Oak,目标是针对小型家电设备的嵌入 ...

  3. 【干货】java核心知识整理,阶段一:java基础之面向对象上

    面向对象概述 面向对象是一种符合人类思维习惯的编程思想.现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系.在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种 ...

  4. [Java入门笔记] 面向对象三大特征之:封装

    了解封装 什么是封装? 在Java的面向对象程序设计中,有三大基本特征:封装.继承和多态.首先我们先来看看封装: 在Java的面对对象程序设计中,封装(Encapsulation)是指一种将函数功能实 ...

  5. Java阿凯_Java-7 面向对象(上)

    2.面向对象 面向对象(Object-Oriented) ooa:面向对象的分析 ood:面向对象的设计 oop:面向对象的编程 面向对象三大特性 封装,继承,多态 2.1类和对象关系 类:一种数据类 ...

  6. Java 入门基础——面向对象的特征

    计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程.面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用 ...

  7. Java入门学习笔记——郝斌(一)概述及面向对象

    Java入门学习笔记--郝斌 1.Java概述 java的起源和发展 java的特点 java的应用领域 java学习目标 环境变量的设置 为什么要设置path? path的设置 有关classpat ...

  8. 小白零基础学习Java开发入门教程奉上,希望对你有所帮助!

    "持久和新"是编程语言方面对Java的适当评估. 想要进入互联网行业,想转向编程,Java无疑是一个非常普遍的选择. 但是,Java毕竟是一种编程语言,并且仍然存在一些技术障碍.如 ...

  9. java单引号转义_Java基础入门——Java语言基础(上)

    本篇我们开始进入Java的学习,首先在学习如何编写Java语言前要先了解Java程序的基本结构. 一.Java程序的基本结构 一个Java程序的基本结构大体可以分为包.类.main()主方法.标识符. ...

  10. OpenCV Java入门二 在Windows10系统上安装OpenCV

    准备好痛苦了没有? 痛苦之后是欢乐.因为必竟大多人还是用的WINDOWS来开发的居多.因此如果OpenCV无法在Win10下安装,一样不能起到普及作用. 而Windows下的编译安装OpenCV也是最 ...

最新文章

  1. parallels for linux,在 Parallels Desktop 上安装 Remix OS PC
  2. Unity 之 如何删除Unity项目里面没用的东西??
  3. Hadoop系列之五:MapReduce进阶(2)
  4. 分布式链接跟踪服务_微服务世界中的分布式跟踪
  5. Anylogic 仿真建模(一)
  6. rpm方式在centos7中安装mysql
  7. 计算机网络(HCIP、HCIE)系列文章大合集
  8. C#----接口的显式实现
  9. matlab高斯窗函数,Matlab中窗函数的简单使用
  10. linux 内核 addr2line,介绍addr2line调试命令
  11. ADX趋势线突破交易系统
  12. 海马玩模拟器——搭建React Native环境
  13. 找出直系亲属-cpp
  14. 【微信小程序】Java岗面试12家大厂成功跳槽
  15. 离散数学 08.02 格的定义
  16. 什么是共模干扰差模干扰共模信号差模信号
  17. VSCODE配置OPENCV编译环境(windows)
  18. fatal: http://gitlab.xxxx.com/xxx/songjy-coocaa.git/info/refs not valid: is this a git repository
  19. 高一计算机专业学期总结,高一计算机学期工作总结
  20. 海底捞,我们该学什么?--《海底捞你学不会》读后感

热门文章

  1. taskmgr.exe解决方法
  2. php 把数字大写,php 阿拉伯数字转中文大写金额
  3. laravel maatwebsite/excel3.1 导入导出详解
  4. 苏州承泽医疗科技面经
  5. [技巧]WIN10笔记本生成电池损耗报表,与笔记本电池损耗恢复方法
  6. 网站服务器iis7.5配置,IIS 7.5 配置伪静态
  7. IDLE和java超级基础基本标准
  8. 双非本科生进大厂,而我还在底层默默地爬树(上)
  9. 生活随记 - 尝试与师傅沟通争取自己的权益
  10. 网站打开速度的查询 测试