Java基础教程【第六章:面向对象】_构造函数的主要作用是完成对类的对象的初始化工作

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

对象是类的实例。尽管对象的表示在形式上与一般数据类型十分相似,但是它们之间存在一种本质区别:
对象之间通过消息传递方式进行通信。 消息传递原是一种与通信有关的概念,OOP 使得对象具有交互能力的主要模型就是消息传递模型。
对象被看成用传递消息的方式互相联系的通信实体,它们既可以接收可以拒绝外界发来的消息。一般情况下,对象接收它能够识别的消息,拒绝它不能识别消息。
对于一个对象而言,任何外部的代码都不能以任何不可预知或事先不允许的方式与这个对象进行交互。
发送一条消息至少应给出一个对象的名字和要发给这个对象的那条消息的名字。经常,消息的名字就是这个对象中外界可知的某个方法的名字。在消息中,经常还有一组数(也就是那个方法所要求的参数),将外界的有关信息传给这个对象。

PS:老师有教书的方法,那么老师可以通过教的方法将知识传输给学生,那么学生需要有学习的方法。通过学习的方法来接受知识。如下列代码:

public class Teacher {
void teach(String content) {
System.out.println("开始传授" + content + "...");
Student stu = new Student();
stu.study(content);
}
public static void main(String[] args) {
Teacher t = new Teacher();
t.teach("java");
} }

定义类的语法:

class 类的名称{ 
	[访问修饰符] 数据类型 属性名; //声明成员变量
	...
	[访问修饰符] 返回值类型 方法名([参数列表]) {
		程序代码语句;
		return 值或表达式;
	 } 
}

成员变量的定义:又叫实例变量,定义在类中,方法外的变量叫做成员变量,属于某一个对象。
成员方法:又叫实例方法,必须通过某个对象来进行访问调用。
语法说明:[ ]中的内容可有可无。

3.5 语法规则

1、访问修饰符有 4 种:(在后面访问修饰符的时候详细说明)
a) public:公共的;
b) 不写:默认的;
c) protected:受保护的;
d) private:私有的;
PS:目前一般写成是 public 或者不写。

2、数据类型:包含基本数据类型和引用数据类型
3、属性名、方法名:同变量的定义规则;
4、 返回值类型:
a) 没有返回值使用 void;
b) 有返回值可以是基本数据类型或者引用数据类型
5、参数列表:包含参数的类型,个数,顺序。
6、 程序代码:顺序结构、分支语句、循环语句;
7、return:只有当方法有返回值的时候才需要,值或表达式结果的类型必须和返回值类型相同或者它的小类型。

//没有返回值没有传参
void eat(){
System.out.println("eat");
}
//没有返回值有传参
void eat(String str,int a){
System.out.println("eat");
}
//有返回值有传参
int eat(String str,int a){
System.out.println("eat");
return 100;//换成(byte)100;
}

访问类中的属性和方法:如果需要去访问类中的属性和方法,则需要先创建该类的对象。

调用属性:对象名.属性名;
调用方法:对象名.方法名(参数列表);

public class Person {
String name; // 定义属性,人的姓名
int age; // 定义属性,人的年龄
/\*\*
\* 定义方法,显示人的姓名和年龄
\*/
public void show() {
// +和字符串一起使用的时候表示连接而非加分运算
System.out.println("姓名:" + name + ",年龄:" + age);
}
public static void main(String[] args) {
Person person = new Person(); // 创建人的对象,即某一个成员
person.name = "jack"; // 初始化人的姓名,通过赋值=将jack赋值给该对象的姓名属性
person.age = 34; // 初始化人的年龄,通过赋值=将34赋值给该对象的年龄属性
person.show(); // 调用show()方法
} }

PS:通过对象调用属性和方法,可以在同一个类的 main 方法中调用,也可以在不同的类中进行调用。

3.6 内存的划分

内存的操作,为属性赋值:

在这里插入图片描述
PS:栈空间保存的是基本数据类型和字符串,包括局部变量的引用,堆空间保存的动态产生的数据,比如 new 创建出来的对象,也就是引用数据类型。上面两个 Person 实例在堆空间开辟了两块内存,那么相互之间进行调用的时候就不会受到影响,只要使用了 new 关键字,必会在堆空间开辟内存。

4. 构造函数,方法的重载

4.1 定义

要使用面向对象,首先必须构造对象,并指定它们的初始状态,然后通过对象调用方法。在 java 的语言设计中,使用构造函数(constructor)来构造新的实例,一个构造函数是新的方法,它的作用就是构造对象并进行初始化。

4.2 特点

(1)构造函数的方法名与类名相同。
(2)构造函数没有返回类型。
(3)构造函数的主要作用是完成对类对象的初始化工作。
(4)构造函数不能由编程人员显式地直接调用。
(5)在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。

public class Person {
String name;
int age;
//要使用Person的方法,必须先创建Person类的对象,在创建对象的同时对name,age属性进行了初始化
public Person(String name, int age) {
super();
this.name = name;
this.age = age; } }

4.3 作用

(1)对象初始化
(2)引入更多的灵活度(变量赋值或更复杂的操作)
(3)Java 中可以不定义构造函数
Java 中可以不定义构造函数,此时系统会自动为该系统生成一个默认的构造函数。这个构造函数的名字与类名相同,它没有任何形式参数,也不完成任何操作。 为了避免失去控制,一般将构造函数的声明与创建分开处理。

4.4 构造函数重载

