java面向对象:三大特性:封装,继承,多态(1),2024年最新华为面试经验分享

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

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

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

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

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

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

正文

配一把钥匙:引用

内存管理:由JVM来管理的

1)堆:存储new出来的对象(包括成员变量)

2)栈:存储局部变量(包括方法的参数)

3)方法区:存储.class字节码文件(包括方法)

练习:

给Hero、Airplane、BigAirplane、Bee、Bullet、Sky

分别添加构造方法

————————————————————————————

1.引用类型数组:

1)Student[] stus = new Student[3]; //创建Student数组对象

stus[0] = new Student(“zhangsan”,25,“LF”); //创建Student对象 并调用Student

stus[1] = new Student(“lisi”,26,“JMS”);

stus[2] = new Student(“wangwu”,28,“SD”);

System.out.println(stus[0].address);

2)Student[] stus = new Student[]{

new Student(“zhangsan”,25,“LF”),

new Student(“lisi”,26,“JMS”),

new Student(“wangwu”,28,“SD”)

};

3)int[][] arr = new int[3][];-----------数组的数组

arr[0] = new int[2];

arr[1] = new int[3];

arr[2] = new int[2];

arr[1][0] = 100;

4)int[][] arr = new int[3][4];----------数组的数组

for(int i=0;i<arr.length;i++){

for(int j=0;j<arr[i].length;j++){

arr[i][j] = (int)(Math.random()*100);

}

}

例如:

int[][] arr= new int[3][];//[3]是数组长度,[]代表每一个数组中都长度

arr[0] = new int[2]; //第一个数组的长度为2

arr[1] = new int[3]; //第二个数组都长度为3

arr[2] = new int[4];

arr[1][2] = 100; // 给第2个数组中第3个元素赋值为100

System.out.println(arr[1][2]);//输出第二个数组中第三个

int[][] arr1 = new int[3][4]; //一共有3个组数,每个数组都长度为4

for(int i = 0;i<arr1.length;i++){ //遍历数组arr1中都元素[3]

for(int j = 0;j<arr1[i].length;j++){//遍历数组arr1中每一个数组的长度,arr1[i]

arr1[i][j] = 250; // 给每一个数组赋值为250

System.out.println(arr1[i][j]);

2.继承:

1)作用:代码复用

2)通过extends来实现继承

3)超类/父类:所有派生类所共有的属性和行为

派生类/子类:派生类所特有的属性的行为

4)派生类继承超类后,派生类具有:派生类的+超类的

5)一个超类可以有多个派生类

一个派生类只能有一个超类-------单一继承

6)继承具有传递性

7)java规定:构造派生类之前必须先构造超类

在派生类的构造方法中若没有调用超类的构造方法

------则默认super()调用超类的无参构造方法

在派生类的构造方法中若调用了超类的构造方法

------则不再默认提供

注意:super()调用超类构造必须位于派生类构造的第一行

3.super:指代当前对象的超类对象

super的用法:

1)super.成员变量名------------访问超类的成员变量

2)super.方法名()--------------调用超类的方法-------明天讲

3)super()---------------------调用超类的构造方法

例:

class Person { //class创建类。

//超类/父类

String name;

int age;

String address;

Person(String name, int age, String address) { //构造方法

this.name = name;

this.age = age;

this.address = address;}

void sayHi() { //方法

System.out.println(“你好,我叫” + name + “,今年” + age + “岁了,家住” + address);

}}

class Student extends Person {//派生类/子类 使用extends继承

String stuId;

Student(String name, int age, String address, String stuId) {

super(name, age, address); // super调用超类的值

this.stuId = stuId; // this. 给stuld赋值。 super的超类已经赋过,所以不需要再赋值

}}

练习:

1.创建Person类,包含:

1)成员变量:name,age,address

2)构造方法:Person(3个参数){}

3)方法:sayHi(){输出3个数据}

2.创建Student类,继承Person,包含:

