知識點
創(chuàng)建一個對象之前需要做點準備工作
1.構造方法
2.靜態(tài)變量
3.靜態(tài)方法 必須主動調用才執(zhí)行
代碼塊:
在對象創(chuàng)建之前就有限會被調用
類里面可以有多個代碼塊
執(zhí)行順序和出現的先后順序相同
盡量不要在類里面寫多個代碼塊
修飾符(可以沒有,有就是static) {
預先執(zhí)行的內容
}
| 位置 | 作用 | |
|---|---|---|
| 局部代碼塊 | main里 | 給變量限定生命周期,局部代碼塊的變量在執(zhí)行結束后會被java回收 |
| 構造代碼塊 | 類的成員位置 | 在每次執(zhí)行構造方法前先執(zhí)行構造代碼塊,可以將多個構造方法中的相同代碼放到構造代碼塊中,對對象進行初始化 |
| 靜態(tài)代碼塊 | 類的成員位置 | 一般用于給類初始化,被靜態(tài)修飾的代碼塊僅執(zhí)行一次 |
內部類
定義一個類可以在多個地方定義
1.單獨創(chuàng)建一個文件管理一個類
2.直接在文件里面 類A的上面和下面創(chuàng)建
3.直接在某個類A內部創(chuàng)建一個類
一個類A依附于另一個類B
封裝
- 類來封裝屬性和方法
- 訪問權限Private public protected
繼承
- A extends A就是B的子類 B就是A的父類
- 獲得父類的方法和屬性 并且需要添加自己的屬性和方法
- Java只能單繼承但可以變相多繼承:A繼承B,B繼承C,A繼承B與C
- 所有的類都是直接或者間接繼承于Object類
- 當調用子類的一個方法時,如果沒有就會到父類里面去查找
- 如果在子類里面需要調用父類的方法或者顯示調用父類的屬性和方法就使用 super
- 需要在一個方法里面調用super的對應方法的情況
1.父類做完之后,子類再操作
2.子類做點事情之后 再調用父類去完成
如果一個方法需要完成一個功能又不能單獨完成,必須要父類做相應的工作
如果子類里面需要實現父類的方法 就需要重寫
@override - 如果父類有自定義構造方法
- 子類的構造方法里面必修顯示調用父類的構造方法
- 如果父類有內部類,子類中有同名內部類,那么父類中的內部類就被屏蔽了
- 如果非要使用父類中的內部類只能使用全類名
多態(tài)
1.同一個方法 多種實現=在不同的子類中有不同的實現
2.如果有繼承關系:子類的對象可以使用父類變量接收
技術
instanceof運算符用于測試構造函數的prototype屬性是否出現在對象的原型鏈中的任何位置
技術的使用
代碼塊
class Person{
int age;
{
age = 30;
System.out.println("代碼塊 age="+age);
}
//靜態(tài)代碼塊
{
// age = 20; 靜態(tài)代碼塊里不能調用成員變量和實例方法
System.out.println("代碼塊 age");
}
public Person(){
System.out.println("無參構造方法 age="+age);
}
public Person(int age){
this.age = age;
System.out.println("有參構造方法 ");
}
}
內部類
class RelativeLayout{
String view;
//在顯示一個視圖前 必須告訴系統(tǒng)這個視圖的位置
public void show(LayoutParams layout){
System.out.println("視圖"+view+"顯示出來了");
System.out.println("left:"+layout.leftMergin+"top:"+layout.topMergin+"right:"+layout.rightMergin+"botton:"+layout.bottemMergin);
}
//定義一個內部類用于管理相對布局的具體布局屬性
static class LayoutParams{
float leftMergin;
float topMergin;
float rightMergin;
float bottemMergin;
public LayoutParams(float leftMergin,float topMergin,float rightMergin,float bottemMergin){
this.leftMergin = leftMergin;
this.topMergin = topMergin;
this.rightMergin = rightMergin;
this.bottemMergin = bottemMergin;
}
}
}
class testLayout{
public static void main(String[] args){
//創(chuàng)建一個相對布局 容器視圖
RelativeLayout r1 = new RelativeLayout();
r1.view ="分享按鈕";
//顯示這個視圖
//準備好這個視圖的布局屬性
//1.
//RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(20,20, r1.show(params);
//使用匿名對象 只要使用一次
r1.show(new RelativeLayout.LayoutParams(20,20,20,20));
TestInner ti = new TestInner();
ti.test();
}
}
class TestInner{
int a;
int b;
Inner inner;
class Inner{
//費靜態(tài)的內部類可以訪問外部類的屬性和方法
public Inner(){
a = 20;
b = 30;
show();
}
}
public void test(){
inner = new Inner();
}
public void show(){
System.out.println("a = "+a+" b = "+b);
}
}
繼承
class Person1{
String name;
int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
public void walk(){
System.out.println(name + ":走路");
}
public void eat(){
System.out.println(name + ":吃飯");
}
public class inners{
public void show(){
System.out.println("Person1 inner");
}
}
}
class Student extends Person1{
int id;
String school;
inners i;//說明內部類也可以被繼承
public class inners{
public void show(){
System.out.println("Person1 inner");
}
}
public Student(String name,int age,int id,String school){
super(name,age);
this.id = id;
this.school = school;
}
public void show(){
System.out.println("name:"+name);
}
//方法的重寫
@Override
public void walk() {
//super.walk();
System.out.println("快走");
}
@Override
public void eat() {
System.out.println("快吃");
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", id=" + id +
", school='" + school + '\'' +
'}';
}
}
class TestExtends{
public static void main(String[] args){
/**Student xw = new Student();
xw.name = "小王";
xw.age = 20;
xw.id = 001;
xw.school = "斯坦福";*/
Student xw = new Student("小王",20,001,"斯坦福");
//xw.show();
xw.walk();
xw.eat();
System.out.println(xw);
C testc = new C();
A testc2 = new C();
testc2.info();
}
}
多態(tài)
class A{
public void info(){
System.out.println("in A");
}
}
class B extends A{
@Override
public void info() {
System.out.println("in B");
}
}class C extends A{
@Override
public void info() {
System.out.println("in C");
}
}
instanceof運算符
if(p instanceof CivilServant)//判斷P是否在CivilServant內
{
}
技術的實際使用
要求:
定義一個Person類:name age
提供有參數的構造方法
walk方法
eat方法
公務員:salary ,看雜志數量,show
公司職員:salary, tec show
創(chuàng)建多個職員和公務員 放到一個數組里面輸出
將數組里面所有人的信息輸出
實現:
public class Person {
String name;
int age;
public void walk(String name){
this.name = name;
System.out.println(name+"走路");
}
public void eat(String name){
this.name = name;
System.out.println(name+"吃飯");
}
}
class CivilServant extends Person {
int Salary;
int Reading;
public CivilServant(String name,int age,int Salary,int Reading){
this.name = name;
this.age = age;
this.Salary = Salary;
this.Reading = Reading;
}
public void walk(){
System.out.println(name+"慢慢走");
}
public void eat(){
this.name = name;
System.out.println(name+"慢慢吃");
}
public void show(){
this.Salary = Salary;
this.Reading = Reading;
System.out.println("姓名:"+name);
System.out.println("年齡:"+age);
System.out.println("工資:"+Salary);
System.out.println("閱讀量:"+Reading);
}
}
class Staff extends Person {
int Salary;
String Tec;
public Staff(String name,int age,int Salary,String Tec){
this.name = name;
this.age = age;
this.Salary = Salary;
this.Tec = Tec;
}
public void walk() {
//super.walk();
System.out.println("快走");
}
public void eat(){
this.name = name;
System.out.println(name+"快吃");
}
public void show(){
this.Salary = Salary;
this.Tec = Tec;
System.out.println("姓名:"+name);
System.out.println("年齡:"+age);
System.out.println("工資:"+Salary);
System.out.println("技術:"+Tec);
}
}
import java.util.ArrayList;
public class Output {
public static void main(String[] args){
ArrayList<Person> peoples = new ArrayList<>();
Person c1 = new CivilServant("J",20,8000,10);
Person c2 = new CivilServant("K",25,9000,15);
peoples.add(c1);
peoples.add(c2);
Person s1 = new Staff("Z",20,15000,"C");
Person s2 = new Staff("Y",25,25000,"C++");
peoples.add(s1);
peoples.add(s2);
for(Person p: peoples){
if(p instanceof CivilServant)
{
CivilServant c = (CivilServant)p;
c.show();
System.out.println();
}
else{
Staff s = (Staff)p;
s.show();
System.out.println();
}
}
}
}
隨筆
果然,寫小型demo還是要輕松得多。大型demo先不說繞去繞來的各種循環(huán)或者判斷,光是數不清的變量就足夠讓我頭大了,就像夏洛特煩惱的經典場景 馬什么冬梅一樣,先前的定義的變量,到后面再次調用,需要調用的啥?調用的是哪一個....確實是一個讓人禿頭的問題