码迷,mamicode.com
首页 > 其他好文 > 详细

Practice| 面向对象

时间:2018-11-25 20:30:04      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:显示   balance   inpu   course   one   父类继承   out   temp   超过   

 

实参与形参的传递机制

class MianShiTi{
    String str = new String("good idear"); //创建字符串对象;
    char[] ch = {‘a‘,‘b‘,‘c‘,‘d‘}; //创建数组;
    
    public static void main(String[] args){
        MianShiTi m = new MianShiTi(); //创建一个对象;
        
        exchange(m.str, m.ch);
        //m.str没有变,m.ch的[1]变了
        System.out.println(m.str); //good idear ,它们是两个无关的str
        System.out.println(m.ch); //a*cd
    
    
    
        String s = "bbbb";
        StringBuffer b = new StringBuffer("bbbb");
        change(s,b);
        //s不可变,s仍然"bbbb"
        //b的内容就从"bbbb" ---> "aaaa"
        System.out.println(s+b); //bbbbaaaa
    
    }

    public static void exchange(String str, char[] ch){ //两个都是引用数据类型String和char[]数组,
        str = "Hello World"; //字符串对象是不可变的,一旦修改str=xxx,就是产生新的对象,和原来的"实参"无关
        System.out.println(str); //Hello World
        ch[1] = ‘*‘;  //数组元素是可变的,ch形参和上面的m.ch实参指向的是同一个数组,所以ch[1]修改,就是修改m.ch[1]
        System.out.println(ch); //a*cd
    }
    
    
    private static void change(String s, StringBuffer b){  //两个形参为String类型和 类 都是引用数据类型
        s = "aaa";
        b.setLength(0);//b的长度设置为0,相当于清空原来b中内容
        b.append("aaaa");//append表示追加,又追加了aaaa
    }
    
    
    
}
public class MainTest{
    public static void test(String str){
        str = "hello";
    }
    public static void main(String[] args){
        String str = "beijing"; 
        test(str);
        System.out.println(str);  //beijing
    }
}

 用数组来管理属性、对象等

/*
(1)声明一个日期类型MyDate:有属性:年year,月month,日day
(2)创建2个日期对象,分别赋值为:你的出生日期,你对象的出生日期,放到数组中
(3)遍历显示
*/
技术分享图片
public class TestMydate {

