Java面向对象(上)

对现实世界的理解与抽象:如果只是用变量,赋值语句,表达式,控制语句去构建现实世界模型的话会非常困难,所以面向对象的出现的根本原因就是就是为了解决这个问题,以及这个问题放在工程生产中产生的新的更为复杂的问题。面向对象让我们从指令代码操作变量转变为通过指令操作对象。
面向对象定义

  • 猫猫虫小栗子
public class objectOriented {
 
    public static void main(String[] args) {
 
        //第一只猫
        Cat cat1 = new Cat();
        cat1.name = "飘飘";
        cat1.age = 3;
        cat1.color = "白";
        //第二只猫
        Cat cat2 = new Cat();
        cat2.name = "马吉吉";
        cat2.age = 5;
        cat2.color = "绿";
        
        System.out.println("第一只猫信息:"+cat1.name+'\t'+cat1.age+'\t'+cat1.color);
        System.out.println("第二只猫信息:"+cat2.name+'\t'+cat2.age+'\t'+cat2.color);
    }
}
//定义一个猫类
class Cat {
 
    String name;
    int age;
    String color;
}
  • 现有技术的主要缺点:不利于数据管理

类与对象

属性/成员变量

● 概念上: 成员变量 = 属性 = field(也叫字段) ,成员变量是用来表示属性的

● 属性是类的一个组成部分,一般是基本数据类型,也可以是引用类型(对象、数组)

对象创建

● new一个

// 先声明再创建
Cat cat1;
cat1 = new Cat();
//直接创建
Cat cat1 = new Cat();

对象机制

public class objectOriented {
 
    public static void main(String[] args) {
 

        Cat cat1 = new Cat();
        cat1.name = "飘飘";
        cat1.age = 3;

        Cat cat2 = cat1;
        System.out.println(cat2.name);
        cat2.age = 5;
        cat2 = null;

        System.out.println(cat1.age);
        System.out.println(cat2.age);
    }
}
//定义一个猫类
class Cat {
 
    String name;
    int age;
    String color;
}


飘飘
5
Exception in thread "main" java.lang.NullPointerException
	at objectOriented.main(objectOriented.java:14)

对象机制原理图

  • 图1

  • 图2

开始加速了~

构造器

构造方法也叫构造器(constructor)是类的一种特殊方法,主要作用:完成对新对象的初始化,并非创建对象。(俺觉得这个像python中的__init__(self)方法一样,确实如此)

● 特点与小细节
构造器与类同名 没有返回值 默认的无参构造器

public class objectOriented {
 
    public static void main(String[] args) {
 
        Person p1 = new Person("香飘飘", 21);

    }
}

class Person {
 
    String name;
    int age;

    Person(String pName, int pAge) {
 
        System.out.println("构造器被调用");
        name = pName;
        age = pAge;
    }
}

对象创建流程

先看图

成员方法蓼

在某些特定方法下,我们需要定义成员方法,如人类:除了属性(性别、年龄、身高、…),我们人类还有一些行为:吃饭、睡觉、学习Java、…。

访问修饰符 返回数据类型 方法名(形参列表) {
    方法体;
    return 返回值;
}

● 注意事项

  1. 形参列表:表示成员方法的输入,参数类型可以是任意类型
  2. 返回数据类型:表示成员方法的输出,void 表示没有返回值
  3. return语句不是必须的,但一个方法最多一个返回值,return的值要与回数据类型一致或兼容
  4. 访问修饰符:控制方法使用的范围。不写为默认访问
  5. 方法名:遵循驼峰命名法,最好见名知意

public class objectOriented {
 
    public static void main(String[] args) {
 

        Cat cat1 = new Cat();
        cat1.name = "飘飘";
        cat1.age = 3;

        cat1.speak();
        int val = cat1.compute(100);

        System.out.println(val);

    }
}
//定义一个猫类
class Cat {
 
    String name;
    int age;
    String color;

    public void speak() {
 
        System.out.println("喵喵喵");
    }

    public int compute(int n) {
 
        return n*(n+1)/2;
    }
}

方法调用机制原理图

私有方法

在 Java 中,为了实现一个私有的方法,只需将关键字 public 改为 private 即可。只要方法是私有的,类的设计者就可以确信:它不会被外部的其他类操作调用,可以将其删去。如果方法是公有的,就不能将其删去,因为其他的代码很可能依赖它 。

● final

必须确保在每 一个构造器执行之后,这个域的值被设置, 并且在后面的操作中, 不能够再对它进行修改。 final 修饰符大都应用于基本(primitive ) 类型域,或不可变(immutable) 类的域。

方法重载

Java中允许同一个类中,多个同名方法存在,但要求形参列表不一致。

● 方法名:必须相同

