代码编织梦想

Java面向对象编程(OOP)

一、面向过程&面向对象

1. 面向过程思想

​ 步骤清晰简单,第一步做什么,第二步做什么……

​ 面对过程适合处理一些较为简单的问题。

2. 面向对象思想

物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。

​ 最后,才对某个分类吓得细节进行面向过程的思索。

​ 面向对象适合处理复杂的问题,适合处理需要多人协作的问题!

​ 对于描述复杂的食物为了宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。 但是,具体到微观操作,仍然需要使用面向过程的思路去处理。

3. 什么是面向对象(抽象)

​ 面向对象编程(OOP)的本质就是:以类的方式组织代码,以对象的组织(封装)数据。

​ 三大特性:封装、继承、多态。

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

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

二、回顾方法及加深

1. 方法的定义

​ 修饰符

​ 返回类型

package com.oop.demo01;
//Demo01 类
public class Demo01 {
    // main方法
    public static void main(String[] args) {
        int c = 10;
        int d = 11;
        int a = max1(c,d);
        System.out.println(a);
    }
    /*
    修饰符 返回值类型 方法名(...){
        //方法体
        return 返回值;
     }
     */
    public String sayHello(){
        return "hello,world";
    }
    //void 没有返回值
    public void hello(){
        return;
    }
    public static int max1(int a,int b){
        return a>b ? a : b ;
    }
}

​ break:跳出switch,结束循环。

​ return:方法结束。

​ 方法名:注意规范,见名知意。

​ 参数列表:(参数类型,参数名)…

​ 异常抛出:疑问,后面讲解。

2. 方法的调用:递归

​ 静态方法

​ 非静态方法

public class Demo02 {
    public static void main(String[] args) {
        //静态方法  static
        Student.say();//调用别的类中的静态方法
        //非静态方法
        //对象类型 对象名 = 对象值;
        Student student = new Student();
        student.saying();
    }
}
//     class就是一个类
	public class Student {
//定义的一个静态方法,与类同时存在
//如果有static 就通过类名 在别的类里面进行调用
//如果是非静态方法 就需要将类实例化 通过new关键字
    public static void say(){
        System.out.println("学生说话了");
        //saying(); 不能调用非静态方法
    }
    //定义的非静态方法,在实例后才存在
    public void saying(){
        System.out.println("学生一直在说话");
        say();
    }
}

​ 形参和实参

​ 值传递和引用传递

   //值传递
    public static void main(String[] args) {
        int a =1 ;
        System.out.println(a);
        Demo04.change(a);
        System.out.println(a);
    }
    public static void change(int a){
        a=10;
    }
//引用传递:对象本质还是值传递
    public static void main(String[] args) {
        Person person = new Person();
        Demo05.change(person);
        System.out.println(person.name);
    }
    public static void change(Person person){
        //preson是一个对象:是指向的Person person = new person();是一个具体的对象,可以改变属性!
        person.name="Nacuia";
    }
}
//定义了一个person类,有一个属性叫做name。
class Person{
    String name;
}

​ this关键字:指的就是本类

三、类与对象的关系

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

​ 动物、植物、手机、电脑等

​ person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为。

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

​ 张三就是人的一个具体实例,张三加的旺财就是狗的一个具体实例。

​ 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。

//学生类
public class Student {
    //属性:字段
    String name;//null
    int age;//0
    //方法
    public void study(){
        System.out.println(this.name+"在学习");
    }
}
/*
        //类是抽象的 需要实例化。
        //类实例化后会返回一个自己的对象。
        //对象就是一个类的具体实例。
        Student xiaoming = new Student();
        Student xiaohong = new Student();
        xiaoming.name="小明";
        xiaoming.age=17;
        System.out.println(xiaoming.name);
        System.out.println(xiaoming.age);
        xiaoming.study();
 */

注意点

1.类是抽象模板,对象是一个具体的实例;

2.对象的引用

​ 引用类型:除了八大基本类型

​ 对象是通过引用来操作的:栈——>堆(地址)

