在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第八篇博客。
本篇博客介绍了Java中的类和对象,以及封装。
本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11。
目录
类和对象
类的定义
类是Java程序的基本组成单位。类是对现实生活中一类具有共同属性和行为的事物的抽象。
类由属性和行为组成。属性在类中通过成员变量体现(类中方法外的变量)。行为在类中通过成员方法来体现(去掉static修饰的方法)。
类的定义格式是:
public class 类名{
变量1数据类型 变量1;
变量2数据类型 变量2;
变量3数据类型 变量3;
...
public 返回值类型 方法1(...){
...
}
public 返回值类型 方法2(...){
...
}
public 返回值类型 方法3(...){
...
}
...
}
手机类
下面代码创建了phone类。
public class phone {
String brand;
int price;
public void call(){
System.out.println("Call");
}
public void message(){
System.out.println("Message");
}
}
phone类中有String类型的brand和int类型的price两个变量,有无返回值的call方法和无返回值的message方法。
对象的使用
创建对象的格式是:
类名 对象名 = new 类名();
使用成员变量的格式是: 对象名.变量名
使用成员方法的格式是:对象名.方法名(参数)
public class usephone {
public static void main(String[] args){
phone ph = new phone();
System.out.println("The brand is " + ph.brand);
System.out.println("The price is " + ph.price);
ph.brand = "Apple";
ph.price = 3000;
System.out.println("The brand is " + ph.brand);
System.out.println("The price is " + ph.price);
ph.call();
ph.message();
}
}
这段代码创建了上面的phone类的对象。并访问了对象的成员变量和成员方法。
程序的输出是:
The brand is null
The price is 0
The brand is Apple
The price is 3000
Call
Message
学生类
public class student {
String name;
int age;
public void study(){
System.out.println("I study very hard");
}
public void homework(){
System.out.println("I do homework very careful");
}
}
这段代码创建了student类,有一个String类型的成员name,和一个int类型成员age。student类中有两个没有返回值的方法:study和homework。
public class studenttest1 {
public static void main(String[] args){
student stu = new student();
stu.name = "Li hua";
stu.age = 18;
System.out.println("The name is " + stu.name);
System.out.println("The age is " + stu.age);
stu.study();
stu.homework();
}
}
这段代码创建了一个student类对象stu,并访问了成员变量和成员方法。
程序的输出是:
The name is Li hua
The age is 18
I study very hard
I do homework very careful
多个对象
对象的成员变量位于堆内存,成员方法位于栈内存。
public class studenttest2 {
public static void main(String[] args){
student stu1 = new student();
stu1.name = "Simon";
stu1.age = 18;
System.out.println("The name is " + stu1.name);
System.out.println("The age is " + stu1.age);
stu1.study();
stu1.homework();
student stu2 = new student();
stu2.name = "Sam";
stu2.age = 20;
System.out.println("The name is " + stu2.name);
System.out.println("The age is " + stu2.age);
stu2.study();
stu2.homework();
}
}
此代码创建了两个student类的变量。(此类的定义见上方)
程序的输出是:
The name is Simon
The age is 18
I study very hard
I do homework very careful
The name is Sam
The age is 20
I study very hard
I do homework very careful
如果多个对象指向同一块内存,那么修改一个对象会影响其他对象。
public class studenttest3 {
public static void main(String[] args){
student stu1 = new student();
stu1.name = "Simon";
stu1.age = 18;
System.out.println("The name is " + stu1.name);
System.out.println("The age is " + stu1.age);
stu1.study();
stu1.homework();
student stu2 = stu1;
stu2.name = "Sam";
stu2.age = 20;
System.out.println("The name is " + stu2.name);
System.out.println("The age is " + stu2.age);
stu2.study();
stu2.homework();
System.out.println("The name is " + stu1.name);
System.out.println("The age is " + stu1.age);
stu1.study();
stu1.homework();
}
}
程序的输出是
The name is Simon
The age is 18
I study very hard
I do homework very careful
The name is Sam
The age is 20
I study very hard
I do homework very careful
The name is Sam
The age is 20
I study very hard
I do homework very careful
stu1和stu2是指向同一块内存,通过stu2修改了stu1中的成员变量。
成员变量和局部变量
成员变量位于类中方法外,占用堆内存,随着对象的存在而存在,随着对象的消失而消失,有默认初始化值。
局部变量位于方法内或方法声明上,占用栈内存,随着方法的调用而存在,随着方法的结束而消失。局部变量没有默认的初始化值,必须定义,赋值,然后才能使用。
封装
private关键字
private是权限修饰符,可以修饰类的成员(可以是成员变量,也可以是成员方法)。private保护成员不被其他类使用,被private修饰的成员在本类中才能访问。
对于被private修饰的成员变量,如果需要被其他类使用,需要提供相应操作。
提供get变量名()方法,获取成员变量的值,方法用public修饰。
提供set变量名(参数)方法,设置成员变量的值,方法用public修饰。
public class privatestudent {
String name;
private int age;
public int getage(){
return age;
}
public void setage(int number){
age = number;
}
public void show(){
System.out.println("The name is " + name);
System.out.println("The age is " + age);
}
}
这段代码设计了一个privatestudent类,其中成员age被设置为private。该类提供了getage和setage方法来访问age变量,还有show方法用于输出信息。
public class privatestudenttest1 {
public static void main(String[] args){
privatestudent test = new privatestudent();
test.name = "Student";
test.setage(10);
test.show();
}
}
这段代码实例化了privatestudent类的对象,并进行了一些操作。
程序的输出是:
The name is Student
The age is 10
public class privatestudenttest2 {
public static void main(String[] args){
privatestudent test = new privatestudent();
test.name = "Charley";
test.setage(17);
System.out.println("The student's name is " + test.name);
System.out.println("The student's age is " + test.getage());
}
}
这段代码实例化了privatestudent类的对象,并进行了一些操作。
程序的输出是:
The student's name is Charley
The student's age is 17
this关键字
this修饰的变量用于指代成员变量。
方法的形参如果与成员变量同名,那么不带this修饰的变量指的是形参,而不是成员变量。this可以解决局部变量名覆盖成员变量的问题。
this.成员变量名表示调用对象的成员变量。
public class studentthis {
private String name;
private int age;
public String getname(){
return name;
}
public void setname(String name){
this.name = name;
}
public int getage(){
return age;
}
public void setage(int age){
this.age = age;
}
public void show(){
System.out.println("The student's name is " + name);
System.out.println("The student's age is " + age);
}
}
studentthis类有name和age两个private修饰的成员变量。并且在成员方法中用this区分成员变量和局部变量。
public class studentthistest {
public static void main(String[] args){
studentthis stu = new studentthis();
stu.setname("John");
stu.setage(15);
stu.show();
}
}
这段代码通过实例化一个对象进行测试。程序的输出是:
The student's name is John
The student's age is 15
封装
封装是面向对象编程的三大特征之一。另外两个是继承和多态。封装是对客观世界的模拟,客观世界中成员变量是隐藏在对象内的,外界无法直接访问。
封装将类的某些信息隐藏在类内部,不允许被外部直接访问,而是通过该类提供的方法实现操作和访问。成员变量用private修饰,并提供对应的get和set方法。
封装通过方法控制成员变量的操作,提高了代码的安全性和复用性。