JAVA基础知识
目录
6.访问修饰符 public、private、protected、以及不写(默认)时的区别?
一.JAVA概念
1.什么是 Java?
Java 是一门面向对象的编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
2.JAVA有什么特点?
Java的语言共有十大特点:简单性、面向对象、分布性、编译和解释性、稳健性、安全性、可移植性、高性能、多线索性、动态性。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
- 简单性:Java语言继承了C++语言的优点,去掉了C++中学习起来比较难的多继承、指针等概念,所以Java语言学习起来更简单,使用起来也更方便。
- 面向对象:Java是一种面向对象的编程语言,面向对象的三大特性是封装,继承,多态。
- 分布性:Java设计成支持在网络上应用,它是分布式语言。所以只要用Java编写了一个程序,就可以到处应用。可以节省大量人力物力。
- 编译和解释性:Java编译程序生成字节码,而不是通常的机器码,这使得Java开发程序比用其他语言开发程序快很多。
- 稳健性:Java刚开始被设计出来就是为了写高可靠和稳健的软件的。所以用Java写可靠的软件很容易。目前许多第三方交易系统、银行平台的前台和后台电子交易系统等都会用Java语言开发。
- 安全性:Java的存储分配模型是它防御恶意代码的主要方法之一。所以很多大型企业级项目开发都会选择用Java开发。
- 可移植性:Java并不依赖平台,用Java编写的程序可以运用到任何操作系统上。
- 高性能:Java是一种先编译后解释的语言,所以它不如全编译性语言快。但Java设计者制作了“及时”编译程序,这样就可以实现全编译了。
- 多线索性:Java是多线索语言,它可以同时执行多个程序,能处理不同任务。
- 动态性:Java语言设计成适应于变化的环境,它是一个动态的语言。
3.JDK、JRE、JVM 三者之间的关系?
- JVM:Java Virtual Machine,Java 虚拟机,Java 程序运行在 Java 虚拟机上。针对不同系统的实现(Windows,Linux,macOS)不同的 JVM,因此 Java 语言可以实现跨平台。
- JRE:Java 运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,Java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。
- JDK:Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
简单来说,JDK 包含 JRE,JRE 包含 JVM。
- JDK = JRE + 编译运行工具
- JRE = JVM + 各种系统类库
- 这三者的关系是一层层的嵌套关系,
JDK > JRE > JVM
4.什么是字节码?采用字节码的好处是什么?
所谓的字节码,就是 Java 程序经过编译之类产生的.class 文件,字节码能够被虚拟机识别,从而实现 Java 程序的跨平台性。
Java 程序从源代码到运行主要有三步:
- 编译:将我们的代码(.java)编译成虚拟机可以识别理解的字节码(.class)
- 解释:虚拟机执行 Java 字节码,将字节码翻译成机器能识别的机器码
- 执行:对应的机器执行二进制机器码
二.基础语法
1.Java 有哪些数据类型?
定义:Java 语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。
Java 语言数据类型分为两种:基本数据类型和引用数据类型。
2.变量的类型转换
在程序中,经常需要对不同类型的数据进行运算,为了解决数据类型不一致的问题,需要对数据的类型进行转换。根据转换方式的不同,数据类型转换可分为自动类型转换和强制类型转换两种。
- 自动类型转换:指的是两种数据类型在转换的过程中不需要显式地进行声明,由编译器自动完成。自动类型转换必须同时满足以下两个条件:
(1):两种数据类型彼此兼容
(2):目标类型地取值范围大于源类型的取值范围。
例如下面的代码:
byte b=3;
int x=b;
在上面的代码中,使用byte类型的变量b为int类型的变量x赋值,由于int类型的取值范围大于byte类型的取值范围,编译器在复制过程中不会造成数据丢失,所以编译器能够自动完成这种转换,在编译时不报告任何错误。
- 强制类型转换:指的是两种数据类型之间的转换需要显式地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要强制类型转换。
//比如以下代码
int num=4;
byte b=num;
//这个代码会运行失败
在上面地代码中,程序会提示数据类型不兼容,不能将int类型转换成byte类型,原因是将一个int类型地值赋给byte类型地变量b时,由于int类型的取值范围大于byte类型的取值范围,这样的赋值会导致数值溢出,也就是说1字节的变量无法存储4字节的整数值。
应将上述代码改为如下代码:
//修改上面的代码
int num=4;
byte b=(byte) num;
//代码运行成功,结果为:4
3.运算符
- 赋值运算符
- 算数运算符
- 比较运算符
- 逻辑运算符
- 位运算符
4.&和&&有什么区别?
&运算符有两种用法:短路与、逻辑与。
&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是 true。
&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&。
例如:在验证用户登录时判定用户名不是 null 而且不是空字符串,应当写为username != null &&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的 equals 比较,否则会产生 NullPointerException 异常。
注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
5.break和continue的区别及作用?
- break 跳出整个循环,不再执行循环(结束当前的循环体)
- continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
三.面向对象(上)
1.解释下什么是面向对象?面向对象和面向过程的区别?
- 面向对象:是软件开发方法,一种编程范式,面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。例如:现实中的事物都抽象为“对象”。每个对象是唯一的,且都可以拥有它的属性与行为。
- ⾯向过程 :面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的一次调用就可以。
- 面向对象:面向对象,把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事件在解决整个问题的过程所发生的行为。目的是为了写出通用的代码,加强代码的重用,屏蔽差异性。
2.面向对象的三大特性?
- 封装:封装把⼀个对象的属性私有化,同时提供⼀些可以被外界访问的属性的⽅法。
- 继承:继承是使⽤已存在的类的定义作为基础创建新的类,新类的定义可以增加新的属性或新的方法,也可以继承父类的属性和方法。通过继承可以很方便地进行代码复用。
关于继承有以下三个要点:
- ⼦类拥有⽗类对象所有的属性和⽅法(包括私有属性和私有⽅法),但是⽗类中的私有属性和⽅法⼦类是⽆法访问,只是拥有。
- ⼦类可以拥有⾃⼰属性和⽅法,即⼦类可以对⽗类进⾏扩展。
- ⼦类可以⽤⾃⼰的⽅式实现⽗类的⽅法
- 多态:是同一个行为具有多个不同表现形式或形态的能力。
在 Java 中有两种形式可以实现多态:继承(多个⼦类对同⼀⽅法的重写)和接⼝(实现接⼝并覆盖接⼝中同⼀⽅法)
3.方法的重载
所谓方法重载就是在同一个作用域内,方法名相同但参数个数或者参数类型不同的方法。
方法重载的规则:
- 方法名一致,参数列表中参数的顺序,类型,个数不同。
- 重载与方法的返回值无关,存在于父类和子类,同类中。
- 可以抛出不同的异常,可以有不同修饰符。
//案例代码
//下面的方法实现两个整数相加
public static int add(int x,int y){
return x+y;
}
//下面的方法实现了三个整数相加
public static int add(int x,int y,int z){
return x+y+z;
}
//下面的方法实现了两个小数相加
public static int add(double x,double y){
return x+y;
}
上述代码定义了3个同名的add()方法,但他们的参数个数或类型不同,从而形成了方法的重载。另外需要注意的时,方法的重载与返回值类型无关。
4.类的定义
在面向对象的思想中最核心的就是对象,创建对象的前提是定义一个类。类是JAVA中一个重要的引用数据类型。类是对象的抽象,用于描述一组对象的共同特征和行为。类中可以定义成员变量和成员方法。成员变量用于描述对象的特征,成员变量也被称作对象的属性;成员方法用于描述对象的行为,可简称为方法。
类的定义格式如下:
class 类名{
成员变量;
成员方法;
}
//例如:
class Student{
String name;//声明一个String类型的变量name
int age;//声明int类型的变量age
//定义read()方法
void read(){
system.out.println("大家好,我是"+name+",我在看书!");
}
}
5.对象的创建与使用
在JAVA中使用new关键字创建对象,使用new关键字创建对象的具体格式如下:
类名 对象名=null;
对象名 =new 类名();
//或者写成
类名 对象名=new 类名();
//创建Student类的实例对象,示例代码如下:
Student stu=new Student();
创建对象后,可以使用对象访问类中的某个属性或方法,对象的属性或方法的访问通过点(.)运算符实现,具体格式如下:
对象名.属性名
对象名.方法名
//案例学习:
class Student{
String name;
void read(){
System.out.println("大家好,我是"+name);
}
}
public class Example{
public static void main(String[] args){
Student stu1=new Student();//创建第一个Student对象
Student stu2=new Student();//创建第二个Student对象
stu1.name="小明";//为stu1对象的name属性赋值
stu1.read(); //调用对象的方法
stu2.name="小红";
stu2.read();
}
}
6.访问修饰符 public、private、protected、以及不写(默认)时的区别?
Java 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。可以修饰在类、接口、变量、方法。
- private : 在同一类内可见。可以修饰变量、方法。注意:不能修饰类(外部类)
- public : 对所有类可见。可以修饰类、接口、变量、方法
- protected : 对同一包内的类和所有子类可见。可以修饰变量、方法。注意:不能修饰类(外部类)。
7.如何实现封装?
类的封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类提供的方法实现对内部信息的访问。
封装的具体实现过程是:再定义一个类时,将类中的属性私有化,即使用private关键字修饰类的属性。私有属性只能在它所在的类中被访问。如果外界想要访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用于获取属性值的getXxx()方法(也称为getter方法)和设置属性值的setXxx()方法(也称setter方法)。
8.构造方法
- 构造方法用来给类的成员声明初始化。
- 构造方法是一种特殊的方法,它的方法名与类名相同,并且没有返回值,也不需要使用void关键字修饰。
- 构造方法分为两种,无参构造器(默认构造方法)和有参构造器(自定义构造方法)
注意:
- 构造方法的名称必须与类名一致。
- 构造方法名称前不能有任何返回值类型的声明。
- 不能在构造方法中使用return返回一个值,但可以单独写return语句作为方法的结束。
//构造无参函数 public class Apple{ String name; float apple; public Apple(){ } } //构造有参函数 public class Apple{ String name; float apple; public Apple(int name, float apple){ this.name=name; this.apple=apple; } }
9.this关键字有什么作用?
- 使用this关键字调用本类中的属性:即形参与成员变量名字重名,用 this 来区分
public Person(String name,int age){
this.name=name;
this.age=age;
}
- 使用this关键字调用成员方法,可省略不写。
- 使用this关键字调用构造方法:即引用本类的构造函数
10.static关键字的作用
Static的特点
1、static是一个修饰符,用于修饰成员
2、static修饰的成员被所有的对象所共享
3、static优先于对象存在,因为static的成员随着类的加载就已经存在了
4、static修饰的成员多了一种调用方式,即可以直接被类名调用。类名.静态变量
5、static修饰的数据是共享数据,对象中的存储的是特有数据
public class Student {
// 非静态变量
public String name;
// 静态变量
public static int age = 22;
public static void main(String[] args) {
//通过先建对象调用
Student st1 = new Student();
System.out.println(st1.age);
//直接通过类名调用
System.out.println(Student.age);
}
}