3.属性:字段,成员变量。

​ 默认初始化:null,0,0.0,u0000,false,

​ 修饰符 属性类型 属性名 = 属性值!

4.对象的创建与使用

​ 必须使用new关键字创造对象,构造器 Person Nauica = new person();

​ 对象的属性 Nauica.name;

​ 对象的方法 Nauica.sleep();

5.类:

​ 静态的属性 属性

​ 动态的行为 方法

四、创建与初始化对象

使用new关键字创建对象

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

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

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

构造器必须掌握

public class Person {
    //一个类什么都不写,也会出现一个与名字相同且没有返回值的构造器。
    String name;
    //无参构造,没有参数的构造
    //可以实例化(初始值)初始值
    //1. 使用new关键字必须要有构造器
    //2. 用来初始化值
    public Person(){
        this.name="Nauica";
    }

    //有参构造:一旦定义了有参构造,无参构造就必须定义,否则无效。
    public Person(String name){
        this.name=name;
    }
    //alt+insert 快捷建立构造
}

/*
        //使用new关键字new实例了一个对象。
        Person person = new Person();
        Person person2 = new Person("world");
        System.out.println("无参初始值为:"+person.name);//无参初始值
        System.out.println("有参初始值为:"+person2.name);//有参初始值
        person2.name="hello";
        System.out.println(person2.name);

        构造器:
            1.与类名相同
            2.没有返回值
        作用:
            1.new 本质是在调用构造方法
            2.初始化值
        注意点:
            定义了有参构造之后,如果要使用无参构造,显示的定义一个无参的构造。
            this指的是本类
            alt+insert快捷键
 */

五、封装、继承与多态

封装:

该露的露,该藏的藏。

​ 程序设计要追求**“高内聚,低耦合“**。

​ 高内聚就是类的内部数据操作细节由自己完成,不允许外部干涉;

​ 低耦合就是仅少量的方法给外部使用。

封装(数据的隐藏)

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

​ 常用于属性,方法较少

属性私有,get/set

封装意义:

1.	提高程序安全性,保护数据;
1.	隐藏代码的实现细节;
1.	统一接口,形成规范;
1.	提高系统的可维护性。
//封装
//类 private:私有
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 getAge() {
        return age;
    }
    public void setAge(int age) {
        if(age<150 && age>0){
            this.age = age;
        }else {
            System.out.println("年龄错误");
            this.age=3;
        }
    }
}
/*
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("Nauica");
        System.out.println(s1.getName());
        s1.setAge(999);//不合法
        System.out.println(s1.getAge());
    }
 */	

继承:

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

extends的意思就是**“拓展”**,子类是父类的拓展。

Java中只有单继承,没有多继承!

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

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

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

object类

//人 ;父类
//ctrl+h 打开继承树
//Java中所有与的类,都默认继承object类
public class Person {
    /*
    优先级,从上到下
    public      公共的
    protected   受保护的
    default     默认的
    private     私有的
     */
    private int money = 10000;
    public void say(){
        System.out.println("说了一句话");
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }
}
/*
 public static void main(String[] args) {
        Student student = new Student();
        student.say();
        System.out.println(student.getMoney());
        Person person = new Person();
    }
 */

//学生 is 人 :子类
//子类继承父类后,就会拥有父类的全部公共的方法与属性!
public class Student extends Person{
}

super

注意点:
  1. super调用父类的构造方法,必须在构造芳芳的第一个;

     	2. super必须只能出现在子类的方法或者构造方法中;
     3. super和this不能同时构造方法。
    

Vs this

  1. 代表的对象不同

    ​ this:代表自身这个对象;

    ​ super:代表父类对象的引用。

  2. 前提

    this:没有继承也可以使用;

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

  3. 构造方法

    this():本类的构造;

    super():父类的构造。

public class Student extends Person {
    public Student() {
        super();//隐藏代码:调用了父类的无参构造
        System.out.println("student无参执行了");
    }
    public String name = "awei";
    public void print(){
        System.out.println("Student");
    }

    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
        this.print();
        super.print();
    }
}
/*
    public static void main(String[] args) {
        Student student = new Student();
        student.test("芜湖");
    }
 */
