JavaSE之面向对象编程(上)

面向对象的编程范式:(C++、JAVA、GO)能进行现实生活的抽象
Java语言的三大特性:平台无关系、安全性、网络移动性。Java是面向对象的编程语言,Java的三大特性与面向对象的封装、继承、多态、抽象有着千丝万缕的关系。
面向对象:狗吃粮//强调对象,动作只是附属品
面向过程(C语言):吃狗粮//强调动作(方法)

现代新兴的编程范式:
面向切面编程:EE-AOP
面向接口编程-接口优先原则
函数式编程-Scala(JVM)

OOA:面向对象分析
OOP:面向对象编程
OOD:面向对象设计

Java面向对象的三大特性(面):
1.封装:将客观事务封装抽象为类,每个类都有自己的属性和方法,类可以让自己的数据和方法只让可信的类或对象操作,对不可信的进行信息隐藏,总而言之就是内部操作对外部隐藏(保护性)。
2.继承:可以实现现有类的所有功能,并且在无需重新编写原有类代码的情况下进行功能上的扩展。(含private访问修饰的继承成为隐式继承,其余称为显式继承)
3.多态:指一个类实例的相同方法在不同情形下有不同的表现形式。多态机制使得具有不同内部结构的对象可以共享相同的外部接口。

1.封装
封装是一种信息隐蔽技术,就是把属性私有化,提供公共方法访问私有对象。封装还指把对象的属性和行为看成是一个密不可分的整体。
封装的优点:
隐藏类的实现细节
在setter函数中加入控制逻辑,限制对属性的不合理操作
便于修改,增强代码的可维护性

面向对象与面向过程的区别:面向过程性能高。因为类的调用需要实例化,开销比较大,耗费内存,所以当性能为首选考量因素时,如单片机开发、嵌入式开发、Linux/Unix一般采用面向过程开发。

类与对象的关系

(类是共性的概念,而对象是一个具体的、可以使用的事务;类是产生对象的蓝图,先产生类才有了对象,对象的所有属性和方法,必须在类中进行完整的定义。)
类是具有相同属性和方法的一组对象的集合,成员变量是类的属性,反映对象的状态;成员方法是类的行为,反映对属性的操作。对象是实际存在该类事物的个体。对象是以类为模板创建的,或者说对象是以类为蓝图实例化的

对象与实例的不同点:在类中,一般会定义类的成员,包括变量和方法。在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垃圾回收器收集

访问控制符
public:Java修饰的类、属性、方法不仅可以跨类访问,还可以跨包访问
protected:介于public和private之间的访问控制符,protected修饰的类属性和方法只能被该类本身的方法本包或不同包的子类访问。
默认级别(default):只向同一个包中的类公开。
private:Java 访问控制权限最狭窄的修饰符,private修饰的类、属性、方法只能被该类的对象访问,其子类不能访问,更不允许跨包访问。被private修饰的类只能是一个类的内部类。

Java中的内存(共有六块)分配:
栈内存(虚拟机局部变量表):基本数据类型、对象的引用(对象名)
堆内存:实例对象数据
垃圾空间:没有任何栈内存指向的堆内存空间

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值