Java基础--面向对象(Ⅱ)

前面内容请见: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(垃圾回收器回收)
      • 一般情况:匿名对象使用一次即可,这样不需要过多的去开辟堆内存空间,直接被回收
    • 匿名对象可以作为参数传递
  • 注意

    • 方法的形式参数如果是基本类型,调用该方法的时候,实际参数只需要传递对应的数据值即可
    • 方法的形式参数如果是引用类型:数组,类,接口,实际参数在进行传递时需要传递,当前数组对象 /类的对象/接口的对象

方法形式参数如果是一个类(引用类型),当调用该方法时,实际参数应当如何传递

  • 如果方法的形式参数是类,实际参数传递时,需要传递的是当前类的具体类对象

    • 参数名.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());
        }
    }
    


欢迎大家阅览

  • 2
    点赞
  • 0
    收藏 更改收藏夹
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

In-Deep

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值