/*
public class Person {
    protected String name = "Nauica";

    public Person() {
        System.out.println("person无参执行了");
    }
    public void print(){
        System.out.println("Person");
    }
}
 */

方法重写

​ 重写:方法必须一致,方法体不同。

​ 前提:需要有继承关系,是在非静态情况下,子类重写父类的方法。

​ 特点:

	1. 方法名必须相同;
	2. 参数列表必须相同;
	3. static 方法,属于类,不属于实例,不能重写;
	4. final 常量;private 私有的,都不能重写;
	5. 修饰符:范围可以扩大,但是不能缩小; public > Protected > Default > private
	6. 抛出的异常:范围可以被缩小但不能扩大;

​ 父类的功能子类不一定需要或满足。

import com.oop.demo05.A;
import com.oop.demo05.B;
public class Application {
    //一个项目应该只有一个main方法
    public static void main(String[] args) {
        //静态:方法的调用只和左边定义的数据类型有关!
        //非静态:没有static时,方法被重写了 只跟右边有关!
        A a = new A();
        a.test();//A
        //父类的引用指向了子类
        B b = new A();
        b.test();//B
    }
}
/*
//重写都是方法的重写与属性无关
public class B {
    public void test(){
        System.out.println("B-test()");
    }
}
 */

/*
public class A extends B{
    //Override
    @Override//注解:有功能的注释
    public void test() {
        System.out.println("A-test");
    }
}
 */

多态:

​ 动态编译:类型

​ 既同意方法可以根据发送对象的不同而采用多种不同的行为方式。

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

多态存在的条件:

​ 1. 有继承关系;

​ 2. 子类重写父类的方法;

​ 3. 父类引用指向子类对象。

多态注意事项:

​ 1. 多态是方法的多态,属性没有多态

​ 2. 父类和子类,有联系,类型转换异常!ClassCastException!类型转换

​ 注意:多态是方法的多态,属性没有多态性。

    public static void main(String[] args) {
//        一个对象的实际类型是确定的!
//        new Student();
//        new Person();
        //可以指向的引用类型是不确定的!
        Student s1 = new Student();
        //父类的引用指向子类的类型!
        Person s2 = new Student();
        Object s3 = new Student();
        //对象能执行的方法主要看左边的类型!
        //子类可以用父类的,但是父类不能用子类的
        s2.run();
        s1.run();
        s1.eat();
        ((Student)s2).eat();//强制转换
    }
}

/*
public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }
    public void eat(){
        System.out.println("eat");
    }
}
 */
/*
public class Person {
    public void run(){
        System.out.println("run");
    }
}
 */

instanceof 类型转换-引用类型

​ 用来判断一个对象是什么类型,判断是否存在父子关系!

public class Student extends Person{
    public void go(){
        System.out.println("go");
    }
}
/*
        //Object > Person > Student
        //Object > Person > Teacher
        //Object > String
        Object object = new Student();
        System.out.println(object instanceof Student);//true
        System.out.println(object instanceof Person);//true
        System.out.println(object instanceof Object);//true
        System.out.println(object instanceof Teacher);//false
        System.out.println(object instanceof String);//false
 */
/*
    public static void main(String[] args) {
        //类型之间的转换:父 子
        Person person = new Student();
        //爸爸用儿子的需要强制转换。
        ((Student)person).go();             //强制转换
        Student person1 = (Student) person; //强制转换
        person1.go();
        
        Student student = new Student();
        ((Person)student).run();//儿子用爸爸的不需要转换,但子类转换为父类后可能会丢失自己的方法
    }
 */

六、static类

public class Student {
    private static int age; //静态的变量  多线程!
    private int score;      //非静态的变量
    public void run(){      //调用才加载
        System.out.println("run");
    }