1)成员变量:stuId

2)构造方法:Student(4个参数){}

3.创建Teacher类,继承Person,包含:

1)成员变量:salary

2)构造方法:Teacher(4个参数){}

4.创建Doctor类,继承Person,包含:

1)成员变量:level

2)构造方法:Doctor(4个参数){}

5.创建Test类,main中:

1)创建Student数组ss,填充数据,遍历问好

2)创建Teacher数组ts,填充数据,遍历问好

3)创建Doctor数组ds,填充数据,遍历问好

public class Test {

public static void main(String[] args) {

Person[] ps = new Person[3];

ps[0] = new Student(“张发阳”,22,“宝兴”, “1634”);

ps[1] = new Teacher(“张三”, 35, “浙江”, 4122);

ps[2] = new Doctor(“李四”, 46, “上海”, “aaa”);

for(int i=0;i<ps.length;i++){

ps[i].sayHi();

}

}

}

class Person {

String name;

int age;

String address;

Person(String name, int age, String address) {

this.name = name;

this.age = age;

this.address = address;

}

void sayHi() {

System.out.println(“你好,我叫” + name + “,今年” + age + “岁了,家住” + address);

}}

class Student extends Person {

String stuId;

Student(String name, int age, String address, String stuId) {

super(name, age, address);

this.stuId = stuId;

}void sayHi() {

System.out.println(“我职业是教师,名叫” + name + “,” + “今年” + age + “岁了,家住” + address + “,学号为:” + stuId);

}}

class Teacher extends Person {

double salary;//工资

Teacher(String name, int age, String address, double salary) {

super(name, age, address);

this.salary = salary;

}

void sayHi() {

System.out.println(“我职业是教师,名叫” + name + “,” + “今年” + age + “岁了,家住” + address + “,工资为:” + salary);

}}

class Doctor extends Person {

String level;

Doctor(String name, int age, String address, String level) {

super(name, age, address);

this.level = level;

}

void sayHi() {

System.out.println(“我职业是医生,名叫” + name + “,” + “今年” + age + “岁了,家住” + address + “,任职:” + level);

}

}

——————————————————————————————

2018/8/14

1.向上造型;

1)超类型的引用指向派生类的对象

2)能点出来什么,看引用的类型

例:

public static void main(String[] args) {

Aoo o1 = new Aoo();

o1.a = 1;

o1.show();

//o1.b = 2; //编译错误,超类不能访问派生类的

Boo o2 = new Boo();

o2.b = 1;

o2.test();

o2.a = 2; //正确,派生类可以访问超类的

o2.show();

Aoo o3 = new Boo(); //向上造型

o3.a = 1;

o3.show();

//o3.b = 2; //编译错误,能点出来什么,看引用的类型

}}

class Aoo{

int a;

void show() {}

}

class Boo extends Aoo{

int b;

void test() {}

}

2.方法的重写(Override):重新写,覆盖

1)发生在父子类中,方法名称相同,参数列表相同,方法体不同

2)重写发放被调用时,看对象的类型

//超类大,派生类小

class Coo{

void show() {}

double test() {return 0.0;}

Doo say() {return null;}

Coo sayHi() {return null;}

}

class Doo extends Coo{

//int show() {return 1;} //编译错误,void时必须相等

//int test() {return 0;} //编译错误,基本类型时必须相等

//Coo say() {return null;} //编译错误,引用类型必须小于或等于

Doo sayHi() {return null;} //正确

}

3.重写与重载的区别:-----常见面试题

1)重写:

1.1)发生在父子类中,方法名称相同,参数列表相同,方法体不同

1.2)遵循“运行期绑定”,看对象的类型来调用方法

class Eoo{

void show() { //方法

System.out.println(“超类show”);

}}

class Foo extends Eoo{

void show() { //方法重写

System.out.println(“派生类show”);

}}

2)重载:

2.1)发生在一个类中,方法名称相同,参数列表不同,方法体不同

