面向对象、类与对象及其特性

目录:
1、 面向对象的基本概念
2、面向对象的三个特征
3、类与对象的关系
4、类的定义
5、对象的声明及使用

6、Java中内存的划分
7、类的引用传递
8、垃圾的产生

9、封装的产生目的
10、封装的实现
11、setter和getter方法


12、构造方法的概念及调用时机
 13、构造方法的重载
14、匿名对象的使用

1、面向对象的基本概念:万事万物皆为对象,在程序里面,主张一切都是对象,以人的思维方式去解决程序问题。
举例:假如你要做一辆车
面向过程:你需要什么去拿什么,设计一步做一步;
面向对象:先把要做的车设计好,然后开始组装。
2、面向对象的三大特征
1、封装-对外部的访问不可见
2、继承-扩展类的功能
3、多态-方法的重载和对象的多态性

3、类与对象
类:是一个抽象的、概念性的,表示一个物体的特性和行为。
4、对象:实实在在存在的事物,必须由类实例化得到
比如: 类像一张设计图,设计好这个物体的属性和行为方式、实例化就是根据设计图设计出物体,
比如一个描述人的一个类,实例化之后就变成了一个实实在在的人,比如张三 或者 王五
类:class
5、对象: 类的实例化变成对象
声明:Person per = null;
实例化: per = new Person();

调用对象的属性和方法
对象.属性 对象.方法
/**
* 对象的类
* 设计一个人的类
* 属性、方法
* @author Cao_Ye
*
*/
publicclassPerson{
Stringname;
Stringsex;
intage;
String address;
publicvoid eat(String food){
System.out.println(“吃”+food);
}
publicvoidfun(Stringlovename){
System.out.println(“爱:”+lovename);
}
publicStringtoString(){
return “name: “+name+” sex: “+sex+” age: “+age+” address: “+address;
}
}
publicclassMainDemo01{
publicstaticvoidmain(String[]args){
//类的实例化就是对象
Personper=newPerson();
//怎么使用对象
//调用类里面的属性 可以赋值 或者使用
per.name=”a”;
Strings=per.name;
System.out.println(“名字: “+per.name);
System.out.println(“名字: “+s);

  //调用方法
  per.eat("苹果");
  System.out.println(per.toString());

}
}

类: 第一层次:类名 第二层次:属性 第三层次:方法及方法里面的语句

对象内存分析
publicclassMainDemo2{
publicstaticvoidmain(String[]args){
//类的实例化就是对象
Personper1=newPerson();
per1.name=”a”;
per1.age=28;

  Personper2=newPerson();
  per2.name="b";
  per2.age=21;

}
}
栈里面方法的是对,是堆的使用权。如图对象的引用地址指向堆里面的数据
publicclassMainDemo2{
publicstaticvoidmain(String[]args){
//类的实例化就是对象
Personper1=newPerson();
per1.name=”a”;
per1.age=28;

  Personper2=newPerson();
  per2.name="b";
  per2.age=21;

  System.out.println(per1.toString());
  System.out.println(per2.toString());

  per2=per1;

  System.out.println(per1.toString());
  System.out.println(per2.toString());

}
}

结果:
name: a sex: null age: 28 address: null
name: b sex: null age: 21 address: null
name: a sex: null age: 28 address: null
name: a sex: null age: 28 address: null
分析得知,per2获得了per1的引用地址,抛弃了原有自己的,所以这个时候,堆数据1使有两个引用对象的,推数据2没有引用,就会等待垃圾回收。
per1 = null,这个时候堆数据1会不会变成垃圾呢?
肯定不会的,因为还有per2的数据是指向堆数据1的。

得出结论: 对象是存在栈里面的,对象的属性是存在堆里面,方法存哪呢?

方法存全局代码区。
9、封装的产生目的
publicclassMainDemo03{
publicstaticvoidmain(String[]args){
Personper=newPerson();
per.age=-20;
}
}
从代码我们可以看出,如果直接操作一个对象的属性,我们不能避免这个数据的安全性和合理性,虽然代码本身没有错误,但是不符合实际情况。
从而引申出,属性必须封装起来,不能直接让外部直接访问对象。
10、封装的实现
1、对属性私有化
private int age;
//per.age = 20; //对属性私有化了之后 不能直接操作属性 private权限只能在本类中使用。
2、对外使用方法操作属性
/**
* @author Cao_Ye
*封装的实现 属性私有化 对外提供setter getter方法
*/
publicclassPerson{
privateStringname;
privateStringsex;
privateintage;
privateString address;
//通过方法操作属性 获取这个属性的方法 和 设置这个属性值的方法
//写方法的时候有一些规范
/*
*获得年龄
*/
publicintgetAge(){
returnthis.age;//this 代表当前对象
}

/*
 * 设置年龄
 */
publicvoidsetAge(intage){

// age = age;
// this.age = age;
//因为年龄需要做限制
if(age>0&&age<149){
this.age=age;
}else{
this.age=1;
}
}

publicStringtoString(){
   return  "name: "+name+" sex: "+sex+" age: "+age+" address: "+address;
}

}

11、setter和getter方法

//快捷生成set、get方法 右键-Source-Generater-setterandgetter
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}

使用封装的属性
Personper=newPerson();
//per.age = 20; //对属性私有化了之后 不能直接操作属性 private权限只能在本类中使用
//对年龄进行赋值
per.setAge(26);
//获得年龄的值
System.out.println(per.getAge());

12、构造方法的概念及调用时机
构造方法在类中定义,方法名和类名相同,没有返回值类型
作用:给对象的属性初始化(第一次赋值)
public 类名(参数列表){
//语句
}
在哪调用的?
对象实例化的时候调用

类名称 对象名 = new 类名称() 这个“()”就是调用的构造方法。
可以看出 对象实例化 一定会调用构造方法。
一个类里面至少会有一个构造方法,如果类里面没有看到构造方法,就会有一个默认隐藏的无参构造方法。
如果类里面有构造方法,那隐藏的无参构造方法就会消失(没有效果)。
publicclassPerson{
privateStringname;
privateStringsex;
privateintage;
privateString address;
//有参数的构造方法
publicPerson(Stringname){
this.name=name;
System.out.println(“Person的有参构造”);
}
//无参数的构造方法
publicPerson(){
System.out.println(“Person的无参构造”);
}
publicPerson(Stringname,Stringsex,intage,Stringaddress){
this.name=name;
this.sex=sex;
this.age=age;
this.address=address;
}

}
13、构造方法的重载
构造方法重载-参数列表不同就是构造方法的重载
//重载的构造方法
构造方法里面可以调用构造方法吗?
//无参数的构造方法
publicPerson(){
this(“person”);//使用this关键字来调用本类的构造方法
System.out.println(“Person的无参构造”);
}
构造方法之间的调用注意细则:
1、自己不要调用自己(死循环)
2、使用this(参数值)调用,并且写在构造器的第一行
3、相互调用时也必须留一个出口(不然也是死循环),而且语法不允许
4、使用this调用构造方法必须在构造方法里面调用
14、匿名对象的使用
//匿名对象 没有名字的对象 如果这个对象你只使用一次,那么你可以写成匿名对象
//使用完就会被垃圾等待回收
//以下是两个不同的对象
Stringname=newPerson(“person”).getName();
Stringinfo=newPerson(“aaaa”).toString();
System.out.println(name+” “+info);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值