В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Некоторым языкам встроили эту поддержку. Например, смотрите на java.math. BigDecimal в Java, или десятичное число. Десятичное число в Python.
Другие языки часто имеют библиотеку в наличии для обеспечения этой функции. Например, в C Вы могли использовать GMP или другие опции.
раздел "Arbitrary-precision software" эта статья дает хорошее краткое изложение Ваших опций.
Java исходно может сделать операции сверхбольшого числа с BigDecimal. GMP является defacto стандартной библиотекой для сверхбольшого числа с C/C++.
Схема (изменение шепелявости) имеет возможность, названную 'сверхбольшим числом'. существует много хороших реализаций схемы доступные и полные языковые среды и встраиваемые опции сценариев. некоторые я могу ручаться за
MitScheme (также называемый схемой гну) Хитрость PLTScheme Chezscheme (также проект гну) Схема 48
Если Вы хотите работать в мире.NET, можно использовать, все еще используют java.math. Класс BigDecimal. Просто добавьте ссылку на vjslib (в платформе), и затем можно использовать классы Java.
большая вещь, они могут использоваться fron любой язык.NET. Например, в C#:
using java.math;
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
BigDecimal bd = new BigDecimal("12345678901234567890.1234567890123456789");
Console.WriteLine(bd.ToString());
}
}
}
В языке Common LISP,
(format t "~D~%" (expt 7 77))
" ~D ~ %" в printf формате был бы "%d\n". Арифметика произвольной точности встроена в язык Common LISP.
Многие люди рекомендовали десятичный модуль Python, но я рекомендую использовать mpmath по десятичному числу для любого серьезного числового использования.
Python имеет такую способность. Существует превосходный пример здесь .
От статьи:
from math import log as _flog
from decimal import getcontext, Decimal
def log(x):
if x < 0:
return Decimal("NaN")
if x == 0:
return Decimal("-inf")
getcontext().prec += 3
eps = Decimal("10")**(-getcontext().prec+2)
# A good initial estimate is needed
r = Decimal(repr(_flog(float(x))))
while 1:
r2 = r - 1 + x/exp(r)
if abs(r2-r) < eps:
break
else:
r = r2
getcontext().prec -= 3
return +r
кроме того, учебное руководство по быстрому запуску Python обсуждает произвольную точность: http://docs.python.org/lib/decimal-tutorial.html
и описывает getcontext:
getcontext () функциональные доступы текущий контекст и позволяет настройкам быть измененными.
Редактирование: Добавленное разъяснение по поводу getcontext.
Mathematica.
N[Pi, 100]
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
Не только делает mathematica, имеют произвольную точность, но и по умолчанию это имеет бесконечную точность. Это сохраняет вещи как 1/3 как rationals и даже выражения, включающие вещи как Sqrt[2], который это поддерживает символически, пока Вы не просите числовое приближение, которое Вы можете иметь к любому количеству десятичных разрядов.
КОБОЛ
77 VALUE PIC S9(4)V9(4).
переменная ведьма со знаком 4 десятичных числа.
МН/1
DCL VALUE DEC FIXED (4,4);
:-) Я не могу помнить другой старый материал...
Шутки независимо, как мое шоу в качестве примера, я думаю, что Вы не должны выбирать язык программирования в зависимости от единственной функции. Фактически весь достойная и недавняя поддержка языка зафиксировала точность в некоторых специализированных классах.
Судя по всему, они также есть в Tcl, начиная с версии 8.5, благодаря LibTomMath:
http://wiki.tcl.tk/5193 http://www.tcl.tk/cgi-bin/tct/tip/237.html http://math.libtomcrypt.com/