2.2)遵循“编译期绑定",看参数/引用的类型来绑定方法

class Aoo(){ //??方法重载

void say(int age){System.out.println(“你好,我今年”+age+“岁了”);}

void sa(String name){System.out.println(“你好,我叫”+name);}

void sa(String name,String address){“你好,我叫”+name+“,家住”+address);}

}

//重写的演示

public static void main(String[] args) {

Goo goo = new Goo();

Eoo o = new Foo();

goo.test(o); //重载看参数/引用Eoo

}

}

class Goo{

void test(Eoo o) {

System.out.println(“超类型参数”);

o.show(); //重写看对象Foo

}

void test(Foo o) {

System.out.println(“派生类型参数”);

o.show();

}}

class Eoo{

void show() { //方法

System.out.println(“超类show”);

}}

class Foo extends Eoo{

void show() { //方法重写

System.out.println(“派生类show”);

}}

练习:

/*1.创建Person类,包含:

1)成员变量:name,age,address;

2)构造方法:Person(3个参数){}

3)方法:sayHi{输出3个数据}

2.创建Student类,继承Person,包含:

1)成员变量:stuId

2)构造方法:Student(4个参数){}

3)方法:重写sayHi(){输出4个数据}

3.创建Teacher类,继承Person,包含:

1)成员变量:salary

2)构造方法:Teacher(4个参数){}

3)方法:重写sayHi(){输出4个数据}

4.创建Doctor类,继承Person,包含:

1)成员变量:lever

2)构造方法:Doctor(4个参数){}

3)方法:重写sayHi(){输出4个数据}

5.创建Test类,main中:

创建Person数组ps,填充数据,遍历问好*/

class Person{

String name;

int age;

String address;

Person(String name,int age,String address){

this.name = name;

this.age = age;

this.address = address;

}

void sayHi(){

System.out.println(“你好,我叫”+name+“,今年”+age+“岁了,家住”+address);

}

}

class Student extends Person{

int stuId;

Student(String name,int age,String address,int stuId){

super(name,age,address);

this.stuId = stuId;

}

void sayHi(){

System.out.println(“我的职业是学生,名为”+name+“,今年”+age+“岁了,家住”+address+“,学号是:”+stuId);

}

}

class Teacher extends Person{

double salary;

Teacher(String name,int age,String address,double salary){

super(name,age,address);

this.salary = salary;

}

void sayHi(){

System.out.println(“我的职业是老师,名为”+name+“,今年”+age+“岁了,家住”+address+“,工资为”+salary);

}

}

class Doctor extends Person{

String level;

Doctor(String name,int age,String address,String level){

super(name,age,address);

this.level = level;

}

void sayHi(){

System.out.println(“我的职业是医生,名为”+name+“,今年”+age+“岁了,家住”+address+“,任职:”+level);

}

}

public class Test {

public static void main(String[] args){

Person[] ps = new Person[4];

ps[0] = new Person(“张发阳”,20,“宝兴兴兴”);

ps[1] = new Student(“张发阳”,25,“宝兴”,1634);

ps[2] = new Doctor(“张发阳”,35,“宝兴兴”,“副院长”);

ps[3] = new Teacher(“张发阳”,45,“宝兴兴兴”,3000);

for(int i =0;i<ps.length;i++){

ps[i].sayHi();

}

}}

———————————————————————————————————

笔记:

1.package:

1)作用:避免类名的冲突

2)包名可以有层次结构

3)类的全称: 包名.类名,同包中的类不能同名

4)建议:包名所有字母都小写

package a;

class Aoo{ } //全称a.Aoo

package b;

class Aoo{ } //全称b.Aoo 不在一个包,所以不报错

class Aoo{ } //错误,一个包里不可以重复类名

import:

1)同包中的类可以直接访问,

不同包中的类不能直接访问,想访问有如下两种方式:

1.1)先import声明类再直接使用类------建议

import oo.day05.Aoo; //声明类

