Java基础——面向对象+(匿名)对象+封装(修饰符权限)+变量+构造函数+This关键字

来源:互联网 发布:搜狗推广账户怎么优化 编辑:程序博客网 时间:2024/05/17 00:57


1.   面向对象

面向对象与面向过程的不同

面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用。强调的是功能行为。

例子:大象放冰箱;买电脑面向对象(自己去买转变为叫人-对象,帮助买);公司招人,自己做项目,时间长,面向过程。指挥别人-对象做,用员工对象的功能来完成项目;到什么场景举什么例子;从自己执行动作变为指挥对象去做。

面向对象的特点

是一种符合人们思考习惯的思想

可以将复杂的事情简单化

将程序员从执行者转换成了指挥者

完成需求时:

•先要去找具有所需的功能的对象来用。

•如果该对象不存在,那么创建一个具有所需功能的对象。

•这样简化开发并提高复用。

面向对象三个特征

封装,继承,多态;

2.   类

现实生活中一类事物的描述(class定义的类),是抽取出共性的内容,对具体的抽象;

在一个程序中可以有N个内部类,只有一个公共类,每个内部类都可以有主函数,只要一个入口(主函数)就可以;

子类只能继承父类中的非私有属性和函数;

3.   对象

就是这类事物(万物皆对象),实实在在存在的个体,是new出来的一个实体,在堆内存中。是类的实例化;

定义类就是在描述事物,就是在定义属性和行为。属性和行为是类的成员(成员变量和成员方法)

new car():产生一对象;

car c = new car();c为类类型变量,也是new出的对象的名字,类类型变量指向对象;

成员变量:在堆内存中,因为对象的存在而存在。

局部变量:在栈内存中

4.   匿名对象

new People().name="张三";相当于:People p=new Peolple();p.name=”张三

使用方式1:当对对象的方法(非属性)只调用一次时,比较简化(局限性);

使用方式2:匿名对象可作为实际参数进行传递

 

5.   匿名对象,有名对象区别

 匿名对象创建完执行下一条语句前就销毁了,即是无意义的调用属性,用在只调用对象的方法,一次时,比较简化(调用属性一般是没意义的),有名对象进行多个成员(属性,行为)调用

 匿名对象可作为实际参数进行传递。

 

6.   封装

隐藏对象的属性和实现细节,仅对外提供公共访问方式;

 

好处:将变化隔离;

           便于使用;

           提高重用性;

           提高安全性;

 

封装原则:

将不需要对外提供的内容隐藏起来;

把属性全隐藏,提供公共方法对其访问;

 

私有修饰符修饰的属性只能用于本类;为了能够在其他类中访问,可以设置一个方法,并将值赋给私有属性,起到访问私有属性的作用,即是常见的set方法;

 

一个成员变量对应两个访问方式(setget方法)

属性的私有化是为了不被外直接访问,提供访问的方法可以控制传输的数据    

私有仅仅是封装的一种表现形式;封装不是私有;

 

私有成员变量之所以要提供访问方式,是因为可以再访问方式中加入逻辑判断等语句;对访问的数据进行操作,提高代码的健壮性;

 

Void是一种返回值类型,代表没有具体结果返回

 

例如:

public class Text6 {  private String  s1="我是私有成员变量";//私有成员变量   public void setS1(String s1)//私有成员变量的访问方式set方法           {                   this.s1 = s1;           }  public String getS1()//私有成员变量的访问方式get方法           {                   return s1;           }  static void show(){  //在外部类的静态方法中,因为没有this,所以必须先获得外部类引用,然后创建非静态内部类。      Text6 t2=new Text6();      nClass n=t2.new nClass();      n.display();//在外部类函数中调用内部类函数。  }       //内部类  class nClass{      public void display(){          Text6 t1=new Text6();         String s2="我是内部类属性";         t1.setS1(s2);//在内部类函数中访问外部成员变量,并调用外部函数。         System.out.println(t1.getS1());      }  }  public static void main(String[] args) {      Text6 t3=new Text6();     t3.show();     }   }  


 

7.   变量

成员变量和局部变量:

成员变量创建好后,在堆内存,可以不用初始化,有默认值,直接使用;

局部变量创建好后,在栈内存,无默认值,不初始化就不能参与运算;方法运行时,在栈内存中;

 

People p=null;p在栈内存(变量)p=new People();NEW对象赋值给P,此时在堆内存;

 

java中为什么在主函数中创建外部类对象可以,创建内部类对象就失败了呢?

1:非静态内部类,必须有一个外部类的引用才能创建。People p=new People(); Man man=p.new Man();

