理解java面向对象基础

简介:

1. 类和对象

一切皆对象,这可以说是面向对象的核心思想了。

类,就是具有相同性质对象的抽象。 而类的每一个具体的实例就是一个对象。 

我们可以定义一个Person类,这个Person类就是所有的人的抽象,而我们知道,每个人应该有名字(name),年龄(age)等属性,我们把这个抽象提取出来:

class Person
{
	private String name;
	private int age;
}

如果要获得一个人类的具体的实例(对象),我们可以使用new关键字:

// 定义一个Person变量
Person p;	
// 调用构造器,返回一个Person实例(在堆内存中为对象开辟空间)
// 将该Person实例赋值给p变量
p = new Person();

可以直接写出: Person p = new Person();

2.  类的成员

类中应该有哪些东西呢?我们可以思考,人类应该拥有的东西:名字,年龄...... 这些被称为属性,当然,人还应该拥有通用的一些动作行为,比如说话,吃饭,睡觉等等,这些行为动作就是方法。

所以比较完整的类可以如下定义:

class Person
{
	// 属性
	private String name;
	private int age;

	// 方法
	private void say(){}

	private void sleep(){}
}

当然,除此之外,类的成员还有: 构造器,内部类。

3. 通过对象访问属性

对象是类的实例,所以说,对象拥有访问类中所有东西(属性、方法)的权利,访问方式: 对象.属性 、 对象.方法;

此外,如果类中的成员使用了static修饰(即类成员),则可以直接通过类名.属性/方法 进行访问。 

4. this

This作为对象的默认引用有两种情形:

1)构造器中引用该构造器正在初始化的对象

2)方法里引用调用方法的对象。 

1)的理解:

构造器的作用是什么呢,说白了,就是为了初始化属性数据的;所以,我们一般利用构造器,传入相关的属性数据,为要初始化的对象的属性赋初始值。

public Person(String name,int age){
this.name = name;
this.age = age;
}

构造器中,我们使用this关键字,表示正在初始化的对象。this.name = name;的意思就是正在初始化对象的name属性为传递过来的name值。 

2)的理解:

说白了就是在调用方法的过程中,如果哪个对象调用了该方法,则该方法里的this表示该对象。

// 方法
private void say(){
this.sleep();	此处的this就表示正在调用say()方法的对象。该对象继续调用sleep()方法
}	private void sleep(){
System.out.println("this 调用sleep方法 ");
}

5. 方法

1)关于方法,有实例方法和类方法之分,这个要看有没有使用static修饰。

2)含有参数的方法在调用过程中使用的值传递方式,传递的是原有值的复制的值或者是引用。

3)参数可变的方法private void listBooks(String... books ){}

对于参数可变的方法,我们可以通过foreach循环获取里面的值:

private void listBooks(String... books ){
for(String book:books){
System.out.println(book);
}
}

4)方法的递归。

public static int fn(int n)
{
if (n == 0)
{
return 1;
}
else if (n == 1)
{
return 4;
}
else
{
//方法中调用它自身,就是方法递归
return 2 * fn(n - 1) + fn(n - 2);
}
}
public static void main(String[] args) 
{
//输出fn(10)的结果
System.out.println(fn(10));
}

5)方法重载

方法重载发生在同一个类里,要求是在类里定义了名字相同的方法,但是要求方法的参数列表不同。至于其它的部分,返回值类型和限定修饰符,与重载没有关系。

public void test(){
System.out.println("无参数");
}
public void test(String msg){
System.out.println("重载的方法,参数:"+msg);
}

6. 成员变量和局部变量

成员变量分为实例变量和类变量,区别在于是否使用static修饰;其中使用static修饰的变量为类变量,可以使用类名直接访问。

局部变量是指形参、方法局部变量、代码块中的局部变量。 

7. 变量的初始化时机

成员变量的初始化时机: 当系统加载类或者为该类创建实例时,系统会自动为该成员变量分配内存空间,并在分配内存后,自动为成员变量指定初始值。

加载类时,为类变量指定初始值; 创建类的实例时,为成员变量指定初始值。

// 类属性
public static int eyeNum;
// 实例属性
public String name;
 
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person();
 
p1.name = "张三";
p2.name = "李四";
 
p1.eyeNum =2;
p2.eyeNum =3;
}

对于上面一段代码,如果该Person类是第一次加载进JVM的时候(该类只要使用了也就被加载了),则会先初始化该Person类的eyeNum属性,为该属性分配空间,赋初始值0

接下来,创建了类的实例p1p2,这个时候,系统会为该实例的属性进行初始化赋值,因为name属性是属于实例的,所以p1namep2name不是一回事(不在同一个内存里哦)。

可以通过对象去访问类属性,但是,因为类属性是属于类的,所以即使是不同的实例,操作的依然是同一个类属性。 

局部变量的初始化时机:局部变量必须经过显示初始化才能使用,系统并不会为局部变量执行初始化。局部变量的值存储在方法栈中,栈内存中的变量无需系统垃圾回收,往往随着方法和代码块的运行结束而结束。

相关文章
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
78 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
27天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
15 2
|
3月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
3月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
35 4
|
3月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
2月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
17 0
|
3月前
|
安全 Java Go
面向对象程序设计语言:Java
Java语言语法和C语言和C++语言很接近,很容易学习和使用,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的特性,Java语言不使用指针,而是引用,并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧
61 2
|
4月前
|
Java 数据处理 开发者
【Java基础面试十二】、说一说你对面向对象的理解
这篇文章阐述了面向对象是一种以类和对象为基础,通过封装、继承和多态等概念来模拟现实世界中的事物及其相互关系的程序设计方法,它强调以事物为中心进行思考和系统构造,与结构化程序设计相比,更符合人类的自然思维方式。
【Java基础面试十二】、说一说你对面向对象的理解
|
4月前
|
Java
【Java基础面试十三】、面向对象的三大特征是什么?
这篇文章介绍了面向对象程序设计的三大基本特征:封装、继承和多态,其中封装隐藏对象实现细节,继承实现软件复用,多态允许子类对象表现出不同的行为特征。
【Java基础面试十三】、面向对象的三大特征是什么?
下一篇
无影云桌面