public class Coo {

void show() {

Aoo o = new Aoo();

o.a = 1;

}}

1.2)类的全称------------------------太繁琐、不建议

void show() {

oo.day05.Aoo o = new oo.day05.Aoo();

oo.day05.Aoo.a = 1;

2.访问控制修饰符:

1)public:公开的,任何类

2)private:私有的,本类

3)protected:受保护的,本类、派生类、同包类

4)默认的:什么也不写,本类、同包类

说明:

1)类的访问修饰符只能是public或默认的

2)类中成员的访问修饰符如上四种都可以

修饰符 本类 同一个包中的类 子类 其他类

public 可以访问 可以访问 可以访问 可以访问

private 可以访问 不能访问 不能访问 不能访问

protected 可以访问 可以访问 可以访问 不能访问

默认 可以访问 可以访问 可以访问 不能访问

例:

public int a; //任何类

protected int b; //本类、派生类、同包类

int c; //本类、同包类

private int d; //本类

void show() {

a = 1;

b = 2;

c = 3;

d = 4;

}}

//演示private

class Boo{

void show() {

Aoo o = new Aoo();

o.a = 1;

o.b = 2;

o.c = 3;

//o.d = 4;

}}

3.final:最终的、不可改变的----应用率低

1)修饰变量:变量不能被改变

//演示final修饰方法

//演示final修饰变量

class Eoo{

final int a = 5;

final int b;

Eoo(){

b = 6;

}

void show() {

final int c;

//a = 55; //编译错误,final的变量不能被改变

}}

2)修饰方法:方法不能被重写

class Foo{

final void show() {}

void test() {}

}

class Goo extends Foo{

//void show() {} //编译错误,final修饰的方法不能被重写

void test() {}

}

3)修饰类:类不能被继承

//演示final修饰类

final class Hoo{}

//class Ioo extends Hoo{} //编译错误,final修饰的类不能被继承

class Joo{}

final class Koo extends Joo{}

4.static:静态的

1)静态变量:

1.1)由static修饰

1.2)属于类的,存储在方法区中,只有一份

1.3)常常通过类名点来访问

1.4)何时用:所有对象所共享的数据(图片、音频、视频等)

2)静态方法:

2.1)由static修饰

2.2)属于类的,存储在方法区中,只有一份

2.3)常常通过类名点来访问

2.4)静态方法没有隐式this传递,

静态方法中不能直接访问实例成员

2.5)何时用:方法的操作仅与参数相关而与对象无关

3)静态块:

3.1)属于类的,在类被加载期间自动执行,

类只被加载一次,所以静态块只执行一次

3.2)何时用:用于加载/初始化静态资源(图片、音频、视频等)

//static的演示

public static void main(String[] args) {

Loo o1 = new Loo();

o1.show();

Loo o2 = new Loo();

o2.show();

System.out.println(Loo.b); //2,建议类名点来访问

Moo.test(); //类名点来访问

Noo o4 = new Noo();

Noo o5 = new Noo();

}}

//演示静态块

class Noo{

static {

System.out.println(“静态块”);

}

Noo(){

System.out.println(“构造方法”);

}}

//演示静态方法

class Moo{

int a;

static int b;

void show() { //有this

System.out.println(this.a);

System.out.println(Moo.b);

}

static void test() { //没有this

//静态方法没有隐式this传递

//没有this意味着没有对象

//而实例变量a必须通过对象点来访问

//结论:静态方法中不能直接访问实例成员

//System.out.println(a); //编译错误

System.out.println(Moo.b);

}}

//演示静态变量

class Loo{

int a;

static int b;

Loo(){

a++;

b++;

}

void show() {

System.out.println(“a=”+a+“,b=”+b);

}}

内存管理: (背)

1)堆:new出来的对象(包括实例变量)

2)栈:局部变量(包括方法的参数)

3)方法区:.class字节码文件(包括方法、静态变量)

