JavaSE之面向对象编程(上)

Java语言的三大特性:平台无关系、安全性、网络移动性。Java是面向对象的编程语言,Java的三大特性与面向对象的封装、继承、多态、抽象有着千丝万缕的关系。
1.封装
封装是一种信息隐蔽技术,就是把属性私有化,提供公共方法访问私有对象。封装还指把对象的属性和行为看成是一个密不可分的整体。
封装的优点:
隐藏类的实现细节
在setter函数中加入控制逻辑,限制对属性的不合理操作
便于修改,增强代码的可维护性

类与对象的关系

类是具有相同属性和方法的一组对象的集合,成员变量是类的属性,反映对象的状态;成员方法是类的行为,反映对属性的操作。对象是实际存在该类事物的个体。对象是以类为模板创建的,或者说对象是以类为蓝图实例化的

对象与实例的不同点:在类中,一般会定义类的成员,包括变量和方法。在Java内存分配中,对象(类中的属性)是保存在堆内存中,实例(可理解为对象名称)保存在栈内存中,实例只是一个对象的引用,就是对象的指针(地址)。只能通过实例操作对象,并不能直接操作对象。实例变量和实例方法又合称实例成员,实例成员只属于实例,不属于整个类。

类的定义语法:

访问控制符 [修饰符] class 类名{
      访问控制符 [修饰符] 数据类型 属性1;
      访问控制符 [修饰符] 数据类型 属性2;
      ......
        访问控制符 [修饰符]  返回值的数据类型 方法名称(参数1,参数2....){
            方法语句;
            [return 返回值;]
        }
}

访问控制符:用于限定声明的类在大多数范围内可以被其他类访问,主要有默认访问控制符(无关键字)和public
修饰符:用于增强类的功能,使声明的类具有某种特性创建的修饰符有abstract、static、final等
class:类定义时使用的关键字
类名:采用大驼峰命名法,且文件名(后缀为.java)要与主类名相同
eg:

public calss Person{
String name;
int name;
public void say(){
System.out.println("我的名字叫"+name+"我今年"+age+"岁了");
}
}

创建好一个类后,想要使用该类,就需要创建对象

对象的创建:

类名 对象名称1 = new 类名();
类名 对象名称=null;
对象名称=new 类名();

类是一种引用数据类型,与数组是相同的的,以此两者在内存的分配上也有相似性。
例如Person类有两个属性,name和age都需要存入内存中,当程序执行到 Person p1时,Java会在栈内存中开辟一个空间给对象p1,执行到p1=new Person();时,Java会在堆内存开辟空间保存对象p1的属性。
因此栈内存(虚拟机局部变量表):存放的是局部变量(包含编译期可知的各种基本数据型,对象引用,即对象的名称,存储的堆内存的地址)Java栈与线程相对应,每创建一个线程,JVM就会为线程创建一个对应的Java栈。

只要出现了关键字NEW,表明在堆上分配了内存并且产生了Person类的对象来引用这部分内存。
对象(引用数据类型)必须在实例化后调用,否则会产生NullException(运行时错误,编译可以通过,只有引用数据类型才会产生此类异常)
引用传递分析:
引用传递的本质:同一片堆内存被多个栈所指向,并且都可以更改堆内存中的值。

private实现封装处理

使用private关键字对类中的属性进行隐藏,这样就只能在本类中访问属性,其他类无法访问。因此可以使用setter方法和getter方法访问使用对象的私有属性。
eg:

public void setAge(int age){
	if(age>0&&age<120){
		
		this.age=age;
	}
}
 public String getName(){
	 
	 return name;
 }	

在程序中,set方法的形参与类的数据成员同名,get方法的声明中,返回值的数据类型要与数据成员类型对应。
当一个属性不希望外部更改时,则不提供set方法,使用构造方法对属性初始化(只有使用new关键字实例化对象时,才会调用构造函数)。

构造方法的定义遵循的原则:
1.方法名称与类名相同
2.构造方法中没有返回值类型声明。
3.每一个类中至少存在一个构造方法,若不格外定义,系统自动生成一个无参的构造函数。
4.构造方法参数可以不同,即可以构造方法重载。
5.构造方法不能被static abstract native synchronized修饰
6.构造方法的访问修饰符与所在类的访问修饰符一致,若类是public,那么默认的构造方法也是public,若类是无访问修饰符的,那么他的默认构造方法也是没有访问修饰符的。
eg:

public Person(){
	System.out.println("********产生一个新的Person无参对象********");
	
	
}
public Person(String name){
	
	this.name=name;
	System.out.println("*********产生一个新的Person一个参数对象********");
	
}
public Person(String name,int age){
	this(name);  //this调用本类方法(前面只有一个参数的构造方法)
	this.age=age;
	//System.out.println("*********产生一个新的Person两个参数对象********");
}

注: 可以创建私有的构造方法
在23种设计模式中,就在存在一种单例设计模式,其中就是将构造方法声明为private,因此就不能通过构造方法创建对象,从而保证单例设计模式只有一个实例,在其需要获得类的实例时,可以类似于获得私有属性一样,写一个getter方法,通过调用该静态getter方法获得类的实例。

匿名对象
匿名对象是没有栈空间的对象,通过关键字NEW开辟,只能使用一次,使用完后会等待JVM垃圾回收器收集

猜你喜欢

转载自blog.csdn.net/weixin_42962924/article/details/83895219