    public static void main(String[] args) {
        MyDate[] arr = new MyDate[2]; //创建长度为2的数组
        
        arr[0] = new MyDate();  //引用数据类型需要给它赋值一个对象;
        
        arr[0].year = 1994;
        arr[0].month = 7;
        arr[0].day = 7;
        
        arr[1] = new MyDate();
        arr[1].year = 1996;
        arr[1].month = 7 ;
        arr[1].day = 7;
        
        for(MyDate num : arr){
            System.out.println(num.year + "-" + num.month + "-" + num.day);
        }
        
View Code

 

 

class TestTeacher{
    public static void main(String[] args){

        //用数组来管理属性,创建的对象,排序等
        Teacher[] arr = new Teacher[5];  //声明一个一维数组,来存储5个Teacher的对象; 
        arr[0] = new Teacher();         //arr[0]代表一个元素,是Teacher类型(引用数据类型),需要赋值为一个Teacher对象;
        arr[0].name = "kris";
        arr[0].age = 18;
        arr[0].gender = ‘男‘;
        arr[0].course = "java";
        
        Teacher t2 = new Teacher();
        t2.name = "alex";
        t2.age = 11;
        t2.gender = ‘女‘;
        t2.course = "Mysql";
        arr[1] = t2;
        
        for(int i = 0;i < arr.length;i++){
            //arr[i]是一个Teacher的对象
            //Exception in thread "main" java.lang.NullPointerException空指针异常
            //一旦报NullPointerException,说明对象是null
            //arr[i]是否是null?
            //if(arr[i] != null){
                System.out.println(arr[i].name + "\t" + arr[i].age + "\t" + arr[i].gender + "\t" +arr[i].course);
            //}
            
        }
        
    }
}

class Teacher{
    String name;
    int age;
    char gender;
    String course;
}

 

练习2
声明一个圆类Circle,有属性半径radius
声明一个测试类TestCircleArray,
在main方法中,创建一个Circle数组,长度为3,并创建三个Circle对象放到数组中,
遍历显示数组,显示每一个圆的半径、面积

然后在对Circle数组进行排序,按照半径从小到大,再次遍历显示数组,显示每一个圆的半径、面积
*/

class TestCircle2{
    public static void main(String[] args){
        
        Circle[] arr = new Circle[3]; //创建一个Circle数组,长度为3,默认值都为null
        
        //创建3个Circle对象放到数组中,   动态输入创建
        java.util.Scanner input = new java.util.Scanner(System.in);
        for(int i = 0; i < arr.length;i++){
            arr[i] = new Circle(); //先创建圆Circle的对象
            System.out.print("请输入圆的半径:");
            arr[i].radius = input.nextDouble();
            System.out.println("半径" + arr[i].radius + "\t" + "面积" + Math.PI * arr[i].radius * arr[i].radius);
        }
        /* //静态输入
        arr[0] = new Circle();
        arr[1] =  new Circle();
        arr[2] =  new Circle();
        
        arr[0].radius = 2.0;
        arr[1].radius = 3.0;
        arr[2].radius = 1.0;
        */
        //冒泡排序按从小到大顺序排,需要排arr.length-1次,大的就往后
        //第一轮:i=1,j=0,1两次
        //第二轮:i=2,j=1一次
        for(int i = 1; i < arr.length;i++){
            for(int j = 0;j < arr.length-i;j++){ //如果前面的圆的半径比较后面的圆的半径大,就交换两个圆
                if(arr[j].radius > arr[j+1].radius){  //比较的是圆的半径,对象需要.半径属性
                    Circle temp = arr[j];//temp的类型和arr[j]和arr[j+1]一样,它俩是Circle
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            
        }
        
        for(int i = 0; i < arr.length;i++){
            System.out.println(arr[i].radius);
        }
    }

}
class Circle{
    double radius;

}

 

练习3
(1)声明一个丈夫类型Husband,有属性:姓名,年龄,妻子,其中妻子是Wife类型
(2)声明一个妻子类型Wife,有属性:姓名,年龄,丈夫,其中丈夫是Husband类型
(3)创建一个丈夫对象,创建一个妻子对象,并显示他们的信息

*/
class Test3{
    public static void main(String[] args){
        
        Husband hus = new Husband(); //hus丈夫对象;
        hus.name = "kris"; 
        hus.age = 20; 
        
        Wife wif = new Wife();         //wif妻子对象;
        wif.name = "xka";
        wif.age = 19;
        
        hus.qi = wif;   //qi为引用数据类型,必须给它赋值一个对象;
        wif.fu = hus;
        
        System.out.println("丈夫的信息:"+hus.name + "\t" + hus.age + "\t" + "妻子的信息:" + hus.qi.name + hus.qi.age);
        System.out.println("妻子的信息:" + wif.name + "\t" + wif.age + "\t" +"丈夫的信息:"+ wif.fu.name);
        
    }
}


class Husband{
    String name;
    int age;
    Wife qi;

}

class Wife{
    String name;
    int age;
    Husband fu;

}

 

/*
2、练习2
(1)声明一个日期类型MyDate,包含年、月、日
(2)声明一个员工类,包含属性:姓名、薪资、生日,其中生日是MyDate类型
(3)声明一个测试类,在main方法中,声明一个数组,创建三个员工对象,并为属性赋值
(4)遍历显示员工信息,并且按照生日排序
(5)遍历显示员工信息,按照薪资排序
*/

class Test2{
    public static void main(String[] args){
        Staff[] arr = new Staff[3]; //声明一个数组,创建员工对象,并为他们赋值;
        
        java.util.Scanner input = new java.util.Scanner(System.in);
        
        for(int i = 0; i < arr.length; i++){
            arr[i] = new Staff();
            System.out.print("请输入员工姓名:");
            arr[i].name = input.next();
            System.out.print("员工薪资:");
            arr[i].salary = input.nextInt();
            System.out.println("请输入员工生日");
            arr[i].birthday = new MyDate();  //birthday为引用数据类型,必须给它赋值一个对象;
            System.out.print("年:");
            arr[i].birthday.year = input.nextInt();
            System.out.print("月:");
            arr[i].birthday.month = input.nextInt();
            System.out.print("日:");
            arr[i].birthday.day = input.nextInt();
        }
        System.out.println("姓名\t" + "薪资\t" + "生\t日");
        //遍历显示员工信息;foreach循环
        //for(元素的数据类型 元素名 : 数组名){}
        for(Staff num : arr){
            //System.out.println(arr[i].name + "\t" + arr[i].salary + "\t" + arr[i].birthday.year + "-" + arr[i].birthday.month + "-" + arr[i].birthday.day);
            System.out.println(num.name + "\t" + num.salary + "\t" + num.birthday.year + "-" + num.birthday.month + "-" + num.birthday.day);
        }
        
        
        
        //冒泡排序;按员工生日排序;从小到大
        for (int j = 1;j < arr.length;j++){
            
            for(int i = 0;i < arr.length-i; i++){
                
                if(arr[i].birthday.year > arr[i+1].birthday.year){ //先比较年year,大的年龄小
                Staff temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }else if(arr[i].birthday.year == arr[i+1].birthday.year){
                if(arr[i].birthday.month > arr[i+1].birthday.month){
                    Staff temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }else if(arr[i].birthday.month == arr[i+1].birthday.month){
                    if(arr[i].birthday.day > arr[i+1].birthday.day){
                    Staff temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                        }
                    }
                }
            }
        }
        //遍历排序之后的
        System.out.println("排序之后的:");
        System.out.println("姓名\t" + "薪资\t" + "生\t日");
        for(int i = 0;i < arr.length; i++){
            
            System.out.println(arr[i].name + "\t" + arr[i].salary + "\t" + arr[i].birthday.year + "-" + arr[i].birthday.month + "-" + arr[i].birthday.day);
        }
    }

}
class MyDate{
    int year;
    int month;
    int day;
    
}
class Staff{
    String name;
    double salary;
    MyDate birthday;
    
}

技术分享图片

 

类的继承,super

1、写一个名为Account的类模拟账户。该类的属性和方法如下图所示。该类包括的属性:账号id,余额balance,年利率annualInterestRate;包含的方法:访问器方法(getter和setter方法),返回月利率的方法getMonthlyInterest(),取款方法withdraw(),存款方法deposit()。

写一个测试类TestAccount:在用户程序中,创建一个账号为11223344、余额为20000、年利率4.5%的Account对象。使用withdraw方法提款30000元,并打印余额。

再使用withdraw方法提款2500元,使用deposit方法存款3000元,然后打印余额和月利率。

 

 

2、创建Account类的一个子类CheckAccount代表可透支的账户,该账户中定义一个属性overdraft代表可透支限额,。在CheckAccount类中重写withdraw方法。

写一个用户程序测试CheckAccount类。在用户程序中,创建一个账号为11223344、余额为20000、年利率4.5%,可透支限额为5000元的CheckAccount对象。

提示:

(1)       子类CheckAccount的构造方法需要将从父类继承的3个属性和子类自己的属性全部初始化。

(2)       父类Account的属性balance被设置为private,但在子类CheckAccount的withdraw方法中需要修改它的值

最后思考:如果将父类Account的属性balance设置为protected,会怎么样?

package com.atguigu.variable;

import com.atguigu.inherited.Account;

public class CheckAccount extends Account {
    
    private double overdraft;

    public CheckAccount() {
        super();
    }

    public CheckAccount(String id, double balance, double annualInterestRate, double overdraft) {
        super(id, balance, annualInterestRate);
        this.overdraft = overdraft;
    }

    public double getOverdraft() {
        return overdraft;
    }

    public void setOverdraft(double overdraft) {
        this.overdraft = overdraft;
    }

    
/*    public void withdraw(double money){
        if(money < 0){
        System.out.println("输入有误");
        }if(money < getBalance()){ 
            super.withdraw(money); //正常取,可以使用父类里边的方法withdraw
        }else{  //可以透支
            if(money > getBalance() + overdraft){
                System.out.println("超过可透支额度");
            }else{
                System.out.println("剩余可透支额度为:" + (overdraft -= money - getBalance())); //取后剩余的透支额度;
                //超过的额度(money - balance);
                setBalance(0);
                System.out.println("哎呀取完了,账户余额为:" + getBalance());
            }
            
        }
    }*/
    
//    如果将父类Account的属性balance设置为protected,表在其他包的子类里边也可以使用
    public void withdraw(double money){
        if(money < 0){
            System.out.println("您的输入有误");
        }if(money < balance){
            super.withdraw(money);  
        }else{
            if(money > balance + overdraft){
                System.out.println("超过卡的取款额度");
            }else{
                System.out.println("可透支额度剩余:" + (overdraft -= money -balance));
                setBalance(0);
            }
        }
    }
    
    
}
package com.atguigu.variable;

import com.atguigu.inherited.Account;

public class TestAccount {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Account a = new Account("11223344", 20000, 0.045);
        CheckAccount c = new CheckAccount("11223344", 20000, 0.056, 5000);
        
        c.withdraw(28000);//传参调用withdraw方法,它是没有返回值的。
        //System.out.println(a.getBalance());
        System.out.println(a.deposit(2000));
    
        
    }

}

 

Practice| 面向对象

标签:显示   balance   inpu   course   one   父类继承   out   temp   超过   

原文地址:https://www.cnblogs.com/shengyang17/p/10004038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!