    public static void go(){    //静态先加载
        System.out.println("go");
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println(s1.age);
        System.out.println(Student.age);
        go();
        Student.go();
        s1.run();
        s1.go();
    }
}
public class Person {
    {
        System.out.println("匿名代码块");
        //代码块(匿名代码块)
    }
    static {
        System.out.println("静态代码块");
        //静态代码块
    }
    public Person() {
        System.out.println("构造方法");
    }
    public static void main(String[] args) {
        //1.静态代码块 只执行一次!
        //2.匿名代码块
        //3.构造方法
        Person person = new Person();
        System.out.println("=======");
        Person person1 = 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(Math.random());//随机数
        System.out.println(random());
        System.out.println(PI);
    }
}

七、抽象类

abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么方法就是抽象方法;如果修饰类,那就是抽象类。

​ 抽象类中可以没有抽象方法,但有抽象方法的类一定要声明为抽象类。

​ 抽象类不能使用new关键字来创建对象,它是用来让子类继承的。

​ 抽象方法,只是方法的声明,没有方法的实现,它是用来让子类实现的。

​ 子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则子类也要声明为抽象类!

//abstract 抽象类 extends是单继承(接口可以多继承)
public abstract class Action {
    //约束
    //abstract 抽象方法,只有名字,没有方法的实现。
    //子类必须实现它的方法,除非子类也是抽象类。
    public abstract void doSomething();
    /*
    1.不能new抽象类,只能靠子类来实现它:约束!
     */
    public void go(){
        System.out.println("hello");
    }
}
public class A extends Action{
    @Override
    public void doSomething() {
    }
}

八、接口

​ 普通类:只有具体实现

​ 抽象类:具体实现和规范(抽象方法)都有!

​ 接口:只有规范!不能写方法~专业的约束!约束和实现分离:面向接口编程。

​ 接口就是规范,定义的是一组规则,体现了现实生活中“如果你是…则必须能…”的思想。

​ 接口的本质是契约,如同法律一样,制定下来大家都需要遵守。

​ OO的精髓就是对对象的抽象,最能体现这一点的就是接口。为什么讨论设计模式都只针对具备了抽象能力的语言(比如java,c++等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。

声明类的关键词是class,声明接口的关键字是interface。

接口的作用:

1. 作为约束;
2. 可以定义一些方法,让不同的人实现;
3. 方法都是public abstract ,属性都是public static final;
4. 接口跟抽象类一样都不能被实例化,没有构造方法!
5. implements可以实现多个接口;
6. 必须要重写接口中的方法。
public interface TimeService {
    void time();
}
public interface UserService {
    //接口中所有定义都是抽象的 public abstract
    //接口需要实现类
    //常量~public static final省略
    int age = 99;
    public abstract void run(String name);//public abstract可以省略
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);
}
//抽象类用extends
//接口用implements,可以链接多个接口
//实现了接口的类就需要重写接口中的方法!
//多继承~利用接口实现了多继承!
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void run(String name) {

    }

    @Override
    public void add(String name) {

    }

    @Override
    public void delete(String name) {

    }

    @Override
    public void update(String name) {

    }

    @Override
    public void query(String name) {

    }

    @Override
    public void time() {

    }
}

九、内部类

​ 内部类就是在一个类的内部定义一个类,比如在A类中定义了一个B类,那么B类就是A类的内部类,A类就是B类的外部类。

1. 成员内部类

public class Outer {

    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }
    public class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }
        public void getID(){
            System.out.println(id);
        }
    }
}

2. 静态内部类

    public static class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }

3. 局部内部类

    public void out(){
        System.out.println("这是外部类的方法");
        //在方法内部
        class Inner{
            public void in(){
                System.out.println("这是内部类的方法");
            }
        }
    }
}

4. 匿名内部类

public class Test {
    public static void main(String[] args) {
        //不对类进行初始化,不用将实例保存到一个变量中,直接使用方法
        //apple apple = new apple();
        new apple().eat();
        new UserService(){
            @Override
            public void hello() {
            }
        };

    }
}
class apple{
    public void eat(){
        System.out.println("1");
    }
}
interface UserService{
    void hello();
}

