import java.util.Date;
//例如 「南通青鳥 IT 教育 96 班同學在 3 教室上陸老師的 Java 課」。
//
//用面向對象的思維邏輯去分析,抽象實體:
//
//班級
//學生
//教室
//老師
//課程
//學校
// class
public class Student {
// 成員變量
String clazz;
String stu;
String clazzroom;
String teacher;
String lesson;
String school;
//構造器
public Student(String clazz, String stu, String clazzroom, String teacher, String lesson, String school) {
//超類(自動編譯出來的)
super();
//申明屬性
this.clazz = clazz;
this.stu = stu;
this.clazzroom = clazzroom;
this.teacher = teacher;
this.lesson = lesson;
this.school = school;
}
//主方法入口
public static void main(String[] args) {
//創建hh對象並賦值
Student hh = new Student("101班","學生","市北","老崔","Java","南通青鳥IT 教育");
//方法的調用
System.out.println(hh.intro());
}
//構造方法
String intro(){
return school + clazz + stu + "到" + clazzroom + "上" + teacher + "的" + lesson + "課";
}
}
=========================
針對今天上課已授知識點,進行了整理問題還有問題的答案。
1.Date報錯。
Date在java.sql裏會報錯,鼠標移動到Date上點擊切換成java.util就好了。
在頂部插入。
import java.util.Date;
2.java有哪些修飾符
public protected private final static abstract.pubilc protected private只能出現一個。
3.查一下super();(超類)關鍵字的用法
構造器和方法,都用關鍵字super指向超類,但是用的方法不一樣。方法用這個關鍵字去執行被重載的超類中的方法。看下面的例子:
class Mammal {
void getBirthInfo() {
System.out.println("born alive.");
}
}
class Platypus extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
super.getBirthInfo();
}
}
在上面的例子中,使用super.getBirthInfo()去調用超類Mammal中被重載的方法。
//1.super運用在構造函數中
class test1 extend test{
public test1()...{
super();//調用父類的構造函數
}
public test1(int x){
super(x);//調用父類的構造函數,因爲帶形參所以super 也要帶行參
}
}
//2.調用父類中的成員
class test1 extend test{
public test1(){}
public f(){//假如父類裏有一個成員叫g();
super.g();//super引用當前對象的直接父類中的成員
}
}
• super()或this()調用語句只能作爲構造函數中的第一句出現。
構造器使用super去調用超類中的構造器。而且這行代碼必須放在第一行,否則編譯將出錯。看下面的例子:
public class SuperClassDemo {
SuperClassDemo() {}
}
class Child extends SuperClassDemo {
Child() {
super();
}
}
在上面這個沒有什麼實際意義的例子中,構造器 Child()包含了 super,它的作用就是將超類中的構造器SuperClassDemo實例化,並加到 Child類中。
在一般方法中
最普遍的情況就是,在你的方法中的某個形參名與當前對象的某個成員有相同的名字,這時爲了不至於混淆,你便需要明確使用this關鍵字來指明你要使用某個成員,使用方法是“this.成員名”,而不帶this的那個便是形參。另外,還可以用“this.方法名”來引用當前對象的某個方法,但這時this就不是必須的了,你可以直接用方法名來訪問那個方法,編譯器會知道你要調用的是那一個。下面的代碼演示了上面的用法:
public class DemoThis{
private String name;
private int age;
DemoThis(String name,int age){
setName(name);
//你可以加上this來調用方法,像這樣:this.setName(name);但這並不是必須的
setAge(age);
this.print(); br> }
public void setName(String name){
this.name=name;//此處必須指明你要引用成員變量
}
public void etAge(int age){
this.age=age;
}
public void print(){
System.out.println("Name="+name+" ge="+age);
//在此行中並不需要用this,因爲沒有會導致混淆的東西
}
public static void main(String[] args){
DemoThis dt=new DemoThis("Kevin","22");
這段代碼很簡單,不用解釋你也應該能看明白。在構造函數中你看到用this.print(),你完全可以用print()來代替它,兩者效果一樣。下面我們修改這個程序,來演示super的用法。
class Person{
public int c;
private String name;
private int age;
protected void setName(String name){
this.name=name;
}
protected void setAge(int age){
this.age=age;
}
protected void print(){
System.out.println("Name="+name+" Age="+age);
}
}
public class DemoSuper extends Person{
public void print(){
System.out.println("DemoSuper:");
super.print();
}
public static void main(String[] args){
DemoSuper ds=new DemoSuper();
ds.setName("kevin");
ds.setAge(22);
ds.print();
}
}
在DemoSuper中,重新定義的print方法覆寫了父類的print方法,它首先做一些自己的事情,然後調用父類的那個被覆寫了的方法。輸出結果說明了這一點:
DemoSuper:
Name=kevin Age=22
這樣的使用方法是比較常用的。另外如果父類的成員可以被子類訪問,那你可以像使用this一樣使用它,用“super.父類中的成員名”的方式,但常常你並不是這樣來訪問父類中的成員名的。
在構造函數中構造函數是一種特殊的方法,在對象初始化的時候自動調用。在構造函數中,this和super也有上面說的種種使用方式,並且它還有特殊的地方,請看下面的例子:
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person.");
}
Person(String name){
prt("A person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super(); //調用父類構造函數(1)
prt("A chinese.");//(4)
}
Chinese(String name){
super(name);//調用父類具有相同形參的構造函數(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name);//調用當前具有相同形參的構造函數(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("kevin");
cn=new Chinese("kevin",22);
}
}
在這段程序中,this和super不再是像以前那樣用“.”連接一個方法或成員,而是直接在其後跟
上適當的參數,因此它的意義也就有了變化。super後加參數的是用來調用父類中具有相同形式的
構造函數,如1和2處。this後加參數則調用的是當前具有相同參數的構造函數,如3處。當然,在
Chinese的各個重載構造函數中,this和super在一般方法中的各種用法也仍可使用,比如4處,你
可以將它替換爲“this.prt”(因爲它繼承了父類中的那個方法)或者是“super.prt”(因爲它
是父類中的方法且可被子類訪問),它照樣可以正確運行。但這樣似乎就有點畫蛇添足的味道
了。
最後,寫了這麼多,如果你能對“this通常指代當前對象,super通常指代父類”這句話牢記在
心,那麼本篇便達到了目的,其它的你自會在以後的編程實踐當中慢慢體會、掌握。另外關於本
篇中提到的繼承,請參閱相關Java教程。
4.date的數據類型。
把字符串轉換成LocalDate ,必須使用下面這個格式 LocalDate date1 = LocalDate.parse("2014-05-26");
1.使用Date類和TimeStamp類的valueOf轉換時間
Date.valueOf();
TimeStamp.valueOf();
如果這兩種轉換直接用在sal語句上,那麼最外層要加雙引號或單引號的;比如插入時間:insert into value('Date.valueOf("2012-12-12")');
2、在數據庫中插入時間
PreparedStatement ps = con.prepareStatement("insert into TableName(dAddTime) values(?)");
這裏有三種方式:
1) ps.setDate(1,new java.sql.Date(System.currentTimemillis()));
2) ps.setTime(2,new java.sql.Time(System.currentTimemillis()));
3) ps.setTimestamp(3,new java.sql.Timestamp(System.currentTimemillis()));
第一種只插入年月日 0000-00-00
第二種只插入時間 00:00:00
第三種則插入完整的時間 0000-00-00 00:00:00.000 .000是毫秒數。
3.java.sql.Date與java.util.Date類型轉換
public static java.util.Date sqlDateToutilDate(java.sql.Date sdate)
{
java.util.Date udate = null;
long t = sdate.getTime();
udate = new Date(t);
return udate;
}
public static java.sql.Date utilDateTosqlDate(java.util.Date udate)
{
java.sql.Date sdate = null;
long t = udate.getTime();
sdate = new java.sql.Date(t);
return sdate;
}
public static void main(String[] args) {
Date date = new Date();
System.out.println("日期轉字符串:" + ConvertDate.DateToStr(date));
System.out.println("字符串轉日期:" + ConvertDate.StrToDate(ConvertDate.DateToStr(date)));
}
4.常見的java程序轉換
//String轉Date
public static void dataTest() {
SimpleDateFormat format = new SimpleDateFormat("2012-12-12 00:00:00");
Date lastModifyTime;
try {
lastModifyTime = format.parse("2012-12-12 00:00:00");
System.out.println(lastModifyTime.toLocaleString());
} catch (ParseException e) {
e.printStackTrace();
}
}
//Date轉String
public static void testData() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(sdf.format("2012-12-12 01:12:11"));
System.out.println(java.sql.Timestamp.valueOf("2012-12-12 01:12:11"));
} catch (Exception e) {
e.printStackTrace();
}
}
===========================================================================
今天的知識點
類和對象
類: 是一種自定義的數據類型。有時把這種數據類型也叫做「類類型」或者「引用數據類型」。「引用」就是內存地址的意思。
對象:通過類創建的變量,或者叫類的實體。
類是一羣對象的特徵母版,對象是類的具體實例。
類是一羣對象的抽象。
類的定義
類所具備的最基本要素:(靜態)屬性、(動態)方法。
語法:
[修飾符] class 類名 {
// 成員變量
[修飾符] 數據類型 成員變量1;
[修飾符] 數據類型 成員變量2;
...
// 方法
[修飾符] 返回值 方法名1([參數列表]) {
方法體語句;
}
[修飾符] 返回值 方法名2([參數列表]) {
方法體語句;
}
...
// 構造器:創建對象用的方法
[修飾符] 類名([參數列表1]) {
方法語句;
}
[修飾符] 類名([參數列表2]) {
方法語句;
}
}
類的三大部件:成員變量、方法、構造器。
實例:
public class Student1 {
// 構造器
Student1(String name, int age, String code) {
this.name = name;
this.age = age;
this.code = code;
}
// 成員變量
String name;
int age;
String code;
// 方法
String intro() {
return "我叫"+this.name+",我的學號是"+this.code+",我今年"+this.age+"歲了。";
}
void listen() {
System.out.println(this.name + "在上課。");
}
}
使用類構建對象
public static void main(String[] args) {
// 構建一個對象:調用類的構造器
Student1 hehao = new Student1("何浩", 20, "C25");
// 用對象:給屬性賦值
hehao.birthday = new Date(); // 賦值
System.out.println(hehao.code); // 獲取屬性值
// 用對象:調用對象的方法
System.out.println(hehao.intro());
hehao.listen();
}
類名的定義要符合 Java 的標識符命名規範,類名首字母大寫,如果多個單詞,使用駝峯命名法則(每個獨立單詞首字母大寫),在 Java 中,只要看到首字母大寫,你就是一個類。
類中三大部件的定義是沒有嚴格的順序的,但是,我們一般遵循,構造器、成員編程、方法這樣的定義順序。
構造器
語法:
[修飾符] 類名([參數列表]) {}
- 構造器是一個特殊的方法,方法名就是類名,沒有返回值(和 void 是有區別的),構造器是類創建對象的唯一途徑。如果一個類沒有顯式的定義一個構造器,那麼編譯器會給這個類默認的定義一個沒有參數的構造器。
- 如果顯式的定義了一個構造器,那麼編譯器就不會給類定義默認的空參數構造器。
成員變量
語法:
[修飾符] 數據類型 成員變量名 [= 默認值];
- 修飾符:可以省略,也可以是 public protected private static final,其中 public protected private 只允許出現一個。
- 數據類型:可以是任意的數據類型(包含基本數據類型、類類型、數組類型)
- 默認值:如果是類類型的,沒有定義默認值,那麼成員變量的值爲 null,如果是基本數據,沒有定義默認值,那麼成員變量的值是有意義的,比如 int 就是 0,boolean 就是 false。
方法
語法:
[修飾符] 方法的返回值數據類型 方法名(形參列表) {
方法體語句;
}
- 修飾符:可以省略,也可以是 public protected private static final abstract,其中 public protected private 只允許出現一個
- 返回值:可以是數據類型(不要忘了自定義的數據類型),也可以是 void,如果定義了返回值,那麼就必須在 return 後面跟隨該類型的值或者對象。
- 方法名:一般首字母小寫,也適用駝峯命名法則,一般是動詞在前,名詞在後,不易過長
- 形參列表:定義方法可以接受的參數,由 0-N 個 「數據類型 參數名」通過 「,」 組合的。一旦方法指定了形參,那麼在調用的時候就必須一一對應的傳入實參。
static 關鍵字
用於修飾成員變量和方法,用 static 修飾的成員變量後者方法是屬於 類 的,而不屬於該類的實例(對象)。通常把 static 修飾的成員變量稱爲「類變量、靜態變量」,方法稱爲「類方法、靜態方法」
靜態的成員是不能訪問非靜態成員的;
靜態成員之間是可以互相訪問的。
static String teacher = "陸老師";
// 方法
static String fun2() {
System.out.println(this.name); // 錯誤代碼
System.out.println(teacher);
return "";
}
使用一個對象的過程
- 定義類
- 構建和使用對象
語法:
類類型 對象名 = new 構造器方法();
實例:
Student1 hehao = new Student1("何浩", 20, "C25");
在內存中的執行過程:
1、在棧內存中,會存儲對象名,在沒有執行構造器創建對象並賦值時,此時對象名對應的值爲 null;
2、通過 new 關鍵字調用類的構造器在堆內存中分配了一塊對象區域;
3、通過賦值運算符 = ,將堆內存中的對象地址賦給棧內存中的變量名;
4、例如再次給對象的屬性賦值:通過棧內存定位到對象在堆內存中的地址,找到相應的成員變量,進行賦值操作。
引用,還可以稱爲「地址」、「指針」,特指類類型,因爲只有類類型纔會在堆內存中分配對象空間,並將地址(指針)在棧內存中用於對象變量名的引用。
this 關鍵字
Java 中使用 this 關鍵字,指向調用該方法的對象。根據 this 所在的位置,大致分爲兩種:
- 出現在構造器中:引用該構造器正在初始化的對象;
- 普通方法中:調用該方法的對象。
this 用於在類定義中,獲取當前對象的屬性,或者調用當前對象的方法。
在類定義中,可以省略 this 關鍵字去調用屬性或者方法,但是在類被編譯的時候,編譯器還是會加上 this 關鍵字。所以強烈建議在類定義時如果要調用該類中的普通成員變量或者方法,還是要把 this 加上去。
用 static 修飾的方法中是不能使用 this 關鍵字的。
Student1(String name, int age, String code) {
this.name = name;
this.age = age;
this.code = code;
}
String intro() {
return "我叫" + this.name + ",我的學號是" + this.code + ",我今年" + this.age + "歲了。";
}
void listen() {
System.out.println("自我介紹:" + this.intro() + " " + this.name + "在上課。");
return;
}
static String fun2() {
return this.intro(); // 錯誤代碼
}