java基础学习05(面向对象基础01)
面向对象基础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)的更多相关文章
- java基础学习05(面向对象基础01--类实例分析)
		
面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...
 - java基础学习05(面向对象基础02)
		
面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...
 - Java学习 · 初识               面向对象基础一
		
面向对象基础 1.1面向过程与面向对象的区别 面向过程和面向对象二者都是思考问题的方式,再简单的事物时,可以线性思考时使用面向过程,但当事物较为复杂时,只能使用面向对象设计.但二者并不是对立的,在解决 ...
 - Python学习之面向对象基础
		
python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...
 - Java最新学习线路(基础,源码,项目,实战)
		
如需获取以下学习资源请关注公众号:Java编程指南 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么 ...
 - JavaSE学习笔记05面向对象编程01
		
面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...
 - java基础学习总结——面向对象2
		
一.JAVA类的定义
 - Java基础学习(三)—面向对象(上)
		
一.理解面向对象 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...
 - java基础学习总结——面向对象1
		
目录 一.面向过程的思想和面向对象的思想 二.简单理解面向对象 三.面向对象的设计思想 四.对象和类的概念 五.如何抽象出一个类? 六.类(对象)之间的关系 七.Java与面向对象 八.为什么使用面向 ...
 
随机推荐
- HTML中head头结构
			
HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结构 ...
 - 存储过程获取最后插入到数据表里面的ID
			
存储过程获取最后插入到数据表里面的ID SET NOCOUNT on;---不返回影响行数提高性能GOcreate proc [sp_bbs_thread_Insert] @id int output ...
 - 用Javascript获取页面元素的位置
			
制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置. 下面的教程总结了Javascript在网页定位方面的相关知识. 一.网页的大小和浏览器窗口的大小 首先,要明确两个基本概念. 一张网页的 ...
 - 【C++】递增递减操作符与指针的关系
			
可以将递增与递减操作符用于指针和基本变量,将递增操作符用于指针时,将把指针的值增加其指向的数据类型占用的字节数,这种规则适用于对指针递增和递减. int arr[5] = {21,32,23,45,3 ...
 - CSU 1328: 近似回文词
			
省赛的A题...现场都没什么人做...其实就一暴力水题......坑死了... 1328: 近似回文词 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1 ...
 - C++实现对lua访问的封装
			
这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数. 本来我想引进luabind,但luabind相对又过于复杂,并不是所 ...
 - 解决 Mac Pro 用 Excel 打开 CSV 文件不能正常显示的问题
			
在做系统后台的时候,往往会有导出系统信息(如,用户信息)功能,一般导出为CSV文件. 先前在 Windows 下,导出的CSV文件用 Excel 打开能正常显示,可现在在 Mac 系统中,显示一团乱, ...
 - MySQL监控系统MySQL MTOP的搭建(转VIII)
			
MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统.系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理.最重要是MySQL服务器无需安装任何Agent,只 ...
 - Javascript高级程序设计——面向对象之创建对象
			
对象创建方法: 工厂方法 构造函数模式 原型模式 组合构造函数和原型模式 寄生构造函数模式 问题构造函数模式 工厂模式: function Person(name, age){ var obj = n ...
 - VIM使用学习笔记 : 按键说明
			
VIM有三种模式: 一般模式 上下左右移动光标,删除字符或删除整行,复制粘贴 编辑模式 i I i O a A r R 进入编辑模式 命令模式 在一般模式种输入 : / ?,可 ...