前面内容请见:Java基础–数组和面向对象(Ⅰ)
活动地址:CSDN21天学习挑战赛
面向对象
1.测试类
- 里面是主方法main
- 代码中体现创建这个类对象 :创建具体的对象的格式
- 类名 对象名 = new 类名();
- 对象名.成员变量名 = 赋值;//成员变量赋值
- 对象名.成员方法名(); //调用成员方法
- 代码中体现创建这个类对象 :创建具体的对象的格式
public class PetTest {
public static void main(String[] args) {
Pet pet = new Pet(); //创建具体的对象
//成员变量赋值
pet.name = "团子";
pet.age = 6;
pet.color = "灰白相间";
pet.varieties = "哈士奇,俗称二哈";
//调用成员方法
pet.show();
pet.function();
}
}
2.封装
-
将公共对象私有化(加入一个关键字private),只能在当前类访问,对外数据的安全性!(外界不能访问的),通过封装对外提供一个方法,公共的(public)访问方法(setXXX()/getXXX()),来从外界访问
-
private关键字的特点
-
被private修饰的成员变量和成员方法,只能在本类中进行访问
-
private可以修饰成员变量也可以成员方法,目的就是为了外界不能去直接访问
-
被private修饰的成员变量或者成员方法,可以间接的通过公共的方法来访问;
-
-
举例
//定义类 public class User { private String userName; private String name; private int age; private String sex; private String professional; //设置公共类,供外界录入和输出 public void setUserName(String userName) { this.userName = userName; } public String getUserName() { return userName; } public String getName() { if (userName.equals("admin")){ //权限设置 return name; }else { return "无权限"; } } public void setName(String name) { this.name = name; } public int getAge() { if (userName.equals("admin")){ return age; }else { return -1; } } public void setAge(int age) { this.age = age; } public String getSex() { if (userName.equals("admin")){ return sex; }else { return "无权限"; } } public void setSex(String sex) { this.sex = sex; } public String getProfessional() { if (userName.equals("admin")){ return professional; }else { return "无权限"; } } public void setProfessional(String professional) { this.professional = professional; } } //测试类 import java.util.Scanner; public class UserTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入管理员姓名:"); String userName = scanner.next(); User user = new User(); user.setUserName(userName); user.setName("一叶知秋"); user.setAge(28); user.setSex("男"); user.setProfessional("战士"); System.out.println(user.getName()); System.out.println(user.getAge()); System.out.println(user.getSex()); System.out.println(user.getProfessional()); } }
3.局部变量和成员变量的区别
-
书写位置不同:
-
成员变量:在类中,方法外
-
局部变量:在方法定义中,或者方法声明上
-
-
内置中的位置不同 * 成员变量:堆内存中,和对象有关系 * 局部变量:栈内存中,和方法有关系
-
生命周期不同: * 成员变量:随着对象的创建而存在,随着对象的创建完毕后,等待jvm的垃圾回收器(GC)空闲的时候回收而消失 * 局部变量:随着方法的调用而存在,随着方法调用结束而消失
-
初始化值不同: * 成员变量:是可以不初始化的,需要通过对象名来赋值,存在默认初始化 * 局部变量:必须在使用之前初始化,否则报错;
-
什么时候把一个变量定义为成员变量? * 如果一个类能够描述这个事物的属性,必须为定义成员变量 * 否则,都定义为局部变量
//定义一个类 Demo
class Demo{
//成员变量:类中方法外
public int num ;
public void show(String a){
//局部变量
int x = 5 ; //必须使用之前初始化,否则编译会报错--报错信息Variable 'x' might not have been initialized
System.out.println(a+x);
}
}
//测试类
public class VariableDemo {
public static void main(String[] args) {
//要去访问Demo类中num变量
Demo d = new Demo() ;
System.out.println(d.num); //对象名.成员变量名;
d.show("胡歌");
}
}
4.this关键字
-
代表当前类对象的地址值引用
-
目的:就是为了区分局部变量隐藏了成员变量,加入this可以区分
-
-
格式
- this.成员变量名 = 局部变量名 ;
/*手机有品牌(brand),价格,颜色,内存等属性,手机可以打电话,发短信,打游戏等行为,
请使用面向对象的方式描述手机并且进行测试*/
public class Phone {
private String brand;
private double price;
private String color;
private String memory;
public void setBrand(String brand){
this.brand = brand;
}
public void setPrice(double price){
this.price = price;
}
public void setColor(String color){
this.color = color;
}
public void setMemory(String memory){
this.memory = memory;
}
public String getBrand(){
return brand;
}
public double getPrice(){
return price;
}
public String getColor(){
return color;
}
public String getMemory(){
return memory;
}
public void callPhone(String toName){
System.out.println("在用" + brand + "," + "给" + toName + "打电话");
}
public void sendMsg(String toName){
System.out.println("在用" + brand + "," + "给" + toName + "发短信");
}
public void playGame(String toGame){
System.out.println("在用" + brand + "," + "玩" + toGame);
}
}
5.匿名对象
-
匿名对象:毋庸置疑,没有名字的对象;
-
匿名对象的格式
- new 类名();
-
优点
- 直接在堆内存开辟空间,创建完毕之后,没有栈内存指向,所以使用完毕,立即被GC(垃圾回收器回收)
- 一般情况:匿名对象使用一次即可,这样不需要过多的去开辟堆内存空间,直接被回收
- 匿名对象可以作为参数传递
- 直接在堆内存开辟空间,创建完毕之后,没有栈内存指向,所以使用完毕,立即被GC(垃圾回收器回收)
-
注意
- 方法的形式参数如果是基本类型,调用该方法的时候,实际参数只需要传递对应的数据值即可
- 方法的形式参数如果是引用类型:数组,类,接口,实际参数在进行传递时需要传递,当前数组对象 /类的对象/接口的对象
方法形式参数如果是一个类(引用类型),当调用该方法时,实际参数应当如何传递
如果方法的形式参数是类,实际参数传递时,需要传递的是当前类的具体类对象
- 参数名.study(): ----参数名一定要是空间地址值,则需要创建具体的学生对象
//定义一个类Demo class Demo{ //成员方法 public int add(int a,int b){ //方法的形式参数是基本类型 return a+ b ; } } //定义一个学生类 class Student{ public void study(){ System.out.println("好好学习,天天向上!"); } } //定义一个StudentDemo类对象 class StudentDemo{ //成员方法method public void method(Student student){ //引用类型:数组,类或者接口 方法形式参数类型:Student类型 //参数名.study(): ---参数名一定要是空间地址值,则需要创建具体的学生对象 student.study() ; } } //测试类 public class StudentTest { public static void main(String[] args) { //1.方法的形式参数是基本类型: Demo d = new Demo() ; int result = d.add(15,15) ; System.out.println("结果为:"+result); System.out.println("----------------------------------------------") ; //2.要访问StudentDemo类中的method方法? //创建StudentDemo类的对象 //类名 对象名 = new 类名() ; StudentDemo sd = new StudentDemo() ; //创建Student类具体对象 Student student = new Student() ; sd.method(student) ;//方法的形式参数Student类型,所有需要将Student具体对象创建出来才能调用 //链式编程,匿名对象作为参数(一般不推荐) new StudentDemo().method(new Student()); } }
欢迎大家阅览