头歌java面向对象程序设计继承与多态答案_java


本文内容:

  • 面向对象
  • 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());
    }
}

头歌java面向对象程序设计继承与多态答案_开发语言_02


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());
    }
}