关于JAVA核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)

用户自定义类:

这部分并没有太过于困难的部分,借由代码进行复习:

Employee类的定义:

package com.java.EmployeeTest;

import java.time.*;

public class Employee {
    private String name;
    private double salary;
    private LocalDate hireDay;//以上分别是Employee类的实例域
    
    public Employee(String n,double s,int year,int month,int day) {
        name=n;
        salary=s;
        this.hireDay=LocalDate.of(year, month, day);
    }
    public String getName() {
        return name;
        
    }
    public double getSalary() {
        return salary;
    }
    public LocalDate getHireDay() {
        
        return hireDay;
        
    }
    
    public void raiseSalary(double byPercent) {
        double raise =salary*byPercent/100;
        salary += raise;
    }//方法,因为实例域为保证安全性都是用private类型,要引用需要用public方法进行调用

}

main函数:

package com.java.EmployeeTest;
import java.time.*;

public class EmployeeTest {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Employee[] staff = new Employee[3];
        staff[0] = new Employee("Carl Cracker",75000,1987,12,15);
        staff[1] = new Employee("Harry Hacker",50000,1989,10,1);
        staff[2] = new Employee("Tony Tester",40000,1990,3,15);
        
        for(Employee e:staff)
            e.raiseSalary(5);
        
        for(Employee e: staff)
            System.out.println("name="+e.getName()+",salary="+e.getSalary()+",hireDay="+e.getHireDay());

}

}
没啥说的,这部分内容完全可以自己学习。

静态语和静态方法(static)

静态域

现给每个对象添加唯一标识码,nextId(静态域),id

class Employee{

private static int nextId=1;

private Int id;

}

每个对象都拥有自己的id,但这个类所有的实例将共享一个nextId,它属于类,若无对象也存在。

静态常量

Math类中定义了一个静态常量:

public class Math{

……

public  static final double PI = 3.14159265358979323846;

……

}

在程序中,可以直接调用类来获得常量,即Math.PI

另一个多次使用的静态常态是System.out.。

public class System{

……

public static final PrintStream out =..;

......

}

静态方法

静态方法是一种不能向对象实施操作的方法

例如:Math类的pow方法就是一个静态方法。表达式:Math.pow(x,a);计算x的a次幂;

可以认为静态方法是没有this参数的方法。

附:若对静态域初始化代码比较复杂,可以用:

static{

……

……

……}

这样表示

重点:静态方法中是不能调用非静态域。形参可以和非静态变量一样,但并非表达同一意思。

代码一览:

package com.java.StaticTest;

public class Employee {
    private static int nextId=1;
    private String name;
    private double salary;
    private int id;
    
    public Employee (String n, double s) {
        name=n;
        salary=s;
        id=0;
        
    }
    public String getName() {
        return name;
    }
    public double getSalary() {
        return salary;
        
    }
    public int getId()
    {
        return id;
        
    }
    public void setId() {
        id=nextId;
        nextId++;
        
    }
    public static int getNextId() {
        return nextId;
        
    }
    public static void main(String[] args) {
        Employee e =new Employee("Harry",50000);
        System.out.println(e.getName()+" "+e.getSalary());
    }
}

package com.java.StaticTest;

public class StaticTest {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Employee[] staff = new Employee[3];
        staff[0]=new Employee("Tom",40000);
        staff[1]=new Employee("Dick",60000);
        staff[2]=new Employee("Harry",65000);
        for (Employee e:staff) {
            e.setId();
            System.out.println("name="+e.getName()+",id="+e.getId()+",salary="+e.getSalary());
        }
        
        int n = Employee.getNextId();
        System.out.println("Next available id="+n);

}

方法参数

程序设计语言中参数传递方法有两种

一种是按值调用,一种是按引用调用

按值调用即方法接受的是调用者提供的值,即得到一个所求的值的拷贝值,方法不能修改传递给他们的任何参数变量的内容

按引用调用即方法节后的是调用者提供的变量地址。

java采用的是按值调用。

