面向对象基础01

1.理解面向对象的概念 
2.掌握类与对象的概念
3.掌握类的封装性
4.掌握类构造方法的使用

实现的目标

1.类与对象的关系、定义、使用 
2.对象的创建格式,可以创建多个对象
3.对象的内存分配过程

面向对象与面向过程

比如一个木匠要做一个盒子,那么这个盒子的出发点会有两种方式。
面向对象:先想好要做的盒子,之后再去找相应的工具去做好这个盒子。需要一系列完整的设计,同时取出所要用到的工具。
面向过程:不去想要做什么样的盒子,随需取用工具。

面向对象的三大特征:
封装(encapsulation)--对外部不可见
继承(inheritance)--扩展类的功能
多态(polymorphism)--方法的重载、对象的多态性

类与对象的关系

在面向对象中,类和对象是最基本、最重要的组成单元。类是相同特性和行为的对象集合。类可以理解某类事物的共性,对象就是一个具体的东西。

类的定义

class 类名称{
数据类型 属性 ;//声明成员变量(属性)
…. public 返回值的数据类型 方法名称(参数1,参数2…){//定义方法的内容
程序语句 ;
[return 表达式;]
}
}

对象的创建和使用

    类名 对象名 = null;  //声明对象
对象名称 =new 类名();//实例化对象
或
类名 对象名 = new 类名(); 访问属性:对象名称.属性名
访问方法:对象名称.方法名

定义一个Person类,包括名字、年龄、tell()。

/**
*1.定义一个Person类(未封装)
*/
class Person{
String name; //属性 名字
int age; //属性 年龄 public void tell(){
System.out.println("我的姓名叫:"+name+"今年"+age);
}
} class TestDemo01{
public static void main(String [] args){
Person per = new Person();//实例化对象
per.name = "张三";
per.age = 30;
per.tell();
}
} Process started >>>
我的姓名叫:张三,今年30
<<< Process finished. (Exit code 0)

对象的实例化是要划分堆和栈空间,分配内存如下图。所有的对象名称都在栈内存中保存,属性都保存在堆内存中,必须使用new关键字才能开辟堆内存空间。 

属性赋值完后的内存空间。


对象使用之前必须进行实例化,否则(Person per = null)将会现空指向异常(Exception in thread "main" java.lang.NullPointerException)

多个对象的创建及对象引用传递
类属于引用数据类型,引用数据类型就是指一段内存空间可以被多个栈内存指向。

/**
*1.对象引用传递(引用传递是将一个堆内存空间的使用权给多个栈内存空间,
* 每个栈内存空间都可以修改堆内存空间的内容)
*/ class Person{
String name; //属性 名字
int age; //属性 年龄 public void tell(){
System.out.println("我的姓名叫:"+name+",今年"+age);
}
} class TestDemo01{
public static void main(String [] args){
Person per1 = new Person();
Person per2 = new Person(); per1.name = "张三";
per1.age = 30; per2.name = "李四";
per2.age = 33;
per2 = per1; //将per1的引用传递给per2
System.out.println("per1对象的内容:");
per1.tell();
System.out.println("per2对象的内容:");
per2.tell();
}
} Process started >>>
per1对象的内容:
我的姓名叫:张三,今年30
per2对象的内容:
我的姓名叫:张三,今年30
<<< Process finished. (Exit code 0)

一个栈内存空间只能指向一个堆内存空间,如果要想再指向其它的堆内存空间,则必须先断开已有的指向才能分配新的空间。 关于垃圾空间的释放:java本身提供垃圾收集机制(Garbage Collection),会不定期的释放不用的内存空间,只要对象不使用了,就会等待GC释放空间。

封装性

什么叫封装性?就是对外部不可见。私有属性不能通过对象直接访问。只要是被封装的属性,则必须通过setter和getter方法取得。

为属性封装: private 属性类型 属性名称
为方法封装: private 方法返回值 方法名称(参数列表){}

1.在开发中,类中全部属性都必须封装,封装之后的属性必须通过getter和setter进行访问。
2.用private属性或方法只能在其类的内部被调用,而不能在类的外部被调用。

3.类中的方法直接写上方法名称就可以完成本类中的方法调用,若非要强调是本类中的方法,可使用this.方法名称()。


根据类图实现如下代码:

/**
*1.封装性(private)
*/ class Person{
private String name; //属性 名字
private int age; //属性 年龄 public void tell(){
System.out.println("我的姓名叫:"+this.getName()+",今年"+this.getAge());
} public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
if(age>0 && age<150){
this.age = age;
}
}
public int getAge(){
return this.age;
}
} class TestDemo01{
public static void main(String [] args){
Person per1 = new Person();
Person per2 = new Person(); per1.setName("张三");
per1.setAge(30);
per2.setName("李四");
per2.setAge(33);
System.out.print("未将per1的引用传递给per2对象的内容:");
per2.tell();
per2 = per1; //将per1的引用传递给per2
System.out.print("per1对象的内容:");
per1.tell();
System.out.print("将per1的引用传递给per2对象后的内容:");
per2.tell();
}
}

