1.什么是JavaBean类与测试类
描述一类事物的类叫做Javabean类,可以编写属性(成员变量)与行为(成员方法),不包含main方法。编写main方法的类叫做测试类。
一个代码文件中可以有多个类,但是用public修饰的只能是一个类,且该类名必须是代码文件名,建议一个Java文件中只写一个类
下面是JavaBean类与测试类的案例:
public class Phone1 {
public String brand;
public double price;
public void call(){
System.out.println("手机打电话");
}
public void playGame(){
System.out.println("原神,启动!");
}
public static void staticMethod(){
System.out.println("不创建对象但是可以调用对象的静态方法");
}
}
public class demo81 {
public static void main(String[] args) {
Phone1 phone =new Phone1();
phone.brand="小米";
phone.price=1999;
phone.call();
phone.playGame();
Phone1.staticMethod();
}
}
输出结果:
JavaBean类中,方法定义可以不加static的原因:main函数在没有实例化对象的时候不能调用非静态方法,这里因为会实例化phone,故可以写非静态方法。
2.什么是封装?封装的作用是什么?
封装:面向对象的三大特征之一(其他两个是继承和多态) 封装的意思是要合理地设计对象的属性和方法(是一种书写代码的方法) 一般流程:使用private用来修饰成员变量:(只能在本类中才能访问-----让该对象的数据更加安全),然后创建对应成员变量的get与set方法。 封装原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为
封装代码案例:
public class Phone2 {
private double price;
public double getPrice() {
return price;
}
public void setPrice(double price){
if (price>=0){this.price = price;}
else{System.out.println("输入错误"); }
}
}
//在Phone2中,在set方法中对数据进行范围限制,可以简化测试代码。
public class demo82 {
public static void main(String[] args) {
Phone2 phone=new Phone2();
phone.setPrice(-10000);
System.out.println(phone.getPrice());
phone.setPrice(10000);
System.out.println(phone.getPrice());
}
}
输出结果:
3.在JavaBean类的方法中变量的局部变量与全局变量的使用先后顺序?关键字this有什么用?
就近原则:方法中的变量会优先使用局部变量来表示。
this的作用:this.属性 能够引用该对象中的成员变量,在这里可以区分成员变量与局部变量
下面的案例可以帮助您理解
public class Phone3 {
private String brand;
public void setBrand1(String brand) {
//这句话相当于把形参赋值给形参
//在这个类中,外面的brand是成员变量,此方法内的是局部变量
brand = brand;
}
public void setBrand2(String brand1) {
//这里相当于定义了一个局部变量,把brand赋值给了局部变量,在这个类中定义的成员变量并没有被赋值
String brand = brand1;
}
public void setBrand3(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
public String getBrand1(){
String brand="局部变量";
return brand;
}
public String getBrand2(){
String brand="局部变量";
return this.brand;
}
}
public class demo83 {
public static void main(String[] args) {
Phone3 phone=new Phone3();
phone.setBrand1("小米");
System.out.println("1. 在set方法中把形参赋值给形参(与该对象中成员变量同名):"+phone.getBrand());
phone.setBrand2("小米");
System.out.println("2.在set方法中把形参赋值给新定义的局部变量(与该对象中成员变量同名):"+phone.getBrand());
phone.setBrand3("小米");
System.out.println("3.在set方法中使用this.brand把变量指向该对象的成员变量:"+phone.getBrand());
System.out.println("4.在get方法中定义新的局部变量(与该对象中成员变量同名)并返回:"+phone.getBrand1());
System.out.println("5.在get方法中定义新的局部变量并使用this.brand把变量指向该对象的成员变量:"+phone.getBrand2());
}
}
简单来说,如果你想要在某个对象的某个方法中改变该对象的某个属性,那就需要在这个方法中使用this.属性名去进行赋值。
输出结果:
4.构造方法是什么?构造方法有什么用?构造方法怎么写?一般如何写构造方法的代码?
在创建某类的对象时,会调用该类的构造方法进行初始化,在该类中没有写构造方法时虚拟机会帮您自动创建无参构造方法。需要注意的是在类中只写了有参构造方法就不能帮你自动生成无参构造方法了
构造方法的作用:
在创建对象的时候给成员变量进行初始化(赋值),这样可以不用Set方法进行赋值
构造方法的写法:
1.方法名与类名一致。
2.没有返回值,也不能在定义时写void
3.不能自己在测试类中写方法来调用,它是在创建对象时虚拟机自动调用的
构造方法推荐写法:
手动书写无参构造和带全部参数的构造方法
public class Phone4 {
private String brand;
public Phone4(){//无参构造方法,里面可以不写东西
System.out.println("新对象被创建啦!");
}
public Phone4(String brand){//有参构造(构造方法也可以方法重载)
this.brand=brand;
}
public String getBrand() {
return brand;
}
}
public class demo84 {
public static void main(String[] args) {
Phone4 phone=new Phone4();
Phone4 phone1=new Phone4("苹果");
System.out.println(phone1.getBrand());
}
}
输出结果:
5.Java中如何将小写字母的字符串全部转化为大写字母的字符串?
代码示例:使用字符串的toUpperCase方法即可。
public class demoA1 {
public static void main(String[] args) {
String s= "qwertyuiop";
System.out.println(s.toUpperCase(Locale.ROOT));
}
}
6.如何写一个标准的JavaBean类?
标准JavaBean: 1.private修饰成员变量 2.提供所有成员变量的GetSet方法 3.提供至少两个构造方法
案例:
public class User {
private String username;
private String passport;
private String email;
private String sex;
private int age;
//使用插件PTG快速生成标准JavaBean
public User() {
}
public User(String username, String passport, String email, String sex, int age) {
this.username = username;
this.passport = passport;
this.email = email;
this.sex = sex;
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassport() {
return passport;
}
public void setPassport(String passport) {
this.passport = passport;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "User{username = " + username + ", passport = " + passport + ", email = " + email + ", sex = " + sex + ", age = " + age + "}";
}
}
7.Java创建新对象时在内存中是如何存储的?
在JDK8以后,加载字节码文件的功能在元空间。
Java内存分布图如下(图来自于黑马程序员视频截图)
这里我们把元空间暂时称为方法区。
执行创建新对象的方法时(如Student s =new Student();)虚拟机,会做下列事情:
1.加载class文件(在方法区中储存Student类,内部会有这个类的所有信息:如所有成员变量与成员方法)
2.申明局部变量(在栈内存中对等号左边的变量s进行声明)
3.在堆内存中开辟一个空间存放对象(一块存成员变量,还有一块存成员方法的地址)
4.默认初始化(取值为false,0,null等)
5.显示初始化(在Student类中定义成员变量的时候赋值了的情况)
6.构造方法初始化(根据创建对象时调用的构造方法进行赋值)
7.把堆内存中地址值赋给栈内存中的局部变量
在程序执行完毕之后,main方法会从栈内存中消失,紧接着堆内存中的数据也会消失,方法区中的数据也会消失
7.Java中this代表什么?this的本质是什么?
一般我们在main函数中使用对象的方法的时候,会这么写:s.method()
this的内存原理:this表示所在方法调用者(也就是s)的地址值
虚拟机会从栈内存找到堆内存再找到方法区中存储的对象的方法。如果说method()里面用到了this,那么这个this会代表调用它的s(也就是在main函数中),而this的本质也就是地址值。
方法是在栈中存储的,也就是说,在这个方法中this.属性总是会指向堆内存中的数据,与栈内存(这个方法)内的数据无关。
如果我有两个变量s1,s2.。我现在都要用到set方法去赋值:
s1.set属性的这个方法中,把接收到的属性赋值给了对象s1所存储的地址中的属性(this.属性)。
s2.set属性的这个方法中,把接收到的属性赋值给了对象s2所存储的地址中的属性(this.属性)。
下面是示例代码:
public class Phone5 {
private String brand;
public void getThis() {
System.out.println("输出this:表示调用这个方法的对象的地址"+this);;
}
}
public class demo85 {
public static void main(String[] args) {
Phone5 phone=new Phone5();
Phone5 phone1=new Phone5();
System.out.println("输出该对象的地址"+phone);
phone.getThis();
System.out.println("输出该对象的地址"+phone1);
phone1.getThis();
}
}
输出结果:
8.IDEA小技巧
在idea上方的类标签栏可以点右键选择分离界面,从而能够在页面上显示两个文件的代码