Parameter vs Argument
Parameter: متغییری که در ورودی متد تعریف میکنیم.
Argument: متغییری که به عنوان ورودی به متد ارسال میکنیم.
Parameter: متغییری که در ورودی متد تعریف میکنیم.
Argument: متغییری که به عنوان ورودی به متد ارسال میکنیم.
نگاهی به برنامه نویسی شی گرا در جاوا
Profiler و APM ابزاری هایی برای مانیتورینگ و دیباگینگ پرفورمنس برنامه ها جاوا در زمان توسعه استفاده میشه.
Static vs Dynamic
Strong vs Weak
تو این پست یکسری بدیهیات رو میگم، راجع یکسری از یکی دوتا ابزار خیلی خلاصه صحبت میکنم و سعی میکنم یه کار مسخره انجام بدم
چهار نوع رفرنس توی جاوا داریم:
GC با آزاد کردن خودکار حافظه باعث سریعتر شدن برنامه نویسی میشه و از نوشتن کدهای اضافه جلوگیری میکنه.
در قدیم اینجوری بود که ما متد finalize رو توی اشیا بازنویسی میکردیم و وقتی GC میخواست اون شی رو نابود کنه این متد رو صدا میزد و ما اگه لاجیک خواصی داشتیم اونجا مینوشتیم.
اما به دلیل مشکلاتی که این کار بوجود میاورد اون توی جاوا ۱۱ به بعد deprecated شده.
یکی از بزرگترین مشکلاتی که بوجود میاد این هستش که این متد توی thread مربوط به GC اجرا میشه و باعث بوجود اومدن مکث در thread اصلی میشه.
حالا باید چیکار کنیم؟
باید توی شی پدر اون شی که داره نابود میشه یه Cleaner بسازیم و شی مورد نظر و به همراه یک runnalbe توی اون register کنیم.
JVM دقیقا مثل باقی برنامه ها یک فضا رو توی رم اشغال میکنه و خودش کامل اون رو مدیریت میکنه. ستا فضای کاملا جدا از هم داریم که JVM دادههای زمان اجرا و کدهای کامپایل شده رو اونجا نگهمیداره.
ما در مورد اینکه برنامهها چجوری اجرا میشن صحبت کردیم ولی درباره اجرا کننده برنامهها هیچ صحبتی نکردیم.
bytecode ها اینجا اجرا میشن. Execution Engine دستورات رو خط به خط اجرا میکنه.
JVM داخل رم یک فضا برای بارگذاری دادهها در اختیار داره. class loader شی باینری متناظر هر کلاس رو تولید میکنه و اونها رو بصورت جداگانه و با اطلاعات زیر به Runtime Data Area میده و اون هم توی method area ذخیره میکنه.
به ازای هر برنامه که اجرا میشه یک نمونه از ماشین مجازی جاوا JVM داخل رم سیستم بارگذاری میشه و با استفاده از Class Loader Subsystem کلاس های مورد نظر رو وارد رم میکنه و بهش میگن dynamic class loading که کلاسها رو load و link و initialize میکنه. البته این کار رو فقط یک بار در زمان اجرا انجام میده.
با شی Thread میتونیم یک فضای جدای پردازشی ایجاد کنیم. برای این کار باید یک کلاس را از آم مشتق کنیم و تابع run را در آن باز نویسی کنیم و با فراخوانی تابع start آن را اجرا کنیم. همچنین مقادیری که برای کنترل فرایند های درون آن نیاز است را میتوانید از طریق تابع سازنده آن ارسال کنیم.
تو جاوا یکسری modifire خاص دیگه هم داریم !!!
تو جاوا چهارتا سطح دسترسی داریم !!!
از گذشته دور تا الان !
ما چهار نوع Permissions تو اندروید داریم:
گاهی برنامه ما هنگ میکنه و اندروید ی پیام نشون میده ک میگه صبر میکنی یا برنامه رو ببندم !!!
ابزارهای اندروید رو بهتر بشناسیم
قابلیت پشتیبان گیری به وسیله سیستم عامل اندروید !
final یک کلمه کلیدی هستش و قبل از کلاس، متد و یا متغییر ها قرار میگیره و مانع از توسعه، بازنویسی و تغییر اونها میشه.
finally: یک بلاک برای کد های مهم هستش که همراه با try/cache استفاده میشه و در هر دو صورت اجرا میشه.
finalize: یک متد هستش که gc قبل از اینکه یک شی رو دور بریزه اون رو صدا میکنه.
Dalvik از اندروید ۵ Lolipop جایگزین ART شد.
Dalvik به صورت Just-In-Time (JIT) کار میکنه، یعنی هر بار که برنامه اجرا میشه بایتکد ها رو اجرا میکنه به همین دلیل CPU بیشتری مصرف میکنه و زمان اجرای برنامه هم بیشتر هستش و باتری بیشتری هم مصرف میشه. ولی فضای کمتی نیاز دارن برنامه ها و بود دستگاه هم سریعتر انجام میشه.
ART به صورت Ahead-Of-Time (AOT) کار میکنه، یعنی در زمان نصب برنامه بایتکد ها رو تبدیل میکنه. این کار باعث میشه نصب برنامه بیشتر زمان ببره و برنامه ها فضای بیشتری اشغال کنن (حدود ۷۵ درصد بیشتر) ولی در زمان اجرا برنامه ها بسیار سریعتر اجرا میشن و باتری کمتری هم مصرف میکنن. البته بوت شدن دستگاه هم کندتر هستش چون در زمان بوت شدن شروع به تبدیل بایتکد های برنامه ها میکنه و پیام Optimizing apps رو نمایش میده.
راهنمایی پیاده سازی navigation.
اگه بخواییم یک اینترفیس رو پیاده سازی کنیم ولی تمام متدهای اون رو پیاده سازی نکنیم (یک کلاس دیگه داریم که همون اینترفیس رو پیاده سازی کرده و ما فقط میخوایم یکسری تغییر توی اون ایجاد کنیم).
interface Base
class BaseImpl() : Base
class Derived(n: Base) : Base by n
final:
static:
A a = new A();
A.B b = a.new B();
زمانی که یک اکتیویتی ساخته میشه متدهای onCreate و onStart و onResume به ترتیب فراخوانی میشوند تا زمانی که ما اکتیویتی را مشاهده میکنیم و زمانی که یک اکتیویتی میخواد به کار خودش خاتمه بده متدهای onPause و onStop و onDestroy به ترتیب فراخوانی میشوند.
const یک ثابت کامپایل تایم هست، یعنی مقدار آن در زمان کامپایل مشخص میشود بر خلاف val که میتوان داده آن را در زمان اجرا مشخص کرد.
این به این معنی است که مقدار const را نمیتوان برابر با یک متد یا یک کلاس قرار داد. مقدار آن باید primitive باشد مانند String.
همچنین const در جاوا public static final میشود در حالی که val در جاوا private static final میشود.
وقتی یک کلاس View را توصعه میدهد شی canvas در متد onDraw در اختیارش قرار میگیرد.
برای محاسبه ابعاد view وقتی در حالت wrap_content قرار دارد باید متد onMeasuer را پیاده سازی کنیم برای فراخوانی این متد باید تابعد requestLayout را صدا بزنیم.
وقتی یک کلاس ViewGroup را توسعه میدهد باید onLayout را پیاده سازی کند.
در ViewGroup داستان این هستش که ما توی متد onLayout ابعاد layout خودمون رو داریم و فضایی که میخوای به هر کدوم از child ها اختصاص بدیم رو باید محاسبه کنیم و متد layout رو از child ها صدا بزنیم و ابعاد رو بدیم.
اگه child توی صفحه دیده بشه متد onDraw اون صدا زدم میشه و میشه هر کاری که میخوایم رو اونجا انجام بدیم.
دقت داشته باشید که موقعیت ها در اشیای فرزند نثب به خود آنها محاسبه میشود.