代码验证:package com.java.ParamTest;

public class Employee {
    private String name;
    private double salary;
    
    public Employee(String n,double s) {
        name =n;
        salary=s;
        
        
    }
    public String getName() {
        return name;
        
    }
    
    public double getSalary()
    {
        return salary;
    }
    public void raiseSalary(double byPercent) {
        double raise =salary*byPercent/100;
        salary +=raise;
        
    }
}
package com.java.ParamTest;

public class ParamTest {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Testing tripleValue:");
        double percent=10;
        System.out.println("Before :percent="+percent);
        tripleValue(percent);
        System.out.println("After:percent="+percent);
        
        
        
        
        
        
        
        System.out.println("\nTesting tripleSalary:");
        Employee harry=new Employee("Harry",50000);
        System.out.println("Before :salary="+harry.getSalary());
        tripleSalary(harry);
        System.out.println("After :salary="+harry.getSalary());
        
        
        
        
        
        System.out.println("\nTesting swap:");
        Employee a=new Employee("Alice",70000);
        Employee b=new Employee("Bob", 60000);
        System.out.println("Before :a="+a.getName());
        System.out.println("Before :b="+b.getName());
        swap(a,b);
        System.out.println("After :a="+a.getName());
        System.out.println("After :b="+b.getName());

}

public static void tripleSalary(Employee x) {
        // TODO Auto-generated method stub
        x.raiseSalary(200);
        System.out.println("End of method:salary="+x.getSalary());
        
    }

public static void tripleValue(double x) {
        // TODO Auto-generated method stub
        x=3*x;
        System.out.println("End of method:x="+x);
        
        
    }
    
    
    public static void swap(Employee x,Employee y) {
        Employee temp =x;
        x=y;
        y=temp;
        System.out.println("End of method:x="+x.getName());
        System.out.println("End of method:y="+y.getName());
    }

}
结果:Testing tripleValue:
Before :percent=10.0
End of method:x=30.0
After:percent=10.0

Testing tripleSalary:
Before :salary=50000.0
End of method:salary=150000.0
After :salary=150000.0

Testing swap:
Before :a=Alice
Before :b=Bob
End of method:x=Bob
End of method:y=Alice
After :a=Alice
After :b=Bob

可以分析出,方法参数分为两个类型:

基本数据类型;

对象引用;

其中基本数据类型完成时对原本数据的拷贝,所有操作都是对其拷贝的内容进行操作,与原数据无关。

而对于对象引用是因为副本指向的也是new出来的地址,故会对其改变。

而交换的也是副本,并非本身,在交换完之后,就将其丢弃。故不变。

原文地址:https://www.cnblogs.com/zzuzhouxiang/p/10328302.html

时间: 2024-10-13 18:03:45

关于JAVA核心技术(卷一)读后的思考(用户自定义类,静态域和静态方法的思考以及方法参数)的相关文章

java核心技术卷一

java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128-127       浮点类型 数据类型 字节数 取值范围 小数位数 float 4 10^-38~10^38和-10^-38~-10^38 小数位数6-7 double 4 10^-308~10^308和-10^-308~-10^308 15位小数         boolean 类型和char 类

读《java核心技术卷一》有感

过去一个多月了吧.才囫囵吞枣地把这书过了一遍.话说这书也够长的,一共706页.我从来不是个喜欢记录的人,一直以来看什么书都是看完了就扔一边去,可能有时候有那么一点想记录下来的冲动,但算算时间太紧,很多也是有始无终,毕竟在之前研究研究程序也只是自己的一个爱好而已,但没有想到签了一个程序员的工作.唉,这老天也太捉弄人了吧,让一个学电气工程(强电方向)学生毕业之后去写代码,而且是与硬件完全无关的代码.真是白念几年大学了.行了,就行发这么多牢骚吧. <java核心技术>有两个卷,我只看了卷一,从我的感

Java核心技术卷一 8. java并发