 2:在外部类的非静态方法中,因为有隐含的外部类引用this,所以可以直接创建非静态内部类。

3:在外部类的静态方法中,因为没有this,所以必须先获得外部类引用,然后创建非静态内部类。

4:静态内部类,不需要外部类引用就可以直接创建。

5:同时静态的内部类,也不能直接访问外部类的非静态方法。

6:由此可以推测,非静态内部类之所以可以直接访问外部类的方法,是因为创建非静态内部类时,有一个隐含的外部类引用被传递进来。

 

常见问题

内部类访问外部类的局部变量,应把外部类的局部变量用final修饰

内部类访问外部类的成员变量,应外部类名.this.成员变量;

 

8.   构造函数

当一个类中,没有定义构造函数时,默认给该类加入一个空参数的构造函数;当构造函数定义了,就不在使用默认空的构造函数.设此时类中只有一个构造方法:Person (String name){this.name=name}

当创建一个对象:Person p=new Person();编译时便会出错;

应该:Person p=new Person(“aaa”);

NEW出对象时,就会调用与之对应的构造函数。

一个类可以有多个不同的构造函数,使得不同的对象有不同的初始化值;

构造函数不需要返回值类型

特点:

1. 函数名与类名相同

2. 不用定义返回值类型

3.不可以写return语句

作用:

给对象进行初始化。

注意:

1. 默认构造函数的特点。

2. 多个构造函数是以重载的形式存在的。

构造函数与一般函数的不同:

写法上不同;

运行上不同;

构造函数是在对象建立后就运行,给对象初始化;不带参数的匿名对象首先运行空构造函数;

一般方法是对象调用才执行,是给对象添加对象具备的功能;

一个对象建立,构造函数只运行一次,一般函数可以被该对象调用多次;

 

构造函数,构造代码块的区别:

 构造代码块是给所有对象初始化,一建立就运行,优先于构造函数;--格式:

构造函数是初始化对应的对象

使用:所有不同对象的共性内容,初始化方式可以定义在构造代码块中;

ew People().name="张三"

当所有构造函数都私有化时,是不可能建立对象的,因为对象都无法初始化动作;

9.   This关键字

案例:

class Person{    private String name;    privateintage;    Person(int age)//局部变量时age,成员变量也是age    {       this.age = age;//这里用this表示调用构造方法的对象    }    Person(String name)    {       this.name = name;    }    Person(String name,int age)    {       this(name);//this.name = name;       this.age = age;    }     publicvoid speak()    {       System.out.println("name="+name+"...age="+age);       show();    }    publicvoid show()    {       System.out.println(this.name);    }} class Test{    publicstaticvoid main(String args[])    {       Person p1 = new Person(20);       Person p2 = new Person("张三");       Person p13 = new Person("李四",21);     }}


 

以上程序综合了构造函数和this的用法。看上去,是用于区分局部变量与成员变量同名情况。

1.         This代表它所在函数所属对象的引用;既哪个对象调用this所在函数,this就代表哪个对象。

this的应用:

当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。

但凡本类功能内部使用到了本类对象,都用this表示。

 

2.         构造函数之间的调用只能用this关键字(语句)

This语句只能放在构造函数的第一行;因为初始化动作要先执行

 

this的两种用法:

1、用于区分同名变量的情况,说的成员和局部同名的时候;

2、用于构造函数间调用。

注:一般函数不能直接调用构造函数,因为this语句不能用在一般函数中,只能用在构造函数间。

0 0