Java系列2:类和对象

1、面向对象

面向对象
OOP

面向对象的优点:

(1)便于程序模拟现实世界中的实体
用“类”表示实体的特征和行为

(2)隐藏细节
对象的行为和属性被封装在类中,外界通过调用类的方法来获得,不需关注内部细节如何实现

(3)可重用
可以通过类的模板,创建多个类的对象

2、对象

(1)特征:

属性:attribute / field / property

属性是对象具有的各种特征。
每个对象的每个属性都拥有特定值。

方法 / 行为:method

方法是对象执行的操作。

(2)使用对象的步骤:

使用new创建一个对象:
School center = new School();

使用对象:
center.schoolName = “qinghua";        对象名.属性
center. toInter ();      对象名.方法名()

(3)对象在内存中的存放形式

对象在内存中的存放形式

3、类

类是具有相同属性和方法的对象的集合。

所有Java程序都以类class为组织单元。

定义一个类的步骤:

  1. 定义类名
  2. 编写类的属性
  3. 编写类的方法

4、类和对象的区别

类是抽象的概念,仅仅是模板,比如说:“人”。
对象是一个你能够看得到、摸得着的具体实体,比如:“张三”。

5、抽象

把相同的或相似的对象归为一类的这个过程就是抽象,所以,抽象就是分析问题的方法。

抽象的过程其实就是面向对象编程的核心思想之一。

6、成员运算符:.

在Java中,只有先实例化类的对象,才可以访问到类中的成员(属性和方法)。

使用成员运算符(.)来访问成员属性或成员方法;

一般语法是:
对象名.成员名

std.age = 18;   //为成员属性赋值
std.dining();  //调用成员方法

7、构造器 / 构造方法:constructor

在上例中,只能逐个地为数据成员赋值,如果想在对象实例化的同时就初始化成员属性,就使用到了构造方法。正是由于在实例化对象的同时会自动调用构造方法,所以构造方法一般用来给数据成员分配资源或初始化数据成员。

作用:对象实例化。

构造方法是特殊的成员方法,它与类同名,在对象实例化时由虚拟机自动调用。因为是由虚拟机来调用构造方法,所以构造方法一般应定义成public。

只有调用构造方法,才能在内存中开辟空间,才允许存放类中属性和方法的数据。

构造方法的一般形式:

访问权限 类名(形参列表) {
    方法体
}

请注意:

  • 构造方法没有返回值类型,也不能有返回值。
  • 构造方法一般定义成public
  • 每个对象在生成时都必须执行构造方法,而且只能执行一次。
  • 如果构造方法调用失败,那么对象也无法创建。
  • 不可以显式地直接调用构造方法。
  • 在没有定义构造方法的情况下,类会自动产生一个无参数的默认构造方法,这个默认的构造方法什么都不做。
    一旦显式地定义了构造方法,默认构造方法自动消失。
修改后的Student类

例:

Person.java:

public class Person {
    String name;
    // 无参构造器
    public Person() {
        System.out.println("又一个人诞生了!");
    }

    // 含参构造器
    public Person(String name) {
        this.name = name;
        System.out.println
        ("一个人诞生了,他的名字是:"+this.name);
    }
}

TestConstructor.java:

public class TestConstructor {
    public static void main(String[] args) {
        // 通过Person类的含参构造器实例化一个对象person
        Person person = new Person("张三");
        person.name="李四";
        System.out.println("名字:"+person.name);
    
        // 通过Person类的无参构造器实例化一个对象p1
        Person p1 = new Person();
        p1.name="王五";
        System.out.println("人名字:"+p1.name);
    }

}

8、this关键字

既然所有的对象都共用相同的成员方法,那么在不同的对象都调用同一方法时,它是怎么确定要使用哪个对象的数据成员呢?

每个成员方法都有一个隐含的this引用,它总是指向调用它的对象;

关键字this给出用于调用成员方法的对象的地址;

每当调用成员方法时,编译器会向this分配调用该方法的对象的地址;
可以像使用任何引用那样使用this。

/*this示例,代码片段*/
public class Student  //定义学生类
{
  private String mName;  //姓名
  private int mAge;      //年龄

  public Student(String name, int age)
  {
    //隐式调用,等同于this.mName = name;
    mName = name;
    //显式调用,等同于mAge = age;
    this.mAge = age;
  }
  ……
}

注意:在static作用域内,绝对不可以使用this关键字!!!
(因为this是指向本类的一个实例,而static只有一个实例)

9、面向对象的3大基本特征:

