------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一面向对象的概念:
1面向对象:是基于面向过程的一种思想。面向对象:将功能封装进对象,强调具备了功能的对象。
2面向对象特点:
1,面向对象就是一种常见的思想。符合人们的思考习惯。
2,面向对象的出现,将复杂的问题简单化。
3,面向对象的出现,让曾经在过程中的执行者,变成了对象中的指挥者。
二面向对象有三个特征:封装,继承,多态
1以后的开发过程:其实就是找对象用。没有对象,就创建一个对象。找对象,建立对象,使用对象,并维护对象的关系。
类和对象的关系:
类:就是对现实生活中事物的描述。
对象:就是这类事物,实实在在存在的个体。
想要描述:提取对象中共性内容。对具体的抽象。 映射到Java中描述就是class定义的类。 具体对象就是对应Java在堆内存中用new建立实体。
需求:描述小汽车。描述事物其实就是在描述事情的属性和行为。
分析:
1,属性:轮胎数。颜色。
2,行为: 运行。
<span style="font-family:SimSun;font-size:14px;">class Object1
{
public static void main(String[] args)
{
//建立汽车对象
Car c=new Car();
//重新设置汽车的属性
c.color="blue";
//调用汽车的run()方法;
c.run();
}
}
class Car
{
//定义汽车的颜色
String color="红色";
//定义汽车的车轮数
int num=4;
//定义汽车运行的方法
public void run()
{
System.out.println(color+"...."+num);
}
}</span>
三成员变量和局部变量:
1, 成员变量定义在类中,作用于整个类中。1局部变量定义在函数,语句,局部代码块中,只在所属的大括号区域有效。
2成员变量存在于堆内存的对象中。 局部变量存在于栈内存的方法中。
3成员变量随着对象的创建而存在,随着对象的消失而消失。 局部变量随着所属区域的执行而存在,随着所属区域的结束而释放。
4 成员变量都有默认初始化值。 局部变量没有默认初始化值。
匿名对象,没有名字的对象 。new Car();//匿名对象。其实就是对象的简写格式。
1, 当对象对方法仅进行一次调用的时候,就可以简化成匿名对象。
new Car().run();
注意:调用匿名对象的属性是没有意义。 如new Car().color="blue";
2, 匿名对象可以作为实际参数进行传递。
<span style="font-family:SimSun;font-size:14px;">public static void main(String[] args)
{
show(new Car());
}
public static void show(Car c)
{
//重新设置汽车的属性
c.color="blue";
//调用汽车的run()方法;
c.run();
}</span>
四封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装好处: 1.将变化隔离; 2.便于使用。 3.提高重用性。 4.提高安全性。
封装原则:
将不需要对外提供的内容都隐藏起来。 把属性都隐藏,提供公共方法对其访问。
private:关键字
A:用于修饰成员变量和成员方法。
B:被修饰的内容在其他类中是不可以被访问的。
注意:私有仅仅是封装的一种体现而已。
<span style="font-family:SimSun;font-size:14px;">class Object1
{
public static void main(String[] args)
{
//创建对象
Person p=new Person();
p.setAge(20);
p.speak();
}
}
class Person
{
private int age;
private String name;
public void setAge(int a)
{
//设置年龄
if(a>0&&a<130)
{
age=a;
}
else
System.out.println("输入非法");
}
public int getAge()
{
return age;
}
public void speak()
{
System.out.println(name+"..."age);
}
}</span>
五构造函数特点:
1函数名与类名相同2不用定义返回值类型
3没有具体的返回值。
构造函数:构建创造对象时调用的函数。
构造函数作用:给对象进行初始化。
创建对象都必须要通过构造函数初始化。
个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。
如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有了。
注意:
1. 默认构造函数的特点。
2. 多个构造函数是以重载的形式在在的。
一般函数和构造函数什么区别呢?
构造函数:对象创建时,就会调用与之对应的构造函数,给对象进行默认初始化。
一般函数:对象创建后,需要函数功能时才调用。(函数只有被调用才执行)
构造函数:对象创建时,只调用一次。
一般函数:对象创建后,可以被调用多次。
什么时候定义构造函数呢?
在描述事物时,该事物已存在就具备一些内容,这些内容都定义在构造函数中。 构造函数可以有多个,用于对不同的对象进行针对性的初始化。 多个构造函数在类中是以重载的形式来体现的。 造函数的小细节: 当一个类中没有定义构造函数时,系统会默认给该类加入一个空参数的构造函数Person(){} 当在类中自定义了构造函数后,默认的构造函数就没有了
<span style="font-family:SimSun;font-size:14px;">class Object1
{
public static void main(String[] args)
{
//创建空参数对象
Person p2=new Person();
//创建带参数对象
Person p=new Person("zhangshan",20);
}
}
class Person
{
private int age;
private String name;
Person()
{
System.out.println("nihao");
}
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(name+"..."age);
}
}</span>
六this:关键字
特点: this代表其所在函数所属对象的引用。
换言之:this代本类对象的引用。什么时候使用this关键字呢?
当在函数内需要用到调用该函数的对象时,就用this。
当成员变量和局部变量重名,可以用关键字this来区分。
this:代表对象。代表哪个对象呢?当前对象。
this:就是所在函数所属对象的引用。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象。
构造代码块
构造函数块作用:给所有对象进行初始化。
对象一建立就运行,而且优先于构造函数执行和构造函数的区别:
构造代码块是给所有对象进行统一初始化。
而构造函数是给对应的对象进行初始化。
构造代码块中定义的是不同对象共性的初始化内容。
总结:构造代码块和构造函数共性的地方就是当对象创建时,就给对象进行初始化一次。
class Person{
{
System.out.println("nihao");
}
static关键字
用于修饰成员(成员变量和成员函数)
修饰后的成员具备以下特点:
1.随着类的加载而加载
2.优先于对象存在
3.被所有对象所共享
4.可以直接被类名调用
七static特点:
1,static是一个修饰符,用于修饰成员。(成员函数,成员变量)2,static修饰的成员被所有的对象所共享。
3,static优先于对象存在,因为static的成员随着类的加载就已经存在了。
4,static修饰的成员多了一种调用方式,可以直接被类名调用。类名.静态成员。
5,static修饰的数据是共享数据,对象中存储的是特有数据。
八成员变量和静态变量的区别?
1, 两个变量的生命周期不同。成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
2, 调用方式不同。
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名.调用。
3, 别名不同。
成员变量也称为实例变量。
静态变量称为类变量。
4, 数据存储位置不同。
成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
1什么时候该用static呢?
如果某个内容是所有对象共享的,就用静态修饰。
2什么时候使用静态成员和函数呢?
要从两方面下手:因为静态修饰的内容有成员变量和函数
3什么时候定义静态变量(类变量)呢?
当对象中出现可共享的数据时,该数据被静态修饰。 对象中的特有数据要定义成非静态存在于堆内存中。
4什么时候定义静态函数呢?
当功能内部没有访问到非静态数据,或者对象的特有数据,
那么该功能可以定义成静态的
使用注意
1.静态方法可能访问静态成员类名.静态成员。
2.静态方法中不可以写this,super关键字,因为静态先于对象操作
静态有利有弊
利处:
对对象共享的数据进行单独空间的存储,没有必要每个对象都存一份
可以被直接被类名.调用
弊端:生命周期过长,访问出现局限性(静态虽好,只能访问静态)
3.主函数是静态的
public static void main(String[] args)
主函数特殊之处:
1, 格式是固定的。(除了args这个数组名字可以变,其他不行)
2, 被Jvm所识别和调用。
public:因为权限必须是最大的。
static:不需要对象的,直接用主函数所属类名调用即可。
void:主函数没有具体的返回值。(因为返一个值给虚拟机,虚拟机也害怕啊!是不是虚拟机没有内存存放)
main:函数名,不是关键字,只是一个Jvm识别的固定的名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。
九静态代码块:
格式:static{
静态代码块中的执行语句
}
特点:随着类的加载而执行,只执行一次,并优先于主函数
对象初始化的顺序:
静态代码块——>静态主函数——>构造代码块——>构造函数
例子:
classTest{
static{
System.out.println("Static Code");
}
十对Person p = new Person("Xcc",19); 执行顺序分析
这句话都做了什么?1,因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化
3,在堆内存中开辟空间,分配内存地址
4。在堆内存中建立对象的特有属性,并进行默认初始化(name=null age=0 country=null)
5。对属性进行显示初始化(也就是属性初始化,如果没有赋值就是默认初始化的值 name=null age=0 country="cn")
6。对对象进行构造代码块初始化
7。对对象进行对应的构造函数初始化
8。将内存地址赋给栈内存中的p变量
十一设计模式:
解决某一类问题最行之有效的方法,Java中23种设计模式。单例设计模式(Singleton):解决一个类在内存中只存在一个对象
比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
想要保证对象唯一:
为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象; 还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象; 为了方便其他程序对自定义对象的访问, 可以对外提供一些访问方式;
单例设计模式之饿汉式
Single类一进内存,就已经创建好了对象,简单的说就是一上来就吃。
思路: 将构造函数私有化; 在类中创建一个本类对象; 提供一个公共的访问方法,可以获取到该类对象;
步骤:
/将构造函数私有化
private Single(){}
//在类中创建一个本类对象(final关键字等下有学到,是最终的意思,呵呵)
private finla static Single single =new Single();
//提供一个公共的访问方法,可以获取到该类对象
public static Single getInstance(){
return single;
}
单例设计模式之懒汉式
对象是方法被调用时才初始化,也叫对象的延时加载
Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
步骤:
<span style="font-family:SimSun;font-size:14px;">class Single
{
private static Single s;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
s=new Single();
}
return s;
}
}
class Object1
{
public static void main(String[] args)
{
Single s=Single.getInstance();
}
}</span>
总结:
1饿汉式:一上来就对对象初始化。
浪费一点点内存,因为不调用也执行嘛。
2懒汉式:对象调用方法时,才初始化,也叫做对象的延时加载。
一点点内存都省,因为只有调用才占内存嘛。
习惯成自然,养成良好的节约内存习惯,对日后开发还有很有帮助滴。我不知道大家是不是这样,反正我是这样了。