例:成员变量:

1)实例变量:没有static修饰,属于对象的,存储在堆中,

有几个对象就有几份

通过对象名点来访问

2)静态变量:由static修饰,属于类的,存储在方法区中,

只有一份

通过类名点来访问

—————————————————————————————

笔记:

1.static final常量:

1)必须声明同时初始化

2)类名点来访问、不能被改变

3)建议:常量名所有字母都大写,多个单词之前用_分隔

4)编译器在编译时将常量直接替换为具体的值,效率高

5)何时用:数据永远不变,并且经常使用

2.抽象方法:

1)由abstract修饰

2)只有方法的定义,没有具体的实现(连{}都没有)

3.抽象类:

1)由abstract修饰

2)包含抽象方法的类必须是抽象类

不包含抽象方法的类也可以声明为抽象类------我乐意

3)抽象类不能被实例化 ,但数组可以

4)抽象类是需要被继承的,派生类:

4.1)重写抽象类中的所有抽象方法-----建议

4.2)也声明为抽象类-----------------一般不这样做

5)抽象类的意义:

5.1)封装共有的属性和行为--------------代码复用

5.2)为所有派生类提供统一的类型--------向上造型

5.3)可以包含抽象方法,为所有派生类提供统一的入口,

派生类的具体实现不同,但入口是一致的

设计规则:

1)将派生类共有的属性和行为,抽到超类中--------抽共性

2)派生类的行为都一样,设计为普通方法

派生类的行为都不一样,设计为抽象方法

————————————————————————————————

常见面试题:

问: 内部类有独立.class吗?

答: 有

例:Mama$(发音:多嘞儿)baby.class //Mama外部类,baby内部类

1.成员内部类:应用率不高

1)类中套类,外面的称为Outer外部类,里面的成为Inner内部类

Class Aoo{ //外部类

Class Boo{//内部类

}}

使用方法:

public static void main(String[] args) {

Demo14 a = new Demo14();

Foo f = a.new Foo();

f.Doo();

}

2)内部类通常只服务于外部类,对外不具备可见性

3)内部类对象通常是在外部类中创建的

4)内部类中可以直接访问外部类的成员(包括私有的)

内部类中有个隐式的引用指向了创建它的外部类对象

eg: 外部类名.this

2.匿名内部类:

1)若想创建一个类(派生类)的对象,并且对象只创建一个,

此时该类不必命名,称为匿名内部类

2)在jdk1.8以前,匿名内部类中若想访问外面的变量,

该变量必须是final的

功能实现过程:

1.先写行为/方法:

1)若为某个对象所特有的行为,就将方法设计在对应的类中

2)若为所有对象所共有的行为,就将方法设计在超类中

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

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

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

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

常见面试题:

问: 内部类有独立.class吗?

答: 有

例:Mama$(发音:多嘞儿)baby.class //Mama外部类,baby内部类

1.成员内部类:应用率不高

1)类中套类,外面的称为Outer外部类,里面的成为Inner内部类

Class Aoo{ //外部类

Class Boo{//内部类

}}

使用方法:

public static void main(String[] args) {

Demo14 a = new Demo14();

Foo f = a.new Foo();

f.Doo();

}

2)内部类通常只服务于外部类,对外不具备可见性

3)内部类对象通常是在外部类中创建的

4)内部类中可以直接访问外部类的成员(包括私有的)

内部类中有个隐式的引用指向了创建它的外部类对象

eg: 外部类名.this

2.匿名内部类:

1)若想创建一个类(派生类)的对象,并且对象只创建一个,

此时该类不必命名,称为匿名内部类

2)在jdk1.8以前,匿名内部类中若想访问外面的变量,

该变量必须是final的

功能实现过程:

1.先写行为/方法:

1)若为某个对象所特有的行为,就将方法设计在对应的类中

2)若为所有对象所共有的行为,就将方法设计在超类中

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-zyKqEhfk-1713554001901)]

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值