1. 类和对象

一切皆对象,这可以说是面向对象的核心思想了。

类,就是具有相同性质对象的抽象。 而类的每一个具体的实例就是一个对象。

我们可以定义一个Person类,这个Person类就是所有的人的抽象,而我们知道,每个人应该有名字(name),年龄(age)等属性,我们把这个抽象提取出来:

class Person
{
private String name;
private int age;
}

如果要获得一个人类的具体的实例(对象),我们可以使用new关键字:

// 定义一个Person变量
Person p;
// 调用构造器,返回一个Person实例(在堆内存中为对象开辟空间)
// 将该Person实例赋值给p变量
p = new Person();

可以直接写出: Person p = new Person();

2. 类的成员

类中应该有哪些东西呢?我们可以思考,人类应该拥有的东西:名字,年龄...... 这些被称为属性,当然,人还应该拥有通用的一些动作行为,比如说话,吃饭,睡觉等等,这些行为动作就是方法。

所以比较完整的类可以如下定义:

class Person
{
// 属性
private String name;
private int age; // 方法
private void say(){} private void sleep(){}
}

当然,除此之外,类的成员还有: 构造器,内部类。

3. 通过对象访问属性

对象是类的实例,所以说,对象拥有访问类中所有东西(属性、方法)的权利,访问方式: 对象.属性 、 对象.方法;

此外,如果类中的成员使用了static修饰(即类成员),则可以直接通过类名.属性/方法 进行访问。

4. this

This作为对象的默认引用有两种情形:

1)构造器中引用该构造器正在初始化的对象

2)方法里引用调用方法的对象。

对1)的理解:

构造器的作用是什么呢,说白了,就是为了初始化属性数据的;所以,我们一般利用构造器,传入相关的属性数据,为要初始化的对象的属性赋初始值。

public Person(String name,int age){
this.name = name;
this.age = age;
}

构造器中,我们使用this关键字,表示正在初始化的对象。this.name = name;的意思就是正在初始化对象的name属性为传递过来的name值。

对2)的理解:

说白了就是在调用方法的过程中,如果哪个对象调用了该方法,则该方法里的this表示该对象。

// 方法
private void say(){
this.sleep(); 此处的this就表示正在调用say()方法的对象。该对象继续调用sleep()方法
} private void sleep(){
System.out.println("this 调用sleep方法 ");
}

5. 方法

1)关于方法,有实例方法和类方法之分,这个要看有没有使用static修饰。

2)含有参数的方法在调用过程中使用的值传递方式,传递的是原有值的复制的值或者是引用。

3)参数可变的方法private void listBooks(String... books ){}

对于参数可变的方法,我们可以通过foreach循环获取里面的值:

private void listBooks(String... books ){
for(String book:books){
System.out.println(book);
}
}

4)方法的递归。

public static int fn(int n)
{
if (n == 0)
{
return 1;
}
else if (n == 1)
{
return 4;
}
else
{
//方法中调用它自身,就是方法递归
return 2 * fn(n - 1) + fn(n - 2);
}
}
public static void main(String[] args)
{
//输出fn(10)的结果
System.out.println(fn(10));
}

5)方法重载

方法重载发生在同一个类里,要求是在类里定义了名字相同的方法,但是要求方法的参数列表不同。至于其它的部分,返回值类型和限定修饰符,与重载没有关系。

public void test(){
System.out.println("无参数");
}
public void test(String msg){
System.out.println("重载的方法,参数:"+msg);
}

6. 成员变量和局部变量

成员变量分为实例变量和类变量,区别在于是否使用static修饰;其中使用static修饰的变量为类变量,可以使用类名直接访问。

局部变量是指形参、方法局部变量、代码块中的局部变量。

7. 变量的初始化时机

成员变量的初始化时机: 当系统加载类或者为该类创建实例时,系统会自动为该成员变量分配内存空间,并在分配内存后,自动为成员变量指定初始值。

加载类时,为类变量指定初始值; 创建类的实例时,为成员变量指定初始值。

// 类属性
public static int eyeNum;
// 实例属性
public String name; public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person(); p1.name = "张三";
p2.name = "李四"; p1.eyeNum =2;
p2.eyeNum =3;
}

对于上面一段代码,如果该Person类是第一次加载进JVM的时候(该类只要使用了也就被加载了),则会先初始化该Person类的eyeNum属性,为该属性分配空间,赋初始值0;

接下来,创建了类的实例p1和p2,这个时候,系统会为该实例的属性进行初始化赋值,因为name属性是属于实例的,所以p1的name和p2的name不是一回事(不在同一个内存里哦)。

可以通过对象去访问类属性,但是,因为类属性是属于类的,所以即使是不同的实例,操作的依然是同一个类属性。

局部变量的初始化时机:局部变量必须经过显示初始化才能使用,系统并不会为局部变量执行初始化。局部变量的值存储在方法栈中,栈内存中的变量无需系统垃圾回收,往往随着方法和代码块的运行结束而结束。

理解java面向对象基础的更多相关文章

  1. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  2. 【重走Android之路】【Java面向对象基础(一)】数据类型与运算符

    [重走Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符   1.数据类型介绍 在Java中,数据类型分为两种:基本数据类型和引用类型. 基本数据类型共8种,见下表: 基本数 ...

  3. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  4. 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用

    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...

  5. 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字

    084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...

  6. 083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法

    083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法 本文知识点:构造方法-带参构造方法 说明:因为时间紧张, ...

  7. 082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法

    082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法 本文知识点:构造方法-无参构造方法 说明:因为时间紧张, ...

  8. 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字

    081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...

  9. 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则

    080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...

随机推荐

  1. 全球城市群Megalopolis

    Megalopolis From Wikipedia, the free encyclopedia   (Redirected from Megalopolis (city type))   &quo ...

  2. python学习笔记09--线程、进程

    本节内容 一.进程与线程的概念 1.1进程 1.2线程 1.3进程与线程的区别 二.线程 2.1启一个线程 2.2线程的2种调用方式 2.3 join 2.4 守护线程Daemon 2.5线程锁 2. ...

  3. Eclipse创建jsp web项目

    Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插件集,包括Java开 ...

  4. ajax多图片上传demo

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  5. 2018-8-15-WPF-插拔触摸设备触摸失效

    title author date CreateTime categories WPF 插拔触摸设备触摸失效 lindexi 2018-08-15 08:12:47 +0800 2018-08-09 ...

  6. 洛谷P1681 最大正方形II

    P1681 最大正方形II 题目背景 忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到 了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上 ...

  7. IE下的双外边距浮动bug

    最常见且最容易发现的额一个bug是IE 6和最低版本中的双外边距浮动bug.这个bug是任何浮动元素上的外边距加倍. 上面代码中,div盒子向左边浮动,设置的margin-left的值是10px.在c ...

  8. bzoj1834 网络扩容

    Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...

  9. 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列

    题目描述 YJC最近在学习字符串的有关知识.今天,他遇到了这么一个概念:最长公共回文子序列.一个序列S,如果S是回文的且分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  10. git push的时候每次都要输入用户名和密码的问题解决

    换了个ssh key,发现每次git push origin master的时候都要输入用户名和密码 原因是在添加远程库的时候使用了https的方式..所以每次都要用https的方式push到远程库 ...