(1)封装

java系列4:封装encapsulation

(2)继承

java系列5:继承(inheritance)

(3)多态

java系列6:多态(Polymorphism)

3大基本特征

10、堆区、栈区、方法区

Java的内存分为3个区:堆(heap)、栈(stack)、方法区(method)。

堆区:

  1. 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)。

  2. JVM只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。

栈区:

  1. 每个线程包含一个栈区,栈中只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中。

  2. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

  3. 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:

String say(String name){return "abc"}
// name、"abc"等都存放在方法区

11、静态成员

(1)变量

Java中的变量可分为成员变量和局部变量。
两种变量的作用域和加载时间均不一样。

(2)静态成员变量

在成员变量前加static关键字,可以将其声明为静态成员变量;

如果类中成员变量被定义为静态,那么不论有多少个对象,静态成员变量只有一份内存拷贝,即所有对象共享该成员变量;
在没有实例化对象时,可以通过类名访问静态成员变量;也可以通过对象访问静态成员变量,但不论使用的是哪个对象,访问到的都是同一个变量。

静态成员变量的作用域只在类内部,但其生命周期却贯穿整个程序。和程序同生命周期。

静态成员变量在声明时最好初始化,如果不进行初始化,系统会默认初始化为0。

package test;

class Dog{
  public static int count = 0;  //静态成员变量
  
  public Dog() {     //构造方法
    count++;
  }
}

public class Test{
  public static void main(String[] args){
    System.out.println("当前狗的数量是:" + Dog.count);
    Dog d1 = new Dog();
    Dog d2 = new Dog();
    System.out.println("当前狗的数量是:" + Dog.count);
  }
}

(3)静态成员方法

在成员方法前加static关键字,可以将其声明为静态成员方法;
静态成员方法只能对类的静态成员变量(静态属性和静态方法)进行操作,不能操作非静态成员变量。(因为static属性和方法是在编译(javac)时开辟的内存空间,而普通变量和方法是在运行(java)时才产生)
静态成员方法没有this引用;
在没有实例化对象时,可以通过类名访问静态成员方法。

静态方法不能直接操作非静态的属性和方法
加上static后,就可以操作了
package test;

class Dog {
  private static int count = 0;  //静态成员变量

  public Dog() {
    count++;
  }

  //显示数量的方法,静态成员方法
  public static void displayCount() {
    System.out.println("当前狗的数量是:" + count);
  }
}

public class Test {
  public static void main(String[] args) {
    //没有实例化对象之前,直接通过类名调用静态成员方法
    Dog.displayCount();
    Dog d1 = new Dog();
    Dog d2 = new Dog();
    Dog.displayCount();
  }
}

12、包

有时候,类和类的名称可能发生冲突;Java提供了把类名空间划分为更容易管理的块的机制,这就是包;包允许将类组合成较小的单元,类似于文件夹。

  • 有助于避免命名冲突,分属不同包的类即便名称相同也不会引起误会。
  • 能在包与包之间对于类的访问权限提供更有力的约束。

(1)缺省包

如果省略了package语句,类将保存在一个缺省的没有名称的包中;
尽管缺省包很方便,但对于大型的程序,它是不恰当的;
请尽量为自己编写的类定义具体的包。

(2)使用package关键字打包

可以使用package关键字将源文件中的类打入某个包中,语法是:

package 包名;

该语句必须是整个源文件的第一条语句。

package mypkg;      //将本源文件中的所有类打到mypkg包中

class Student {      //定义学生类
    ……
}

(3)使用import关键字导入包

如要使用到某个包中的类,就需要使用import关键字将包或类显式地包括到程序中。有如下两种情况:

/*导入java包下的io子包中的所有类*/
import java.io.*;

/*导入mypkg包下的Student类,但并不导入该包中的其它类*/
import mypkg.Student;
……

一个程序中允许有多条import语句,导入多个包或多个类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,629评论 0 11
  • 前一阵单位组织体检,我在狂灌十瓶农夫山泉后,静坐憋尿等着做B超。我喝水喝得快崩溃了,觉得自己已经开始变得浮肿,脸上...
    龍貓家的貓阅读 325评论 0 1
  • 标签 标签显示静态文本。 标签: 可以显示任意数量的静态文字 不支持直接的用户交互 可以由程序更新 可以夸越多行 ...
    糊君阅读 1,261评论 0 5
  • “众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。”几年前,刚接触到稼轩的这首词时,更多的是欣赏他用词用句的新...
    易简易安阅读 248评论 0 0