黑马程序员_java基础学习笔记04_面向对象

------- android培训java培训、期待与您交流! ----------



一 面向对象与面向过程

面向过程要求对于每个步骤都亲自参与实现,编程思想就是面向过程,主要编程语言就是C语言.而面向对象是相对于面向过程的,每个功能的实现不需要亲自参与,可以将需要的功能进行封装,然后根据对象来调用每种不同的方法,将复杂的事情简单化,从面向过程的执行者转变为指挥者,这样更贴合实际生活.
例如: 洗衣服
  如果自己去洗,自己参与,等同于面向过程
  但是洗衣服可以看作是一个功能,洗衣机也具有这样的功能,完全可以创建洗衣机对象,让它来帮助完成这个功   能
  class 洗衣机{
     干净的衣服 洗衣服(脏衣服,水,洗衣液){
洗衣
漂洗
脱水
烘干
return 干净的衣服
     }
  }
  使用洗衣机的功能,创建洗衣机
  new 洗衣机 . 洗衣服(衣服,清水,蓝月亮)
面向对象的前提是抽象.抽象就是将现实世界中的所有事物的属性和功能抽取出来,找出共性形成基类,用来描述一类事物,是概念上的定义。真正的事物即对象是抽象的具体化,再加入自身特性的东西。对象就是该类事物的实实在在存在的个体。
世界万物皆对象.

二 面向对象的三大特征;封装,继承和多态

  封装:隐藏对象的属性和实现细节,仅对外提供公共的访问方式,这个过程叫做封装.好处在于隐藏实现细节,提供公共的访问方式,提高了代码的复用性,提高安全性。封装的原则就是:将不需要对外提供的内容都隐藏起来;把属性隐藏,提供公共方法对其访问。

 继承:当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员.集成的好处在于:提高了代码的复用性,多个类相同的成员可以放到同一个类中;提高了代码的维护性,如果功能的代码需要修改,修改一处即可.继承使类与类之间产生了关系,是多态的前提.类的耦合性很强是继承的一个弊端.通过extends关键字可以实现类与类的继承.

格式为: class 子类名 extends 父类名 {} 
多态:指某一个事物,在不同时刻表现出来的不同状态。多态前提和体现:有继承关系,有方法重写,有父类引用指向子类对象.多态的好处:提高了程序的维护性(由继承保证);提高了程序的扩展性(由多态保证).多态的弊端:不能访问子类特有功能.解决方法即为多态中的向上和向下转型.

三 类和对象

1类 对现实世界中事物的描述(成员变量和方法)
2. 对象 现实世界中实际存在具体的个体
3. 对象的使用以及内存图 new
class Person {
String name;
public void method1(){}
public void method2(){}
}

四 局部变量和成员变量

(1)作用范围 
局部变量:方法内public void method(String name) {}
成员变量:类中,对整个类有效{成员变量分为两种一种静态的,一种非静态的}
(2)存储空间
局部变量:栈内存
成员变量:堆内存{静态的成员变量在方法区,非静态的在对象中在堆内存中}
(3)初始化值
局部变量:在使用前必须手动给值
成员变量:jvm默认初始化值。int 0 byte 0 short 0 long 0 double 0.0 boolean false char '\u0000'
class Person {
int num = 10;
public void method(){
int num = 20 ;
System.out.println(num);
}
}

五 匿名对象的使用

(1)当对对象中的功能只执行一次的时候使用。否则,请你使用有名字的对象。
Person p = new Person();
p.show();
p.show();
//p.print();
new Person().show();
new Person().show();
//new Person().print();
method(new Person());
(2)用于作为实际参数进行传递。
Person p = new Person();
method(p);
method(new Person());
public static void method(Person p){}
(3)直接用new语句声明一个具体对象而不给它起名字,这时就是匿名对象。它的使用情况有两种:当对象方法仅进行一次调用的时候;匿名对象可以作为实际参数进行传递。

六 封装

(1)封装的好处:便于重复使用,安全性高。
(2)private权限修饰符
class Demo{
private int age;//把属性私有对外提供公共的访问方法,可控性提高了
public void setAge(int age){//age = -20;
if(age>0 && age<=200){
this.age = age;
}
else {
System.out.println("请回火星");
}
}
public int getAge(){
return age;
}
/*
设置是setXxx要传参数
获取是getXxx要返回值类型,返回值类型和属性一致
*/
}
class DemoTest{
public static void main(String[] args) {
Demo d = new Demo();
d.setAge(-20);
System.out.println(d.getAge());
}
}

七 构造函数

class Person{
int age;
Person(int age){}
}
(1)用途:用于给对象中属性进行初始化。
A:格式类名(){code}Person(){}
B:Person(){}public Person(){}
(2)特点 你不定义空参数的构造函数,系统会自动给一个空参构造,你定义了构造函数无论是有参还空参的,
系统就不再给空参数的了。
(3)重载构造函数,是根据参数列表来区分是哪个构造函数
A:Person(){}//Person p = new Person();
B:Person(int age,String name){}
C:Person(int age){}
D:Person(String name,int age){}
class Person{
     int age;
     String name;
     Person(){}
     Person(String name,int age) {
        this.name = name;
        this.age = age;
     }
        public void speak(){
           System.out.println(age + "....." + name);
        }
     }
class Demo{
      public static void main(String[] args) {
          Person p1 = new Person("zhangsan",20);
          Person p2 = new Person();
          p1.speak();
      }
}

八 this关键字

(1)代表当前对象的引用。使用的时候,谁调用方法,this就代表谁。
(2)什么时候使用this呢?
A:当局部变量和成员变量重名的时候,可以用this进行区分。
B:this调用成员方法
C:构造函数中使用this
**this() 必须放在第一行。
同下面的道理:
Person(String name){
this.name = name;
}
Person(String name,int age){
this("张三");
this.name = name;
this.age = age;
}
Person p = new Person("lisi",20);

内存结构

栈内存:用于存储局部变量,当数据使用完,所占用的空间会自动释放。

堆内存:数组和对象,通过new建立的示例都存放在堆内存中.每个实体(用来存储数据的对象)都有内存地址值。实体中的变量都有默认的初始化值。实体不再被使用时,会在不确定的时间内被GC(垃圾回收器)回收。

方法区: 本地方法区,寄存器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值