构造方法

在面向对象程序中构造方法的主要作用是为类中的属性初始化,通过构造方法可以在对象实例化时就直接把对象的值赋给属性。

构造方法的定义

class 类名称{
访问权限 类名称(类型1 参数1,类型2 参数2){
程序语句;
... // 构造方法没有返回值
}
}

构造方法声明牢记以下三点:
1.构造方法的名称必须与类名称一致 
2.构造方法的声明处不能有任何返回值类型的声明(void也不能写) 
3.不能在构造方法中使用return返回一个值

需要注意的是,调用new关键字实例化对象时(per = new Person())才会调用构造方法。只要是类就必须存在构造方法,在Java中如果一个类中没有明确声明一个构造方法,则在编译时会直接生成一个无参数的、什么都不做的构造方法。如果声明了一个构造方法,则程序在编译时不会再生成默认的构造方法。

/**
*1.构造方法(Constructor)
*/ class Person{
private String name; //属性 名字
private int age; //属性 年龄 public void tell(){
System.out.println("我的姓名叫:"+this.getName()+",今年"+this.getAge());
} public Person(){ } public Person(String name){
this.setName(name);
} public Person(String name,int age){ //定义构造方法为属性初始化
this.setName(name); //为name属性赋值
this.setAge(age); //为age属性赋值
} public void setName(String name){ //设置姓名
this.name = name;
}
public String getName(){ //取得姓名
return this.name;
}
public void setAge(int age){ //设置年龄
if(age>0 && age<150){
this.age = age;
}
}
public int getAge(){ //取得年龄
return this.age;
}
} class TestDemo01{
public static void main(String [] args){
Person per1 = new Person("张三",30);
Person per2 = new Person(); per2.setName("李四");
per2.setAge(33);
System.out.print("未将per1的引用传递给per2对象的内容:");
per2.tell();
per2 = per1; //将per1的引用传递给per2
System.out.print("per1对象的内容:");
per1.tell();
System.out.print("将per1的引用传递给per2对象后的内容:");
per2.tell();
}
}

匿名对象

匿名对象就是没有给出名字的对象。一般匿名对象只使用一次,而且匿名对象只在堆内存中开辟空间,而不存在栈内存引用。

class TestDemo01{
public static void main(String [] args){
new Person("张三",30); //匿名对象
}
}

java基础学习05(面向对象基础01)的更多相关文章

  1. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

  2. java基础学习05(面向对象基础02)

    面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...

  3. Java学习 · 初识 面向对象基础一

    面向对象基础 1.1面向过程与面向对象的区别 面向过程和面向对象二者都是思考问题的方式,再简单的事物时,可以线性思考时使用面向过程,但当事物较为复杂时,只能使用面向对象设计.但二者并不是对立的,在解决 ...

  4. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  5. Java最新学习线路(基础,源码,项目,实战)

    如需获取以下学习资源请关注公众号:Java编程指南 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么 ...

  6. JavaSE学习笔记05面向对象编程01

    面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...

  7. java基础学习总结——面向对象2

    一.JAVA类的定义

  8. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

  9. java基础学习总结——面向对象1

    目录 一.面向过程的思想和面向对象的思想 二.简单理解面向对象 三.面向对象的设计思想 四.对象和类的概念 五.如何抽象出一个类? 六.类(对象)之间的关系 七.Java与面向对象 八.为什么使用面向 ...

随机推荐

  1. POJ 1265 Area

    有一种定理,叫毕克定理....                             Area Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  2. 清除浮动(clearfix hack)

    eg:

  3. 牡丹江.2014B(图论,树的直径)

    B - Building Fire Stations Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%lld & ...

  4. codeblocks+Mingw 下配置开源c++单元测试工具 google test

    google test 是google的c++开源单元测试工具,chrome的开发团队就是使用它. Code::Blocks 12.11(MinGW 4.7.1) (Windows版)Google T ...

  5. MySQL Python教程(1)

    首先对于数据库的基本操作要有一定基础,其次了解Python的基础语法. 建议先阅读MysqL中文教程http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chap ...

  6. Linux学习:用yum安装php,httpd,mysql

    见鸟哥的linux私房菜电子版832页.

  7. 6. 终端工具Xmanager使用技巧

    1. 新建绘画使用终端连接服务器 2. 设置终端类型和编码 3. 设置终端外观,包括字体颜色等等 4. 设置默认上传路径和下载路径

  8. 实战Centos系统部署Codis集群服务

    导读 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可 ...

  9. windows程序是如何开始执行的??

    windows的资源管理器侦测到使用者执行了一个程序————>windows调用加载器加载该程序————>调用C start code——>C start code 调用WinMai ...

  10. PO、VO、DAO、BO、POJO

    一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择.二.VO :(value object) , ...