本文内容:
- 面向对象
- 1.测试类
- 2.封装
- 3.局部变量和成员变量的区别
- 4.this关键字
- 5.匿名对象
面向对象
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(垃圾回收器回收)
- 一般情况:匿名对象使用一次即可,这样不需要过多的去开辟堆内存空间,直接被回收
- 匿名对象可以作为参数传递
- 注意
- 方法的形式参数如果是基本类型,调用该方法的时候,实际参数只需要传递对应的数据值即可
- 方法的形式参数如果是引用类型:数组,类,接口,实际参数在进行传递时需要传递,当前数组对象 /类的对象/接口的对象
方法形式参数如果是一个类(引用类型),当调用该方法时,实际参数应当如何传递
• 如果方法的形式参数是类,实际参数传递时,需要传递的是当前类的具体类对象
• 参数名.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());
}
}