期待可以早日自己写一些对于Java的见解与看法,加油

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Nauica/article/details/123545516

java————一门强大的面向对象编程语言_yuxy36的博客-爱代码爱编程

JAVA————一门强大的面向对象编程语言 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。 Java具有简单性、面向对象、分布式

java基础四——面向对象思想_蜗牛2号的博客-爱代码爱编程

1.1 什么是面向对象         面向对象思想就是不断的创建对象(属性与行为的封装,让二者作为整体参与程序执行),使用对象,指挥对象做事情。(在已有对象的情况下,直接使用对象,而不再去考虑对象的内部构造)         面向对象的开发来讲也分为三个过程:OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程) 1.2 了解对象的内部结

javase核心技术——面向对象编程基础练习题_dys_房东的猫的博客-爱代码爱编程

1、定义一个点类Point,包含2个成员变量x、y分别表示x和y坐标,2个构造器Point()和Point(intx0,y0),以及一个movePoint(int dx,int dy)方法实现点的位置移动,创建两个Point

java基础——面向对象编程(类对象)_小马哥哥最菜的博客-爱代码爱编程

Java基础——面向对象编程(类对象) Java基础知识图解面向对象面向对象的思想概述面向对象(OOP)与面向过程面向对象的三大特征类与类之间的关系java类及类的成员属性方法 对象的产生对象的使用对象的生命

Java — 面向对象的编程语言-爱代码爱编程

本篇文章将对 Java 中面向对象的一些概念做出详细讨论。 一、为什么要面向对象? 老是在说面向对象,面向对象中的这个对象到底是什么呢? 1、什么是对象? 对象是人们可以进行研究的一切事物,从最简单的一支铅笔到极其复杂的航空母舰,都可以看作是对象。对象不仅仅能表示具体的事物,还能表示抽象的规则、计划或者事件等。 因此,面向对象的这个对象,指的是客

java面向对象——狂神说Java学习笔记二-爱代码爱编程

原文链接:公众号狂神说视频教程[狂神说B站]: https://www.bilibili.com/video/BV12J41137hu 如有侵权,联系立删 面向对象编程 面向过程&面向对象 面向过程思想 步骤清晰简单,第-步做什么,第二C步做什么…面对过程适合处理一些较为简单的问题面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决

Java自学第15天 面向对象(全)-爱代码爱编程

面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么…面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。面向对象适合处理复杂的问题,适合处理需要多人协作的问题! 对于描述复杂的

Java day22-爱代码爱编程

集成开发环境 1. 集成开发环境简称 IDE 什么是集成开发环境? * 集成开发环境可以让代码变得更加简单,更加高效 * 没有IDE 工具:

【Java】万物皆对象——面向对象编程-爱代码爱编程

【Java】万物皆对象——面向对象编程 ⭐包🏹导入包中的类🏹静态导入🏹将类放到包中🏹包的访问权限控制🏹常见的系统包⭐继承🏹基本语法🏹protected关键字🏹更复杂的继承关系🏹final关键字⭐组合⭐多态🏹向上转型🏹动态绑定🏹方法重写🏹向下转型🏹super关键字🏹总结⭐抽象类🏹语法规则🏹抽象类的作用⭐接口 ⭐包 🏹导入包中的类 J

educoder——面向对象程序设计java——实验实训——实验一 - 语言基础-爱代码爱编程

第1关:Java 循环结构之 for 循环 编程要求 是不是会用了呢?来试试吧,在右侧编辑器Begin-End中填充代码,用for循环实现一个自然数N的阶乘。 例如:给定一个数数N=5,那么它的阶乘为1*2*3*4*5。 效果图如下: 测试说明 平台会对你编写的代码进行测试,若与预期输出一致,则算通关。   第2关:for循

java面向对象编程——多态性的实现-爱代码爱编程

Java中多态性的实现 什么是多态 面向对象的三大特性 :封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义 :指允许不同类的对象对同一消息做出响