什么是线程 每个进程拥有自己的一整套变量,而线程则共享数据. 没有使用多线程的程序,调用 Thread.sleep 不会创建一个新线程,用于暂停当前线程的活动.程序未结束前无法与程序进行交互. 使用线程给其他任务提供机会 将代码放置在一个独立的线程中,事件调度线程会关注事件,并处理用户的动作. 在一个单独的线程中执行一个任务的简单过程: 将任务代码移到实现了 Runnable 接口的类的 run 方法中. public interface Runnable{ void run(); } Runn

Java核心技术 卷一 笔记六 Date类

在Java核心技术卷就行了一前期  date类出现的频率很高  所以就对date类进行了小小的整合 Date类有两个 date类 表示特定时间的类 这个构造函数分配一个Date对象并初始化它代表指定的毫秒数,因为被称为"纪元",即1970年1月1日00:00:00 GMT标准基准时间. 就像格林尼治时间一样  作为一种基准值而存在 一般常用的是date转为string类型 String s=new Date(0).toString(); System.out.println(s.toS

Java核心技术卷一 4. java接口、lambda、内部类和代理

接口 接口概念 接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义. 如果类遵从某个特定接口,那么久履行这项服务. public interface Comparable<T>{ int compareTo(T other); } 任何实现 Comparable 接口的类都需要包含 compareTo 方法,并且这个方法的参数必须是一个 T 对象,返回一个整形数值. 接口的特点: 接口中所有方法自动地属于 public,所以接口的方法不需要提供关键字 public .

Java核心技术卷一 5. java异常、断言和日志

处理错误 由于出现错误而使得某些操作没有完成,程序因该: 返回到一种安全状态,并能够让用户执行一些其他命令 允许用户保存所有操作的结果,并以适当的方式终止程序 需要关注的问题: 用户输入错误 设备错误 物理限制 代码错误 当某个方法不能够采用正常的路径完成它的任务,就可以通过另外一个一个路径退出方法.这种情况下,方法并不返回任何值,而是抛出(throw)一个封装了错误信息的对象.要注意这个方法将会立刻退出,并不返回任何值.调用这个方法的代码也将无法继续执行,异常处理机制开始搜索能够处理这种异常状

《Java核心技术卷一》笔记 多线程同步(底层实现)

一.锁的基本原理 多个线程同时对共享的同一数据存取 ,在这种竞争条件下如果不进行同步很可能会造成数据的讹误. 例如:有一个共享变量int sum=0, 一个线程正调用 sum+=10,另一个线程正好也在调用sum+=20,期望的结果应该是sum=30. 但是+=操作并不是原子的,虚拟机需要用多条指令才能来完成这个操作(load,add, store),每个指令执行完都有可能被剥夺执行权,同时让另一个线程继续运行.(可以使用javap -c -v CLASS命令将class文件反编译为可阅读的虚拟

《Java核心技术卷一》笔记 多线程

有时,我们需要在一个程序中同时并行的处理多个任务,如播放器一边要播放音乐同时还要不断更新画面显示,或者是一边执行耗时任务,UI还能一边继续响应各种事件.还有的时候,一个任务需要很长时间才能完成,如果分成多份一起执行,可以极大的缩短需要的时间.多线程可以很好的解决这类问题. 一个程序(进程)如果可以同时执行多个任务,每个并行的任务都是通过一个线程来完成,这就是一个多线程程序.进程拥有自己的一整套数据(变量),各个线程共享进程的数据,线程间通信比进程间通信更简单,线程开销比进程小. Java中为多线

Java核心技术卷一 6. java泛型程序设计

泛型程序设计 泛型程序设计:编写的代码可以被很多不同类型的对象所重用. 类型参数:使用<String>,后者可以省略,因为可以从变量的类型推断得出.类型参数让程序更具更好的可读性和安全性. 通配符类型:很抽象,让库的构建者编写出尽可能灵活的方法. 定义简单泛型类 泛型类就是具有一个或多个类型变量的类. //引用类型变量 T ,可以有多个类型变量,public class Pair<T, U>{...} public class Pair<T> { //类定义的类型变量制