面向对象

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

1.类与对象的关系

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

    • Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体事物应该具备的特点和行为
  • 对象是抽象概念的具体实例
    • 张三就是一个人的具体实例,张三家里的来福就是狗的一个具体实例。
    • 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。

2.创建与初始化对象

  • 使用new关键字创建对象
  • 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用

类的创建:

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

对象的创建:

package com.oop.demo02;//一个项目应该只存在一个main方法
public class Application {public static void main(String[] args) {//类:抽象的,需要实例化//类实例化后会返回一个自己的对象//student对象就是一个Student类的具体实例Student student = new Student();Student xiaohong = new Student();Student abin = new Student();abin.name="阿宾";abin.age=16;System.out.println(abin.name);System.out.println(abin.age);}
}
  • 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:

    • 必须和类的名字相同
    • 必须没有返回类型,也不能写void

示例:类及构造器

package com.oop.demo02;//Java------>class      Ctrl+Alt+Shift+s打开项目结构 即可添加out文件夹下的class文件
public class Person {//一个类即使什么都不写,它也会存在一个方法(构造方法)//显示的定义构造器String name;int age;//实例化初始值//1.使用new关键字,本质是在调用构造器//2.用来初始化值public Person() {//无参构造器//this.name="卡兹克";}//有参构造:一旦定义了有参构造,无参就必须显示定义,否则就无效//会根据给予的参数匹配(方法重载)public Person(String name, int age) {this.name = name;this.age = age;}//alt+insert会快捷生成构造器
}
/*
public static void main(String[] args) {//new 实例化了一个对象Person person = new Person("卡兹克",4);System.out.println(person.name);//卡兹克}构造器:1.必须和类的名字相同2.必须没有返回类型,也不能写void作用:1.new本质是在调用构造方法2.初始化对象的值注意点:1.定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造//Alt+Insert*/

示例:对象

package com.oop.demo02;//一个项目应该只存在一个main方法
public class Application {public static void main(String[] args) {//new 实例化了一个对象Person person = new Person("卡兹克");System.out.println(person.name);//卡兹克}
}

输出图

小结类与对象

  1. 类与对象

    • 类是一个模板:抽象 的,对象是一个具体实例
  2. 方法
    • 定义、调用
  3. 对象的引用
    • 引用类型:基本类型(8)
    • 对象是通过引用来操作的:栈---->堆
  4. 属性:字段Filed 成员变量
    • 默认初始化:

      • 数字:0 0.0
      • char: u0000
      • boolean:false
      • 引用:null
    • 修饰符 属性类型 属性名= 属性值
  5. 对象的创建和使用
    1. 必须使用new 关键字创造对象,还需要构造器 Person link= new Person();
    2. 对象的属性 link.name()
    3. 对象的方法 link.sleep()
    • 静态的属性 属性
    • 动态的行为 方法

3.封装

  • 该露的露,该藏的藏

    • 我们程序设计要追求”高内聚,低耦合“。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
  • 封装(数据的隐藏)
    • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
    • 属性私有 get/set

示例:类 私有数据/属性设置公共接口

package com.oop.demo04;//类     privates私有
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;}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) {if (age>150 || age<0){this.age=3;}else {this.age = age;}}}

示例:对象 使用