● 形参列表:必须不同(形参类型或个数或顺序,至少有一种不同,参数名无要求)

可变参数

java中允许将一个类中多个 同名同功能 但 参数个数不同 的方法,封装成一个方法。

//访问修饰符 返回类型 方法名 (数据类型... 形参名) {
 
//}
public class Rose {
 
    public static void main(String[] args){
 
        ppMethod p = new ppMethod();
        String res = p.grade("马吉吉", 90, 80);
        System.out.println(res);

    }
}
class ppMethod {
 
    public String grade(String name, double... score) {
 
        double score_sum = 0;
        for (double v : score) {
 
            score_sum += v;
        }
        return name + "的总成绩:" + score_sum;
    }
}

● 注意细节

  1. 可变参数的实参可以是0个或任意多个
  2. 可变参数的实参可以是数组
  3. 可变参数的本质就是数组
  4. 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
  5. 一个形参列表只能出现一个可变参数

作用域

  1. 在Java中主要的变量就是属性(成员变量)和局部变量。
  2. 局部变量一般指的是在成员方法中定义的变量。
  3. 作用域的分类:
    a. 全局变量 :也就是属性,作用域为整个类体。可以被本类使用,也可以被其他类使用(通过对象调用)
    b. 局部变量 :除了属性之外的其他变量,作用域为定义它的代码块中。
  4. 全局变量可以不用赋值,直接使用,因为有默认值;局部变量必须赋值后才能使用,因为其没有默认值。

● 注意事项与细节使用
就近原则

  • 跨类使用变量
public class objectOriented {
 
    public static void main(String[] args) {
 
        Person p1 = new Person();
        T t = new T();
        t.test();

        t.test1(p1);
    }
}

class Person {
 
    String name = "玛吉吉";
    int age = 99;
    public void say() {
 
        String name = "香飘飘";
        System.out.println("say() name=" + name);
    }
}
class T {
 
    public void test() {
 
        Person p1 = new Person();
        System.out.println(p1.name);
    }
    public void test1(Person p) {
 
        System.out.println(p.name);
    }
}


玛吉吉
玛吉吉

this关键字

Java虚拟机会给每个对象分配 this,代表 当前对象 。即,哪个对象调用,this就代表那个对象。

  1. this关键字可以用来访问本类的属性、方法、构造器。
  2. this用来区分当前类的属性和局部变量。
  3. 访问成员方法的语法:this.方法名(参数列表);
  4. 访问构造器的语法:this(参数列表);只能在构造器中访问另外一个构造器,且必须放在第一条语句。
  5. this不能在类定义的外部使用。

public class objectOriented {
 
    public static void main(String[] args) {
 
        Person p1 = new Person("香飘飘", 21);
        p1.outPut();
    }
}
class Person {
 
    String name;
    int age;

    Person(String name, int age) {
 
        this.name = name;
        this.age = age;
    }
    public void outPut() {
 
        String name = "小椰";
        System.out.println(name + '\t' + age);
        // this 准确的访问属性
        System.out.println(this.name + '\t' + this.age);
    }
}


小椰	21
香飘飘	21

本质是创建不同的文件夹/目录来保存文件。

  1. 需要注意的是, 只能使用 * 导入一个包, 而不能使用 import java.* 或 import java. . 导入以 java 为前缀的所有包,只导入需要的包。
  2. 只导入所需的包并不必过多地理睬它们,但在发生命名冲突的时候,就不能不注意包的名字了 。在每个类名的前面加上完整的包名。
  3. 要想将一个类放人包中, 就必须将包的名字放在源文件的开头 ,且最多只能有一句package。
  4. 命名规则 :
    a. 只能包含数字、字母、下划线、小圆点,但不能以数字开头,不能是关键字或保留字。
    b. 命名规范:一般是小写字母+小圆点,如com.公司名.项目名.业务模块名
  5. 包的作用域:标记为 public 的部分可以被任意的类使用,标记为 private 的部分只能被定义它们的类使用。如果没有指定 public 或 private , 这个部分(类、方法或变量)可以被同一个包中的所有方法访问。

访问修饰符

● 4种访问修饰符的访问范围

○ 公开级别:用 public 修饰,对外公开。

○ 受保护级别:用 protected 修饰,对子类和同一个包中的类公开。

○ 默认级别:没有修饰符号,向同一个包的类公开。

○ 私有级别:用 private 修饰,只有类本身可以访问,不对外公开。

● 注意事项

○ 修饰符可以用来修饰类中的属性,成员方法以及类。

○ 只有默认的和public才能修饰类 ,并且遵循上述访问权限的特点。

○ 成员方法的访问规则和属性完全一样。

编辑于 2022-07-05 10:53

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值