物件導向本質是一種程式設計範式(思考方式)
程序導向:關注的是程式碼的實現細節
物件導向:先把程式碼實現細節整合到物件中,找到這個物件就能擁有物件的功能
物件導向基於程序導向,物件導向優於程序導向?如果我們場景比較簡單優先推薦程序導向,如果場景很複雜優先推薦物件導向
物件和類之間的關係
對一類物件來進行抽取,把共有的特徵資訊抽取成了屬性,把共有的行爲資訊抽取成了方法,把這一類物件抽取成了類。類是對物件的概括,物件是對類的具體實現。
a.構造方法
b.1.與類同名 2.沒有返回值型別
c.有參構造用於屬性初始化,支援構造方法過載
d.當類中沒有定義任何形式的構造方法jvm會在底層預設新增無參構造,如果類中已經定義構造方法那麼底層就不會再新增無參構造
e.類中至少含有一個構造方法
public class MethodDemo2 {
public static void main(String[] args) {
//建立person類物件p
//構造方法---構建物件
Person p = new Person("tom");
//給物件的屬性進行賦值
//.代表「的」的意思
p.gender = '男';
p.age = 66;
//輸出
System.out.println(p.name + "," + p.gender + "," + p.age);
//呼叫方法
p.sleep();
p.eat();
//建立person類物件
Person p1 = new Person();
//給物件的屬性進行賦值
p1.name = "heh";
p1.gender = '女';
p1.age = 55;
//輸出
System.out.println(p1.name + "," + p1.gender + "," + p1.age);
//呼叫方法
p1.sleep();
p1.eat();
}
}
//代表人的類
class Person{
//特徵---屬性
//不加static的屬性就是非靜態屬性
//成員變數
String name;
char gender;
int age;
//當類中沒有定義任何形式的構造方法jvm預設在底層新增無參構造
//當類中定義構造方法底層就不會預設新增無參構造
//無參構造
//1.沒有返回值型別 2.與類同名
public Person(){}
//普通方法可以與類同名
//public void Person(){}
//有參構造---物件屬性初始化
//java支援構造方法過載
public Person(String name){//方法有就近原則
//this代表我們當前類的物件
this.name = name;
}
//行爲---方法---成員方法
public void eat() {
int age = 1;//區域性變數
System.out.println(name + "在吃飯...");
}
public void sleep() {
System.out.println(name + "在睡覺...");
}
}
java中所有的非靜態屬性和方法要由物件呼叫
a.關鍵字,代表當前類的物件
b.可以代表當前類還沒有產生的物件,代表當前類剛建立的物件,代表當前類正在使用的物件。this是靈活的指代(虛擬),可以指代成當前類正在活動的物件
c.this語句—在同一個類中的構造方法裡呼叫別的構造方法,首行
public class ThisDemo {
public static void main(String[] args) {
//常見物件
Student s1 = new Student();
//this可以代表當前類剛建立物件
System.out.println("s1:" + s1);
//建立物件
Student s2 = new Student("tom");
//this是一個靈活的指代
System.out.println("s2:" + s2);
//this指代成當前類正在使用的物件
s1.study();
s2.study();
}
}
//代表學生的類
class Student{
//屬性
String name;
int age;
char gender;
//無參構造
public Student(){
System.out.println("this:" + this);
}
//有參構造
public Student(int age){
this();
}
//有參構造
public Student(String name){
//呼叫別的構造方法
//Student();呼叫不到
//this語句---呼叫別的構造方法 要在首行
this(1);
this.name = name;
System.out.println("this:" + this);
}
//方法
public void study(){
//this可以代表當前類還沒有建立物件
System.out.println(this.name + "在學習...");
//
System.out.println("this:" + this);
}
}
構造程式碼塊
a.在方法外類內{}
b.屬性初始化
c.優先於所有的構造方法先執行
區域性程式碼塊
a.方法內{}
b.控制變量的生命週期,提供記憶體利用率
public class ObjectDemo2 {
public static void main(String[] args) {
//
Baby b = new Baby();
//
System.out.println(b.name + "," + b.age);
}
}
//代表嬰兒的類---建立物件就是真是的嬰兒
//要求:不管怎麼出生,嬰兒的名字叫莉莉,年齡是一歲
class Baby{
//屬性
String name;
int age;
char gender;
//構造程式碼塊
//優先於所有的構造方法先執行
//屬性初始化
{
this.name = "莉莉";
this.age = 1;
}
//無參構造---嬰兒沒有名字沒有年齡
public Baby(){
/*this.name = "莉莉";
this.age = 1;*/
}
//有參構造----嬰兒出生時有名字
public Baby(String name){
//this.name = name;
/* this.name = "莉莉";
this.age = 1;*/
}
//嬰兒出生時有名字也有年齡
public Baby(String name,int age){
/* this.name = name;
this.age = age;*/
/* this.name = "莉莉";
this.age = 1;*/
}
//方法
public void cry(){
System.out.println(name + "在嗷嗷的哭......");
}
}
1.位置
成員變數:方法外類內
區域性變數:方法內
2.適用範圍
成員變數:整個類
區域性變數:整個方法
3.記憶體
成員變數:堆
區域性變數:棧
4.生命週期
成員變數:隨着類建立物件而出現,隨着物件被揮手而消失
區域性變數:當方法被呼叫時纔出現,隨着方法執行結束而消失
物件導向的特徵
封裝、繼承、多型(抽象)
體現形式—方法,屬性私有化並且提供公共的存取方式來進行正常取值和賦值,提高程式碼數據安全性。
public class FZDemo {
public static void main(String[] args) {
//建立代表人的類的物件
Person p = new Person();
//給物件屬性賦值
p.setName("heh");
//呼叫方法間接給私有化屬性進行賦值
p.setAge(-10);
p.setGender('男');
//呼叫方法間接給私有化屬性進行取值
System.out.println(p.getName() + "," + p.getAge() + "," + p.getGender());
}
}
//代表人的類
class Person{
//屬性
private String name;
//私有化屬性,只能在我們的本類中直接使用
private int age;
private char gender;
//Alt+Insert---Generate
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if (age < 0) {
System.out.println("數據有誤!!!");
}else{
this.age = age;
}
}
public void setGender(char gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public char getGender() {
return gender;
}
/*//定義方法間接的給私有化屬性進行賦值
public void setAge(int age){
if (age < 0) {
System.out.println("數據有誤!!!");
}else{
this.age = age;
}
}
//間接定義方法給私有化屬性進行取值
public int getAge() {
return age;
}*/
/*//有參構造
public Person(int age){
if (age < 0) {
System.out.println("數據有誤!!!");
}else{
this.age = age;
}
}*/
}