面向對象的特徵一:封裝性
問題的引入: 當我們創建一個類的時候,我們可以通過實例化類來對類中的屬性進行賦值操作。這時,賦值操作只受到屬性的數據類型和存儲範圍的限制,沒有其他的限制條件。但在實際問題中,我們可能還存在一些其他的限制條件,但是這些限制條件並不能在屬性聲明時體現,我們只能通過方法進行限制條件的添加,同時要防止用戶再通過對象 . 屬性的方法在對屬性進行賦值,則需要把屬性聲明爲私有的(private)。此時針對屬性就體現了封裝性。
封裝性的體現: 我們將類的屬性私有化(private),然後提供公共的(public)方法設置(set)和獲取(get)屬性的值。
注意:除了上面提到的屬性的私有化,封裝性還體現在不對外暴露的私有方法以及單例模式。
權限修飾符:Java規定的四種權限修飾符從小到大排列依次是private、缺省、protected、public。
這四種權限修飾符可以修飾類及類的內部成員;具體的說,可以修飾類中的:屬性、方法、構造器、內部類;修飾類時只能使用public和缺省兩種修飾符。
四種權限修飾符的課件範圍:private只在類內可見,缺省可以在同一個包內的類間可見,protected可在不同包的子類中可見,public在不同包之間可見;
總結封裝性:Java提供了四種權限修飾符來修飾類及類的內部成員,體現了類及類的內部成員在被調用時對外可見性的大小。
例子如下:
public class MyAnimalTest{
public static void main(String[] args) {
Animal1 ani = new Animal1();
System.out.println(ani.getLeg());
ani.setLeg(4);
System.out.println(ani.getLeg());
ani.setLeg(5);
System.out.println(ani.getLeg());
}
}
class Animal1{
String name;
private int age;
private int leg;
public void setLeg(int l) {
if(l > 0 && l%2==0) {
this.leg = l;
}else {
System.out.println("Error");
}
}
public int getLeg() {
return leg;
}
}
類的內部成員之構造器(constructor)
構造器的作用:
1、創建對象
2、初始化對象的信息
構造器的結構:權限修飾符 類名(形參列表);
幾點注意事項:
1、如果類中沒有提供構造器,則系統會默認提供一個空參的構造器;
2、一旦類中提供了構造器則系統就不會再提供空參的構造器;
3、同一個類中不同形參列表的構造器之間會構成重載;
4、每個類中至少會有一個構造器;
this關鍵字可以理解成創建或擬創建的對象。
public class MypersonTest {
public static void main(String[] args) {
Person1 p = new Person1();
Person1 p1 = new Person1("shenshuo",24);
System.out.println(p.getName()+","+p1.getName());
p.setName("花花");
System.out.println(p.getName()+","+p1.getName());
}
}
class Person1{
private String name;
private int age;
public Person1() {
}
public Person1(String name,int age) {
this(); // 調用前面的構造器
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void eat() {
System.out.println("人喫飯");
}
public void study() {
System.out.println("人可以學習");
}
}
JavaBean是一種Java語言寫成的課重用組件
所謂的JavaBean是符合以下標準的Java類:
1、一個公共的類(即用public修飾的類)
2、有一個無參的公共的構造器(即有public修飾的無參構造器)
3、有屬性,且提供了屬性的get、set方法
public class Customer {//公共的類
private int id;
private String name;//屬性
public Customer(){//公共的無參構造器
}
public void setId(int i){
id = i;
}
public int getId(){//對應屬性的get、set方法
return id;
}
public void setName(String n){
name = n;
}
public String getName(){
return name;
}
}
屬性賦值的先後順序:
依次爲:
①默認初始化
②顯式初始化
③構造器初始化
④通過對象。屬性、對象。方法的方式賦值
①>②>③>④其中大於號是早於的意思。
三個關鍵字this、package和import:
this關鍵字的使用:
this關鍵字可以用來修飾:屬性、方法、構造器;
this修飾屬性和方法理解成當前對象,this修飾構造器理解成正在創建的當前對象。
在類的方法中:可以通過this.屬性、this.方法的方式來調用當前對象的屬性和方法,但一般this省略不寫。特殊情況下,如果方法的形參名和類中的屬性名相同時,則需要顯示的使用this來說明此變量是屬性而非形參。
在構造器中:可以使用this.屬性、this.方法的方式來調用正在創建的當前對象中的屬性和方法,但通常this省略不寫,特殊情況下,如果構造器的形參名和類中的屬性名相同時,則需要顯示的使用this來說明此變量是屬性而非形參。
this調用構造器:可以通過this(形參列表)的方式來調用本類中其他指定的構造器。
幾點注意:
1、this(形參列表)只能放在構造器的首行,而且不能通過這種方式來調用它本身。
2、每個構造器中最多隻能聲明一個this(形參列表)來調用其他的構造器。
3、如果本類中有n個構造器,則最多隻能有n-1個構造器使用了this(形參列表)來調用其他的構造器;
class Person{
private String name;
private int age;
public Person(){
// this.eat();
String info = "Person初始化時,需要考慮如下的1,2,3,4...(共40行代碼)";
System.out.println(info);
}
public Person(String name){
this();
this.name = name;
}
public Person(int age){
this();
this.age = age;
}
public Person(String name,int age){
this(age);
this.name = name;
//this.age = age;
//Person初始化時,需要考慮如下的1,2,3,4...(共40行代碼)
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
public void eat(){
System.out.println("人喫飯");
this.study();
}
public void study(){
System.out.println("人學習");
}
}
package關鍵字的使用:
爲了更好的實現項目中類的管理,提出了包的概念;
使用package聲明類或接口所屬的包,聲明在源文件的首行;
包也屬於標識符,要遵循標識符的命名規則,包名都使用小寫字母,還要做到見名知意;
其中,沒 . 一次,代表了一層文件目錄
注意:同一個包下不能有同名的類或接口,不同的包下可以有同名的類或接口。
import關鍵字的使用:(導入)
在源文件中使用import結構來導入指定保重的類和接口;
import一般聲明在package和類的聲明之間;
幾點注意事項:
1、如果是本包下的或者是java.lang包下的類和接口,則不需要使用import導入;
2、如果有多個包中的結構需要導入,並列寫出即可;
3、如果有兩個不同包中的同名類,則在使用時至少要有一個類需要以全類名的方式顯示。
4、可以使用“xxx.*”的方式導入xxx包下的所有結構。但是如果時該包下子包中的結構則還需要顯示的導入子包。
import static用於導入類或接口中的靜態結構(屬性和方法);
例如:
package com.atguigu.java2;
import java.lang.reflect.Field;