一个类可以有多个构造函数,如果一个类没有定义一个构造函数,Java 编译器将为这个类自动提供缺省构造函数(即无参的构造函数) ,缺省构造函数将成员变量的值初始化为缺省值,一旦创建了自己的构造函数, Java 编译器将不再自动提供无参的构造函数。
重载构造函数提供了一组创建对象的方式,可以根据需要决定是否带初始参数。根据参数列表决定调用的是哪个重载的构造函数。
构造函数重载:一个类中可以有多个构造函数,它们具有不同的参数列表(参数的类型、个数、顺序)

public class Person {
	String name;
	int age;
	public Person() {
	System.out.println("无参的构造函数");
	}
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
		System.out.println("带两个参数的构造函数1");
	}
	public Person(int age, String name) {
		this.name = name;
		this.age = age;
		System.out.println("带两个参数的构造函数2");
	}
	public Person(String name) {
		this.name = name;
		System.out.println("参数为name的构造函数");
	}
	public Person(int age) {
		this.age = age;
		System.out.println("参数为age的构造函数");
	} 
}

this 关键字:与对象关联,表示当前对象(实例),即 new 出的是哪个对象,代表的就是哪个对象。this 关键字的作用:可以调用调用类中的构造方法,普通方法,成员变量。this 调用构造方法只能是在构造方法中使用,必须是第一行。

public class Person {
String name;
int age;
public Person() {
this("jack");//如果使用this调用构造方法,必须在第一行,只能在构造方法种调用构造方法。
System.out.println("无参的构造函数");
this.show();
}
public Person(String name) {
this(20);
System.out.println("参数为name的构造函数");
}
public Person(int age) {
System.out.println("参数为age的构造函数");
}
public void show(){
//this(); //不可调用。
System.out.println("show");
}
public static void main(String[] args) {
new Person();
}
}

方法重载:方法重载是 java 中实现面向对象多态性机制的一种方式。
同一个类中多个方法有相同的名字,不同的参数列表(参数的个数,类型,顺序),和返回值类型无关,这种情况称为方法重载。
当重载方法被调用时,Java 编译器根据参数的类型、数量、顺序来确定实际调用哪个重载方法的版本。方法重载不考虑方法的返回类型。

5. 封装

a)封装是对象的一种隐藏技术,其目的是将对象中的属性和方法组织起来。同时隐藏不想暴露的属性和方法及实现细节。
b)用户或其它对象不能看到也无法修改其实现。只能通过接口去调用对象的方法,达到互相通信的目的。
c)封闭的目的在于将设计者与使用者分开。使用者不必知道实现的细节,只需用设计者提供的方法来访问该对象。

public class DrawImage {
private int weight;
private int height;
public void setHeight(int height) {
if (height > 100)
System.out.println("高度不能高于100");
else
this.height = height; }
public int getHeight() {
return height; }
public void setWeight(int weight) {
if (weight > 200)
System.out.println("宽度不能大于200");
else
this.weight = weight; }
public int getWeight() {
return weight; }
public void draw() {
drawLine();
drawPoint();
System.out.println("你画了一幅画");
}
private void drawPoint() {
System.out.println("画了一个点");
}
private void drawLine() {
System.out.println("画了一条线");
} }

6. 继承,抽象,方法重写

继承是面向对象编程技术的一块基石,它允许创建分等级层次的类。运用继承,可以创建一个通用类定义一系列一般特性。该类可以被更具体的类继承。
(1)被继承的类称为父类或者超类或者基类
(2)继承父类的类称为子类或者派生类
(3)执行继承时,子类将获得父类的所有成员(包括 private 的成员,私有的不能直接访问),并具有自身特有的属性。

super 关键字:
super 是一个引用,专门用来在子类中访问父类中的构造函数、方法和实例变量。
1.使用 super 在子类的构造函数中调用父类的构造函数,语法:
super()或者 super(参数列表)
super()必须是在子类构造函数中的第一个执行语句。

2.在子类的方法中调用父类中的方法,语法:
super.方法名(参数列表)

3.在子类的方法中调用父类中的实例变量, 语法:
super.实例变量名

继承总结:
1、 子类继承父类,继承了父类的所有属性和方法(包含私有的),私有的不能直接访问;
2、一个类如果没有使用 extends,那么它将继承 Object 类,Object 类是所有类的父类,始祖类;
3、一个类可以继承多个类,但 java 中规定一个类只能直接继承一个类;可以间接继承;
4、子类具有扩展的功能,扩展子类特有的属性和方法;
5、继承大大提供了代码的重复利用性

方法重写(覆盖)override:是 java 实现多态机制的另外一种形式。
在不同类中,如果子类中的一个方法与父类中的方法有相同的返回类型、相同的方法名并具有相同数量和类型的参数列表,这种情况称为方法覆盖。
当一个覆盖方法通过父类引用被调用,Java 根据当前被引用对象的实际类型来决定执行哪个版本的方法。
可以通过 super 关键字调用直属父类中被覆盖的方法版本。

//方法重写示例:
public class Father {
public String say(){
return "我是父类"; } }
public class Son extends Father {
@Override
public String say() {
// super.say();//当创建的是子类对象的时候,如果需要调用父类的方法可以使用super关键字
return "我是儿子类"; } }
public class Daughter extends Father{
@Override
public String say() {
return "我是女儿类"; } }
public class Test {
public static void main(String[] args) {
Father f = new Father();
f.say();// 创建的是父类对象,调用的是是父类方法
Father s = new Son();
s.say();// 创建的是儿子类对象,调用的是儿子类方法
Father dau = new Daughter();
dau.say();// 创建的是女儿类对象,调用的是女儿类的方法
} 
}

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
s、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-U6GznnBJ-1713254191605)]

[外链图片转存中…(img-HUbb9rw7-1713254191605)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-9SsOzG3E-1713254191606)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值