Java基本問題

yesye發表於2021-09-09

1、構造器

/** * test -- 構造器 */public class test {        public static void main(String[] args) {                // 成員變數初始化順序                // a.預設構造器初始化                Person p1 = new Person();                System.out.println(p1.getName() + ":" + p1.getAge());                // b.成員變數顯示初始化                Person p2 = new Person("cc");                System.out.println(p2.getName() + ":" + p2.getAge());                Person p3 = new Person(10);                System.out.println(p3.getName() + ":" + p3.getAge());                // c.透過構造器給成員變數初始化                Person p4 = new Person("cc",10);                System.out.println(p4.getName() + ":" + p4.getAge());                // d.透過set方法初始化成員變數                Person p5 = new Person();                p5.setName("dd");                p5.setAge(22);                System.out.println(p5.getName() + ":" + p5.getAge());        }};class Person {        private String name = "aa";        private int age = 1;        // 構造器Person(變數) 作用        // 1、構成器用於建立物件        Person() {                System.out.println("空參構造器");        }        // 2、構造器用於成員變數初始化        // 3、構造器之間可以過載        Person(String n, int a){                this.name = n;                this.age = a;                System.out.println("含參構造器");        }        Person(String n){                this.name = n;                System.out.println("name構造器");        }        Person(int a){                this.age = a;                System.out.println("age構造器");        }        /**         * @return the name         */        public String getName() {                return name;        };        /**         * @param name the name to set         */        public void setName(String name) {                this.name = name;        };        /**         * @return the age         */        public int getAge() {                return age;        };        /**         * @param age the age to set         */        public void setAge(int age) {                this.age = age;        };};

2、關鍵字this

class person {        private long salary;        int age;        protected String interest;        public String name;        // this 可以修飾屬性、方法、構造器,this為當前物件或建立的物件,        // this() 顯示呼叫當前類過載構造器,        // 要求:this() 需要放置構造器中的首行;n個構造器最多使用 n-1 次 this()構造器        public person() {                // this 當前正在建立的物件                this.age = 0;                this.salary = 0;                this.interest = "food";                this.name = "baby";                System.err.println("i am person");        }        public person(int age){                // this 當前正在建立的物件                this.age = age;        }        public person(String name,int age){                // this() 顯示呼叫當前類過載構造器: person(int age)                // this() 需要放置構造器中的首行                this(age);                this.name = name;        }        /**         * @param salary the salary to set         */        public void setSalary(long salary) {                // this 當前物件                this.salary = salary;        }        /**         * @return the salary         */        public long getSalary() {                return salary;        }        public void eat() {                 System.out.println("eating...");        }        public void sleep() {                System.out.println("sleeping...");        }}

3、許可權修飾符

package01

package package01;public class person {//  許可權修飾符大小: public (任何地方) > protected (子類) > 預設 (同一個包)>  private (類內部)//  class許可權修飾符只有public 預設    public String name;    int age;    protected int id;     private long salary;    public person() {        // TODO Auto-generated constructor stub        this.name = "aa";        this.age = 0;        this.id = 110;        this.salary = 0;    }    public person(String name){        this();        this.name = name;    }    public person(String name,int age){        this(name);        this.age = age;    }    public person(String name,int age,int salary){        this(name, age);        this.salary = salary;    }    public void eat() {        System.out.println("person eating ...");    }    public void eat(String name) {        System.out.println(name +" eating ...");    }}

package01

package package01;public class test02 {    public static void main(String[] args) {        person p = new person();//      同一個package中可以呼叫public屬性        System.out.println(p.name);//      同一個package中可以呼叫預設屬性        System.out.println(p.age);//      同一個package中可以呼叫protected屬性          System.out.println(p.id);//      同一個package中不可以呼叫private屬性//      private屬性只能在本類中呼叫//      System.out.println(p.salary);        p.eat("p");    }}

package02

package package02;import package01.person;public class test01 {    public static void main(String[] args) {        person p1 = new person();//      不同package中只能呼叫public屬性        System.out.println(p1.name);//      不同package中不可以呼叫預設屬性//      System.out.println(p1.age);     //      不同package中子類可以呼叫protected屬性 //      System.out.println(p1.id);//      不同package中不可以呼叫private屬性//      System.out.println(p1.salary);        p1.eat("p1");    }}class liming extends student {//  不同package中子類可以呼叫protected屬性     public liming() {        this.id = 422;        System.out.println("my id is "+this.id);    }    public void eat(String name, String food) {        System.out.println(name + " eat "+food);    }}

4、super關鍵字

package package01;public class student extends person{    protected int id;    public student() {//      super(args) 宣告在構造器內部首行, 顯示呼叫父類構造器;與this(args)衝突;//      構造器內部super(args)和this(args)不能同時出現;//      在構造器中,如果不顯示呼叫this(args)或者super(args),則預設呼叫父類空參 super();//      建議設計一個類時,提供一個空參構造器//      Object類,是所有類的父類;        super();        this.id = 11061;        super.id = 422326;    }//  當子類與父類有同名屬性id時,透過"super.id"顯示呼叫父類宣告的屬性;透過"this.id"呼叫子類的屬性;    public void show() {        System.out.println("my super id is "+ super.id);        System.out.println("my class id is "+ this.id);    }}

5、多型性

package package01;public class test3 {    public static void main(String[] args) {//      多型性//      子類物件的多型性,父類的引用指向子類物件//      優先呼叫子類重寫的方法;//      要求:1、類的繼承;2、子類對父類的方法的重寫;//      向上轉型        person p1 = new student();        p1.eat();//      程式執行時分為編譯狀態和運動狀態//      對於多型性,//      編譯時,"看左邊",將此引用父類的屬性、方法;//      執行時,"看右邊",將呼叫子類物件的實體//      p1.show();//      使用強轉(),向下轉型        student s2 = (student)p1;        s2.show();        student s1 = new student();        s1.eat("s1");        test3 test = new test3();        test.eat(new student());        test.eat(new teacher());    }    public void eat(person p) {        p.eat();        // 多型父類呼叫子類方法        if (p instanceof student) {            ((student) p).show();        }        if (p instanceof teacher) {            ((teacher) p).teach();        }    }}

6、單例設計模式

package package02;import org.junit.Test;public class test02 {    @Test    public void test() {        singleton s1 = singleton.getSingleton();        singleton s2 = singleton.getSingleton();        System.out.println(s1.toString());        System.out.println(s2.toString());    }}class singleton {//  餓漢式單例模式//  1、私有化構造器,只能在本類中呼叫    private singleton() {        System.out.println("singleton");    }//  2、在類內部建立一個靜態類變數(物件)    private static singleton singleton = new singleton();//  3、提供公共方法,透過"類.類變數"的方法呼叫    public static singleton getSingleton() {        return singleton;    }}class singleton2 {//  懶漢式單例模式,存線上程安全問題    private singleton2() {        System.out.println("singleton2");    }    private static singleton2 singleton= null ;    public static singleton2 getSingleton() {        if (singleton == null) {            singleton = new singleton2();        }        return singleton;               }}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2815636/,如需轉載,請註明出處,否則將追究法律責任。

相關文章