小類型向大類型轉(zhuǎn)換
不同類型的數(shù)據(jù)經(jīng)常出現(xiàn)相互轉(zhuǎn)換的現(xiàn)象.
1, 在Java中小類型向大類型的轉(zhuǎn)換會自動完成, 即 不需要程序員編寫額外的代碼, 由JVM負(fù)責(zé), ?自動類型轉(zhuǎn)換也叫"隱式類型轉(zhuǎn)換"
2, 自動轉(zhuǎn)換的規(guī)則: 符號位會自動擴(kuò)展, 最高位負(fù)數(shù)補(bǔ)1, 正數(shù)補(bǔ)0.
3, 自動類型轉(zhuǎn)換包含以下情況: (1):byte->short->int->long->float->double ? (2):int和char類型的數(shù)據(jù)在某些情況下可以自動相互轉(zhuǎn)換
4, 整數(shù)到浮點(diǎn)數(shù)轉(zhuǎn)換會損失精確度
代碼例: int i = -2;
long l = i;
System.out.println(i+":"+Integer.toBinaryString(i));//-2:11111111111111111111111111111110
//long類型輸出的值, 高于32位的自動補(bǔ)1, 其余不變
System.out.println(l+":"+Long.toBinaryString(l));//-2:1111111111111111111111111111111111111111111111111111111111111110
5, 小類型向大類型轉(zhuǎn)換一般情況下是安全的
6, 當(dāng)小類型的精度高于大類型時(shí)要注意精度丟失的隱患.
int類型轉(zhuǎn)換為float類型:
int i = 0x1000001;
float f = i;
//float類型變量在存儲int類型的變量時(shí)候丟失了最后一位: 原因是:float類型的位數(shù)是23位
System.out.println(Integer.toBinaryString(i)+":"+i);//1000000000000000000000001:16777217
// 因?yàn)镕loat里面沒有這個(gè)轉(zhuǎn)成二進(jìn)制的方法(toBinaryString), 所以需要先強(qiáng)制轉(zhuǎn)換為int類型,然后再轉(zhuǎn)成二進(jìn)制
System.out.println(Integer.toBinaryString((int)f)+":"+f);//1000000000000000000000000:1.6777216E7
long類型轉(zhuǎn)換為double類型
當(dāng)小類型向大類型轉(zhuǎn)換時(shí)候,如果小類型的精度值大于大類型, 要注意精度丟失的問題
大類型向小類型轉(zhuǎn)換
1, 強(qiáng)轉(zhuǎn)類型轉(zhuǎn)換-簡稱強(qiáng)轉(zhuǎn)
2, 強(qiáng)制類型類型轉(zhuǎn)換時(shí), 要注意邊界數(shù)風(fēng)險(xiǎn)問題
int類型與char類型的轉(zhuǎn)換
Java對char類型的數(shù)據(jù)在底層是按int類型來處理的
int類型與char類型在賦值時(shí)可自動轉(zhuǎn)換
代碼例: char c = 65;
int i = 'B';
System.out.println(c+","+i);//A,66
字符類型的數(shù)據(jù)可進(jìn)行數(shù)值計(jì)算:?
代碼例: char c = 'A';
int i = c+1;
c = (char) (c+1);
System.out.println(c+":"+i);//B:66
通過args數(shù)組獲取數(shù)據(jù)
通過main方法的args數(shù)組可以從控制臺獲取一組字符串?dāng)?shù)據(jù)
案例: 給main方法的args數(shù)組輸入兩個(gè)整數(shù), 對這兩個(gè)整數(shù)進(jìn)行四則運(yùn)算
注意: 在運(yùn)行前先要給args數(shù)組賦值: run-run configurations-arguments-賦值即可
public static void main(String[] args) {
//parseInt把字符串轉(zhuǎn)換為int類型
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
System.out.println(a+"+"+b+"="+(a+b));//10+3=13
System.out.println(a+"-"+b+"="+(a-b));//10-3=7
System.out.println(a+"*"+b+"="+a*b);//10*3=30
System.out.println(a+"/"+b+"="+a/b);//10/3=3
}
通過Scanner從控制臺獲取數(shù)據(jù)
1, Scanner類用于掃描從控制臺輸入的數(shù)據(jù), 可以接收字符串和基本數(shù)據(jù)類型的數(shù)據(jù)
2, Scanner類位于java.util.Scanner包中
Scanner類的常用方法
1, String next(); ?作用: 接收控制臺輸入的一個(gè)字符串, 以空格或回車作為一次數(shù)據(jù)輸入的結(jié)束
2, String nextLine(); ?作用: 接收控制臺輸入的一個(gè)字符串,以回車作為輸入的結(jié)束, 所以可以接收空格作為字符串的一部分
3, int nextInt(); 作用: 接收控制臺輸入的一個(gè)int類型的數(shù)據(jù)
4, double nextDouble(); 作用: 接收控制臺輸入的一個(gè)double類型的數(shù)據(jù)
5, boolean nextBoolean(); 作用: 接收控制臺輸入的一個(gè)boolean類型的數(shù)據(jù)
6, 輸入char類型的數(shù)據(jù) : ?Scanner類型沒有提供直接輸入char類型的方法, 可以通過charAt()方法從next()或nextLine()獲取輸入的字符
char String.charAt(int index);? 作用: 從字符串中獲取指定下表的字符, 下標(biāo)從0開始.? ? ? ? ? ? ? ? 例如:"abc".charAt(0)的結(jié)果是a.? "abc".charAt(1)的結(jié)果是b ? ??
例如; next().charAt(0); 從控制臺輸入的字符串中獲取第一個(gè)字符
通過Scanner從控制臺接收數(shù)據(jù)的步驟:?
step1: 創(chuàng)建Scanner類的一個(gè)對象? 示例: Scanner scanner = new Scanner(System.in);//System.in是用來指定scanner從控制臺輸入的數(shù)據(jù)
step2, 通過scanner調(diào)用next等方法, 接收控制臺輸入的數(shù)據(jù). ?示例: System.out.println("姓名: "); String name = scanner.next();
代碼例如: public static void main(String[] args) {
//姓名, 性別, 年齡等都需要從控制臺輸入
//步驟一. 創(chuàng)建Scanner對象
Scanner scanner = new Scanner(System.in);
//步驟二, 向控制臺輸出文本
System.out.println("姓名:");
String name = scanner.next();
System.out.println("性別:");
char sex = scanner.next().charAt(0);
System.out.println("年齡:");
int age = scanner.nextInt();
System.out.println("身高:");
double height = scanner.nextDouble();
System.out.println("性格:");
String type = scanner.next();
System.out.println("嗨, 大家好, 俺叫"+name+"性別是"+sex+"今年"+age+"身高是"+height+"性格比較"+type+", 希望大家能喜歡俺");}
封裝性
1, 封裝性的產(chǎn)生目的 ? ?保護(hù)某些屬性和方法不被外部所看見
2, 封裝的實(shí)現(xiàn) ? 為屬性和方法進(jìn)行封裝是通過關(guān)鍵字private聲明的
3, 封裝性 的產(chǎn)生目的 ? 保護(hù)某些屬性和方法不被外部所看見
4, 封裝的實(shí)現(xiàn) ?為屬性和方法進(jìn)行封裝是通過關(guān)鍵字private聲明的實(shí)現(xiàn)該屬性的set和get方法, 為外部所訪問
代碼
class Person{
private int age;
private String name;
public void tell(){
System.out.println("年齡:"+getAge()+" \n"+"姓名:"+getName());
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}}
public class ClassDemo1 {
public static void main(String[] args) {
Person per = new Person();
per.setAge(30);//設(shè)置年齡
per.setName("哈哈");
per.tell();}
匿名對象
1, 匿名對象就是沒有名字的對象, 如果程序中只是用一次改對象, 就可以使用匿名對象的方式
代碼:
class Student{
public void tell(){
System.out.println("Hello");
}
}
public class ClassDemo2 {
public static void main(String[] args) {
//正常方式訪問
// Student stu = new Student();
// stu.tell();
//匿名對象方式訪問
new Student().tell();}
構(gòu)造方法
1, 格式: ?如圖
2, 注意點(diǎn): 1)構(gòu)造方法名稱必須要與類名一致 ?, 2)構(gòu)造方法無返回值
3, 構(gòu)造方法主要是為類中的屬性進(jìn)行初始化
4, 每個(gè)類在實(shí)例化之后都會調(diào)用構(gòu)造方法, 如果沒有構(gòu)造方法, 程序在編譯的時(shí)候會創(chuàng)建一個(gè)無參的什么都不做的構(gòu)造方法
5, 構(gòu)造方法也可以進(jìn)行重載 ? ? ?重載(兩個(gè)方法,同名不同參.參數(shù)個(gè)數(shù)不同)
代碼:
class Person {
int age;
String name;
//構(gòu)造方法
public Person(int a, String n){
age = a;
name = n;
System.out.println("姓名"+name+"? 年齡"+age);
}
//構(gòu)造方法
public Person(int a){
age = a;
System.out.println("年齡 "+age);
}
}
//上面重載: 方法同名不同參
public class ClassDemo01 {
public static void main(String[] args) {
// Person per = new Person(11,"lisi");
Person per1 = new Person(13);
}}
Java面向?qū)ο蠖鄳B(tài)性
1, 多態(tài)性的體現(xiàn): 方法的重載和重寫, ?對象的多態(tài)性
2, 對象的多態(tài)性: ?向上轉(zhuǎn)型: 程序會自動完成 ? 父類 ?父類對象 = 子類實(shí)例
向下轉(zhuǎn)型: 強(qiáng)制類型轉(zhuǎn)換 ? 子類 ?子類對象 = (子類)父類實(shí)例
代碼:
class A{
public void tell1(){
System.out.println("A-tell1");
}
public void tell2() {
System.out.println("A-tell2");
}
}
class B extends A{
public void tell1() {
System.out.println("B-tell1");
}
public void tell3() {
System.out.println("B-tell3");
}
}
public class PolDemo01 {
public static void main(String[] args) {
//向上轉(zhuǎn)型
// B b = new B();
// A a = b;
// a.tell1();
// a.tell2();
//向下轉(zhuǎn)型前必須要先向上轉(zhuǎn)型
A a = new B();
B b = (B)a;
b.tell1();
b.tell2();
b.tell3();}}
代碼:?
class A{
public void tell1() {
System.out.println("A--tell1");
}
}
class B extends A{
public void tell2() {
System.out.println("B -- tell2");
}}
class C extends A{
public void tell3() {
System.out.println("C--tell3");
}}
public class PolDemo02 {
public static void main(String[] args) {
say(new B());
say(new C());
}
public static void say(A a){
a.tell1();
}}
instanceof 關(guān)鍵字
1, 在Java中可以使用instanceof關(guān)鍵字判斷一個(gè)對象到底是不是一個(gè)類的實(shí)例 ; A a = new A(); --(a instanceof A)
面向?qū)ο蟪橄箢悜?yīng)用
代碼:
//建立一個(gè)抽象類
abstract class People{
//兩個(gè)屬性
private int age;
private String name;
//連個(gè)屬性的set和get方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//構(gòu)造方法
public People(int a, String n){
// System.out.println("年齡:"+age+" 姓名"+name);
this.age = a;
this.name = n;
}
//共有的抽象方法
public abstract void want();
}
//Student類, 擴(kuò)展自People類
class Student extends People{
private int scroe;
public int getScroe() {
return scroe;
}
public void setScroe(int scroe) {
this.scroe = scroe;
}
public Student(int a, String n, int s) {
super(a, n);
this.scroe = s;
}
@Override
public void want() {
System.out.println("姓名"+getName()+" 年齡"+getAge() + "成績" + getScroe());
}
}
//Worker類擴(kuò)展自People
class Worker extends People{
private int money;
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public Worker(int a, String n, int m) {
super(a, n);
this.money = m;
}
@Override
public void want() {
System.out.println("姓名"+getName()+" 年齡"+getAge() + "工資" + getMoney());
}
}
public class AbsDemo {
public static void main(String[] args) {
Student stu = new Student(10, "hh", 99);
stu.want();
Worker w = new Worker(32, "ww", 2000);
w.want();
}}
Java面向?qū)ο?接口的使用
代碼:?
//首先需要有一個(gè)公共的接口USB
interface USB{
//兩個(gè)抽象方法
void start();
void stop();
}
//定義一個(gè)電腦
class Computer{
public static void work(USB u) {
u.start();
System.out.println("工作中");
u.stop();
}
}
//創(chuàng)建U盤類, 擴(kuò)展自USB
class USBDisk implements USB{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("U盤開始工作");
}
public void stop() {
// TODO Auto-generated method stub
System.out.println("U盤停止工作");
}
}
//創(chuàng)建打印機(jī)
class Printer implements USB{
@Override
public void start() {
System.out.println("打印機(jī)開始工作");
}
@Override
public void stop() {
System.out.println("打印機(jī)停止工作");
}
}
public class InterDemo01 {
public static void main(String[] args) {
Computer.work(new USBDisk());
Computer.work(new Printer());}}
?繼承的實(shí)現(xiàn)
1, 繼承的基本概念 ? : 擴(kuò)展父類的功能
2,Java中使用extends關(guān)鍵字完成繼承 ? ? ?class 子類 extends 父類{}
代碼:?
class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void tel() {
// System.out.println("姓名"+getName()+" 年齡"+getAge());
}
}
class Student extends Person{
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public void want() {
System.out.println("成績"+getScore()+"姓名"+getName()+" 年齡"+getAge());
}
}
public class ExtendsDemo01 {
public static void main(String[] args) {
Student stu = new Student();
stu.setAge(13);
stu.setName("zhangsan");
stu.setScore(100);
stu.tel();
stu.want();
}
}