1. private关键字以及get和set方法
private关键字
1. private是一个权限修饰符
2. 表示私有,被private修饰的成员只能在本类中访问。
3. private可以修饰成员变量,也可以修饰成员方法。
如果类中的属性使用private修饰了,那么该属性无法在外界使用了,这样也是不行的,我们要提供一些方式让外界 去使用这个变量。
我们可以提供一个方法,让外界给private修饰的属性赋值, 这个方法名叫做setXXX
我们还要提供一个方法,让外界获取private修饰的属性值, 这个方法名叫做getXXX加粗样式
/*
学生类
属性:
姓名,年龄
行为:
show方法,展示自己的行为,调用show方法后,可以输出自己的姓名和年龄。
目前因为可以直接访问到对象的属性,所以可以给对象的属性赋值成任何内容。
如果我们不让外界直接访问到这个对象的属性,那么就可以进行限制了。
*/
public class Student {
//姓名
String name;//小波老师
//年龄
private int age;//18
//定义方法,用来让外界获取age属性值
public int getAge() {
return age;
}
//定义方法,用来让外界给age属性赋值
public void setAge(int a) {
//使用if进行判断,如果传递过来的年龄是合法的年龄,再赋值
if(a > 0 && a <= 200) {
age = a;
} else {
System.out.println("年龄有误");
}
}
//show方法,可以将自己的姓名和年龄输出
public void show() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
测试类:
/*
学生类的测试类
*/
public class Demo01StudentTest {
public static void main(String[] args) {
//创建学生对象
Student stu = new Student();
//给学生对象的属性赋值
stu.name = "小波老师";
stu.setAge(18);
//调用对象的show方法,输出姓名年龄
stu.show();
//单独获取stu的age属性值
System.out.println(stu.getAge());
}
}
2. 标准的private代码
/*
学生类
属性:
姓名,年龄。 属性要加私有
方法:
get/set
set方法没有返回值,有参数。
get方法有返回值,没有参数。
*/
public class Student {
//定义姓名和年龄属性
private String name;
private int age;
//getName让外界获取name属性的值
public String getName() {
return name;
}
//setName 让外界给name属性赋值
public void setName(String n) {
name = n;
}
//getAge
public int getAge() {
return age;
}
//setAge
public void setAge(int a) {
age = a;
}
}
/*
测试类
*/
public class Demo01StudentTest {
public static void main(String[] args) {
//创建学生对象
Student stu = new Student();
//给属性赋值
stu.setName("小泽老师");
stu.setAge(24);
//获取属性的值,然后输出
System.out.println("姓名:" + stu.getName());
System.out.println("年龄:" + stu.getAge());
}
}
3. 封装的概述
封装是面向对象三大特征之一, 另外两个分别是继承和多态。
封装指的是隐藏具体的实现,然后提供公共的对外访问方式。
目前代码封装的体现:
使用private将属性私有(隐藏), 然后提供了get/set(访问方式)
封装的好处:
1. 提高代码的安全性。
2. 可以提高代码的复用性
4. this关键字的作用
如果在一个类中局部变量和成员变量同名,那么可以使用this去区分它们。
使用this表示的是成员变量,格式:
this.变量名
this可以解决的问题: 局部变量和成员变量同名的问题。
this的含义: this所在的方法是通过哪个对象调用的,this就表示哪个对象(this中真正存放的是对象的地址值,或者说对象的引用)
/*
成员变量和局部变量允许重名。
如果局部变量和成员变量同名,那么访问到时局部变量。
*/
public class Student {
//定义姓名和年龄属性
private String name;//"小泷老师"
private int age;
public String getName() {
return name;
}
public void setName(String name) {//="小泷老师"
System.out.println("this:" + this);
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 测试类
/*
学生类的测试类
*/
public class Demo01StudentTest {
public static void main(String[] args) {
//创建Student对象
Student stu = new Student();
System.out.println("stu:" + stu);
//给属性赋值。
stu.setName("小泷老师");
stu.setAge(30);
//输出该属性的值
System.out.println("姓名:" + stu.getName() + ", 年龄:" + stu.getAge());
}
}
5. 构造方法的介绍
构造方法作用: 用来在创建对象的时候给属性赋值。
构造方法的格式:
public 构造方法名(参数列表) {
构造方法体;
}
1. 构造方法不需要写返回值类型,连void都不用写
2. 构造方法名必须和类名一致
3. 构造方法不能return任何东西,但是单独写一个return是可以的, return一般省略。
构造方法的调用:
构造方法是在创建对象的时候自动调用的。
new 数据类型(); 这个操作是在创建对象, 此时就会调用构造方法。
在创建对象的时候小括号中我们可以传递一些参数, 程序会根据传递的参数调用对应的构造方法。
构造方法的注意事项:
1. 如果在一个类中我们没有给出构造方法,那么系统会帮我们提供一个空参数的构造方法。
2. 如果在一个类中我们给出了构造方法,那么系统就不会帮我们提供这个空参数的构造方法了。
3. 构造方法支持重载。
public class Student {
//提供两个属性(姓名,年龄)
private String name; //小明同学
private int age; //20
//提供show方法,用来输出学生对象的姓名和年龄。
public void show() {
System.out.println("name:" + name + ", age:" + age);
}
//提供构造方法,用来在创建对象的时候给属性赋值
public Student(String name, int age) {//name="小明同学" age=20
this.name = name;
this.age = age;
}
//为了保证以最常用的方式也能创建对象,手动提供一个空参数的构造方法
public Student() {
}
}
- 测试类
/*
构造方法的调用
构造方法是在创建对象的时候自动调用的。
new 数据类型(参数)
*/
public class Demo01StudentTest {
public static void main(String[] args) {
//创建Student对象, 执行空参数的构造方法
//因为创建对象的时候小括号中没有写任何东西,那么使用的就是空参数的构造方法。
//Student s1 = new Student();
//创建Student对象, 执行一个参数是字符串的构造方法
//因为创建对象的时候小括号中写的是一个字符串,所以使用的就是一个参数是字符串的构造方法。
//Student s2 = new Student("你好");
//Student s3 = new Student();
//调用一个参数是int的构造方法
//Student s4 = new Student(100);
//创建对象,在创建对象的时候直接给属性赋值
Student stu = new Student("小明同学", 20);
stu.show();
}
}
6. 标准的学生类的定义
- Student类
/*
javabean就是Java编写类的规范, 只要一个类符合这些规范,那么这个类就可以称为是一个Javabean。
Javabean规范
1. 将属性私有。
2. 提供get/set方法
3. 提供空参数的构造方法(必须),提供有参数的构造方法(选做,现阶段建议做)
定义一个学生类,提供姓名和年龄属性, 要求满足Javabean规范。
*/
public class Student {
//给出姓名和年龄属性
private String name;
private int age;
//提供空参数的构造方法
public Student() {
}
//提供有参数的构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//提供get/set方法
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 class Demo01StudentTest {
public static void main(String[] args) {
//使用空参数构造方法创建Student对象
Student stu = new Student();
//给stu的属性赋值
stu.setName("宝强同学");
stu.setAge(25);
//输出属性的值
System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge());
System.out.println("==========================");
//使用有参数的构造方法创建Student对象,创建对象的时候直接给属性赋值
Student stu2 = new Student("乃亮同学", 40);
//stu2.setAge(41);
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
}
}
7. 字符串的介绍
/*
String类表示字符串, 字符串就是由一串字符组成的数据。
字符串本质就是一个字符数组, 内部就是在使用一个字符数组保存数据。
扩展:
在JDK8以及之前的版本,字符串是在用char[]保存数据。
在JDK9以及之后的版本,字符串是在用byte[]保存数组
直接使用双引号写出来的字符串,都是字符串对象。 比如:"hello", "你好"
字符串具有不变性, 他们的值在创建后不能更改。
字符串是可以被共享的
String str1 = "abc";
String str2 = "abc";
String所在的包是java.lang, lang包下的东西都是一些常用的东西,那么在使用的时候一个优化,是不需要导包的。
*/
public class Demo01String {
public static void main(String[] args) {
//定义一个字符串
String str = "hello";
str = "world";
System.out.println("str:" + str);
}
}
8. 字符串的构造方法
public class Demo02String {
//数据类型 对象名 = new 数据类型(参数);
public static void main(String[] args) {
//String(): 空参数构造方法
String s1 = new String(); //String s1 = "";
System.out.println("s1:" + s1);
//String(String original): 参数要传递字符串
String s2 = new String("hello");
System.out.println("s2:" + s2); //hello
//String(char[] value):参数要传递char数组
char[] cArr = {'a', 'b', 'c', 'd', 'e'};
String s3 = new String(cArr); //字符数组中有什么内容,那么创建出来的字符串中就有什么内容。
System.out.println("s3:" + s3);//abcde
//String(byte[] bytes): 参数要传递byte数组
byte[] bArr = {97, 98, 99};
String s4 = new String(bArr);//如果根据byte数组创建字符串, 那么会先查询ASCII码表,把数字 转成字符,然后根据这些字符创建字符串。
System.out.println("s4:" + s4);//abc
//直接赋值
String s5 = "hello";
System.out.println("s5:" + s5);//hello
}
}
9. new的方式创建字符串和直接赋值创建字符串的区别
/*
字符串new对象和直接赋值创建对象的区别。
==在比较基本类型和引用类型的时候是有区别的。
如果==比较基本类型的数据,比较的是具体的值。
如果==比较引用类型的数据,比较的是地址值。
new的方式创建字符串和直接赋值创建字符串的区别
new的方式创建字符串是由栈指向堆,再由堆指向常量池。
直接赋值创建字符串是直接由栈指向常量池。
*/
public class Demo03String {
public static void main(String[] args) {
//创建字符串
String s1 = new String("hello");
String s2 = "hello";
System.out.println("s1:" + s1); //hello
System.out.println("s2:" + s2); //hello
System.out.println("s1==s2:" + (s1 == s2)); //false
//定义字符串
String s3 = "hello";
System.out.println("s1==s3:" + (s1 == s3)); //false
System.out.println("s2==s3:" + (s2 == s3)); //true
}
}