package com.oop;import com.oop.demo04.Student;/*
1.提高程序的安全性,保护数据
2.隐藏代码的程序细节
3.统一接口
4.提高系统的可维护性*/public class Application {public static void main(String[] args) {Student s1 = new Student();s1.setName("潘森");System.out.println(s1.getName());s1.setAge(999);//不合法的System.out.println(s1.getAge());}
}

输出图

4.继承

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

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

  • Java中类只有单继承,没有多继承(一父多子,一子一父)

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

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

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

    示例:父类

    package com.oop.demo05;//在Java中,所有的类都默认直接或间接继承Object//Person 人: 父类public class Person /* extends Object */{//public//private//default//protectedprivate int money=10_0000_0000;public void say(){System.out.println("说了一句话");}public int getMoney() {return money;}public void setMoney(int money) {this.money = money;}
    }
    

    示例:子类

    package com.oop.demo05;//学生 is 人:派生类(子类)
    //子类继承了父类。就会拥有父类的全部方法
    public class Student extends Person{//Ctrl+H 打开族谱
    }
    

    示例:对象应用

    package com.oop;import com.oop.demo05.Student;public class Application {public static void main(String[] args) {Student student = new Student();student.say();System.out.println(student.getMoney());}
    }
    

    输出图

  • object类

  • super this

    • super注意点

      • 1.super调用父类的构造方法,必须在构造方法的第一
      • 2.super必须只能出现在子类的方法或者构造方法中
      • 3.super和this不能同时调用构造方法
    • this注意点:

      • 代表对象的不同:

        this:本身调用者这个对象

        super:代表父类对象的应用

      • 前提

        this:没有继承也可以使用

        super:只能在继承条件下才能使用

      • 构造方法

        this();本类的构造

        super();父类的构造

    示例:父类

package com.oop.demo05;//在Java中,所有的类都默认直接或间接继承Object//Person 人: 父类
public class Person /* extends Object */{public Person() {System.out.println("拉亚斯特无参执行了");}protected String name="亚托克斯";public void print(){System.out.println("拉亚斯特");}
}

实例:子类

package com.oop.demo05;//学生 is 人:派生类(子类)
//子类继承了父类。就会拥有父类的全部方法
public class Student extends Person{public Student() {//隐藏代码:调用了父类的无参构造//super();  调用父类的构造器的代码,必须要在子类构造器内代码的第一行System.out.println("凯隐无参构造执行了");}private String name="剑魔";public void print(){System.out.println("凯隐");}public void test1(){print();this.print();super.print();}public void test2(String name){System.out.println(name);System.out.println(this.name);System.out.println(super.name);}
}

示例:应用

package com.oop;import com.oop.demo05.Student;public class Application {public static void main(String[] args) {Student student = new Student();student.test2("暗裔");student.test1();}
}

输出图

方法的重写

重写:需要有继承关系,子类重写父类的方法
1.方法名必须相同
2.参数列表必须相同
3.修饰符:
范围可以扩大但不能缩小:Public>Protected>Default>Private
4.抛出的异常:
范围可以被缩小,但不能扩大:ClassNotFoundException–>Exception(大)

重写,子类的方法和父类必须要一致;方法体不同

为什么需要重写:
1.父类的功能,子类不一定需要,或者不一定满足
Alt+Insert:override;

示例:父类

package com.oop.demo05;//重写都是方法的重写与属性无关
public class B {public  void test(){System.out.println("B-test");}
}

示例:子类

package com.oop.demo05;//继承关系
public class A extends B{@Overridepublic void test() {System.out.println("A-test");}
}

示例:应用

package com.oop;import com.oop.demo05.A;
import com.oop.demo05.B;public class Application {//静态方法和非静态方法的区别很大//静态方法:方法的调用只和左边定义的数据类型有关//非静态:重写public static void main(String[] args) {//方法的调用只和左边定义的数据类型有关A a=new A();a.test();//A//父类的引用指向了子类B b=new A();//子类重写了父类的方法b.test();//B}
}

输出图

5.多态

  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式
  • 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
  • 多态存在的条件
    • 有继承关系
    • 子类重写父类方法(方法需要重写)
    • 父类应用指向子类对象
  • 注意:
      1. 多态是方法的多态,属性没有多态性
      2. 父类和子类,有联系 类型转换异常 ClassCastException

示例:父类

package com.oop.demo06;public class Person {public void run(){System.out.println("润了");}
}

示例:子类

package com.oop.demo06;public class Student extends Person{@Overridepublic void run() {System.out.println("神神");}public void eat(){System.out.println("吃");}
}

示例:应用

package com.oop;import com.oop.demo06.Person;
import com.oop.demo06.Student;public class Application {public static void main(String[] args) {//一个对象的实际类型是确定的//new Student();//new Person();//可以指向的引用类型就不确定:父类的引用指向子类//Student 能调用的方法都是自己的或继承父类的Student s1 = new Student();//Person    父类型,可以指向子类,但不能调用子类独有的方法Person s2 = new Student();Object s3=new Student();//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大s2.run();//子类重写了父类的方法,执行子类的方法s1.run();}
}

输出图

instance of

6.static关键字

​ 和类一起加载

示例:

package com.oop.demo07;public class Student {private static int age;//静态的变量private double score;//非静态的变量public void run(){}public static void go(){}public static void main(String[] args) {Student s1 = new Student();System.out.println(s1.score);System.out.println(Student.age);new Student().run();Student.go();}
}

7.抽象类

  • abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是修饰类
  • 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类
  • 抽象类:不能使用new关键字来创建对象,它是用来让子类继承的
  • 抽象方法:只有方法的声明,没有方法的实现,他是用来让子类实现的
  • 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类

8.接口

  • 普通类:只有具体实现
  • 抽象类:具体实现和规范(抽象方法)都有
  • 接口:只有规范
  • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想。如果你是飞机,则必须能飞。如果你是汽车,则必须能跑。如果你是直升机,则必须能闪电旋风劈。
  • 接口的本质是契约,就像物理规则。大家都遵守
  • 接口的作用:
      1. 约束
      1. 定义一些方法,让不同的人实现
      1. 接口中默认的方法都是public abstract
      1. 接口定义的属性都是常量 public static final
      1. 接口不能被实例化(抽象类也一样不能被实例化);因为接口中没有构造方法
      1. implements可以实现多个接口
      1. 必须要重写接口中的方法

示例:接口1

package com.oop.demo09;//interface 定义的关键字,接口都需要实现类
public interface UserService {//接口定义的属性都是常量   public static finalint age=99;//接口中的所有定义的方法其实都是抽象的 默认自带public abstractvoid add(String name);void delete(String name);void update(String name);void query(String name);
}

示例:接口2

package com.oop.demo09;public interface TimeService {void time();
}

示例:接口的实现类

package com.oop.demo09;//抽象类:extends-单继承
//一个类可以通过implements实现接口
//实现了接口的类,需要重写接口中的方法
//利用接口实现多继承
public class UserServiceImpl 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() {}}

9.内部类(扩展)

  • 内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就称为外部类
    1. 成员内部类
    1. 静态内部类:用static作修饰词
    1. 局部内部类:public class内一个方法中再创建一个class类
    1. 匿名内部类:没有名字初始化类,不用将实例保存到变量中

示例:内部类

package com.oop.demo10;public class Outer {private int id=10086;public void out(){System.out.println("这是外部类的方法");}public class Inner{public void in(){System.out.println("这是内部类的方法");}//获得外部类的私有属性public void getID(){System.out.println(id);}}
}

示例:应用

import com.oop.demo10.Outer;public class Application {public static void main(String[] args) {//外部类通过new关键词实现Outer outer = new Outer();outer.out();//内部类通过外部类来实例化Outer.Inner inner = outer.new Inner();inner.in();inner.getID();}
}

输出图

【day08~10】Java面向对象基础认识相关推荐

  1. java面向对象课件_《JAVA面向对象基础》PPT课件.ppt

    <<JAVA面向对象基础>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<JAVA面向对象基础>PPT课件.ppt(68页珍藏版)>请在人人文库 ...

  2. 【Java】Java学习笔记(2)——Java面向对象基础作业函数题

    本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正. 学校小学期Java课程的练习题,留个档便于以后需要时候有例子可以回忆,写的烂的地方请多多包含 1.求两个数值之和 ...

  3. java小游戏:蜡笔小新!!!基于JAVA面向对象实现的跑酷类游戏(小新跑酷)(简单小游戏,仅仅使用Java面向对象基础实现(附上源码))

    一起来看一下蜡笔小新,很好看的,解压!!!!!!!!!!!!!!! 由于Java面向对象基础的游戏,有一定的局限,但是我觉得这款的可玩性已经很高了,话不多说一起来看游戏: 游戏界面,点击空格跳跃来躲避 ...

  4. Java面向对象基础学习笔记(构造、重载、继承、多态、抽象类、接口、模块)

    Java面向对象编程包含哪些内容? 怎么理解面向对象编程? 现实生活中,我们定义了"人"的抽象概念,这就是类class,生活中的每一个具体的人就是实例instance. class ...

  5. java面向对象基础

    java数组 文章目录 java面向对象初步认识 软件开发 面向对象和面向过程 对象 对象和类 类的定义 类和对象的练习 类的方法 类的方法的练习 java面向对象初步认识 软件开发 软件开发分为了结 ...

  6. Java 面向对象基础和进阶

    3-2 面向对象基础 面向对象概述 课堂笔记 面向对象是一种编程思想,是相对于面向过程的概念而言的. 面向对象强调把数据和方法组织成一个整体来看待,将世间万物抽象成一个个对象来对待. 面向对象与面向过 ...

  7. Java面向对象基础接口和抽象的理解

    第一,抽象类: 我们都知道,在面向对象的领域中,一切都是一个对象,所有的对象都是用类来描述的,但不是所有的类都是用对象来描述的.如果一个类没有足够的信息来描述一个特定的对象,并且需要其他特定的类来支持 ...

  8. Java面向对象——基础2 封装、继承、多态

    目录 Java基础知识图解 一.方法的重载 1.1重载是什么? 1.2重载的例子 1.3判断重载练习 1.4重载小结 1.5可变个数的形参 ​说明: 二.方法参数的值传递机制 2.1基本数据类型的参数 ...

  9. Java面向对象基础呕心沥血三千字

    # 一.初识Java ## 1.java关键字 public    公共的.公开的  class    类 static    静态的 void    空的     main    main方法 St ...

最新文章

  1. python类型提示模块包_(任何)python模块的类型提示是什么?
  2. dateformat线程_Java最佳实践–多线程环境中的DateFormat
  3. termux安装渗透工具一
  4. Qt Sqlite中替换部分字符串
  5. Acrel-2000E/M配电室综合监控系统在浙江省地理信息产业园中的应用
  6. 基于docker的test-containers环境百宝箱
  7. 安卓手机便签怎么快速修改重复提醒设置?
  8. 云计算day12-Kubernetes_K8s
  9. 筋斗云接口编程 / 常用操作(二)
  10. ZYNQ PS部分简介
  11. 洛阳中考实验计算机分数,2018洛阳中考科目及分值
  12. 2021AAPM大赛第一名技术报告Designing an Iterative Network for Fanbeam-CTwith Unknown Geometry 阅读笔记
  13. UPC-5594 Colorful Slimes(思维)
  14. Unity 性能优化:资源篇
  15. Tekton笔记(四)之Authentication及catalog skopeo
  16. 莫圣宏:4.30黄金开启跌势,黑色星期五黄金操作建议!
  17. 华为鸿蒙os3.0评测,华为鸿蒙OS威力初显!实测体验比EMUI更好 功耗却更低 惊喜还有很多...
  18. Codeforces Round #791 (Div. 2)(A-D)
  19. Makefile新手?千万别错过了《驾驭Makefile》
  20. VUE对数组进行深度监听无法改变值解决办法(全网最详细)

热门文章

  1. 地下水位监测预警方案 | 助力城市排水信息化
  2. [导入]zamzar.:在线转换工具
  3. PMP 项目管理 考前专题(04)考试 答题原则与套路总结
  4. 孙陶然:成功者风光的背后是和你一样的坎坷
  5. 高端对话:过程改进领域热点话题集锦
  6. Bootstrap简单网页制作
  7. scrapy微博反爬虫_Scrapy 爬取新浪微博(解析api)
  8. win10显卡驱动怎么装_【系统安装好后,怎么用最正规的方法安装驱动】
  9. R 数字 字符 向量
  10. 目标检测网络之三叉戟TridentNet