6.面向对象 -类.md



1. static:

很多时候将static直接翻译为静态,但是这个描述不够准确,static是用来定义类变量,也就是说被static定义的变量不属于这个类的某个实例。所以被static定义的成为类变量、类方法;反之为实例变量


需要注意的是,在静态方法中不能直接通过对象去调用,需要通过类去调用

123456789101112131415 public class NewClassTest {
public void jump(){
System.out.println("This is NewClassTest");
}

public void run(){
    System.out.println("This is run");
    jump();
}
 
//static 
public static void sFun(){
    new NewClassTest().run();   //correct
    run();                      //error
}

}

2. 类在内存中,每一个类在创建在栈内存中,当创建一个对象的时候,将非类变量再堆内存中创建,而类变量是不会因为创建对象而在堆中重新创建

并且访问类变量不能用对象的方式,必须用类的方式!

3. 对象、引用和指针:

    Java中的变量都是引用,指针被封装了。当对象没有被引用时候就会被垃圾回收机制回收。也可以将对象赋值null,标记回收此对象。

4. 类名和文件名的关系

5. Java的set和get方法

5. 包的概念:

包的命名:

父## 包和子包之间的类关系:

import包:

特殊情况的引用

Java文件结构



6.构造器

Java可以自定义构造,可以简单理解为C++的构造,如果定义了私有的构造,即不使用默认的无参构造,那么在创建对象的时候,默认的构造是非法的,如果需要多个构造,那么需要定义多个构造,形成构造的重载:



package aaa;
 
public class Study {
 
    private int num;
    private String name;
     
    //这里既可以为public也可以为private,具体区别待理解
    private Study(String name){
        this.name = name;
    }
     
     
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Study s = new Study("aaa");   //这里合法!
        Study ss = new Study();       //这里会报错!
        System.out.print(s.name);
    }
 
}

关于构造在的初始化过程:

在构造中调用构造:

package aaa;
 
public class Study {
 
    private int num;
    private String name;
     
    //无参构造
    public Study(){};
     
    //一个参数的构造
    private Study(String name){
        this.name = name;
    }
     
    //两个参数的构造
    public Study(String name, int num){
        this(name);   //调用了一个参数的构造,用this
        this.num = num;
    }
     
     
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Study s = new Study("aaa");     //没有被其他构造再调用,只初始化自己,num默认初始化为0
        System.out.println(s.name);
        System.out.println(s.num);
         
        Study ss = new Study("bbb", 2); //在构造中调用了一个参数的构造
        System.out.println(ss.name);
        System.out.println(ss.num);
    }
 
} 



7.继承

注意:Java是单继承,不同于C++,每个子类只有一个直接父类。关键字extends

修饰符 class SubClass extends SuperClass{
    //类定义部分
}
      子类继承后获得父类的全部变量和方法,构造除外。
      **但是可以间接继承多个父类**

方法的覆盖(Override):

super关键字

子类需要调用父类中被覆盖的实例方法,可以用Super关键字来调用,需要注意的是和this不能出现在static关键字修饰的方法中一样,super也不可以调用类方法

//在两个文件中定义类

//父类
public class Bird{
    public int num = 1;
     
    public void fly(){
        System.out.println("Bird can fly!");
    }
}
 
//子类
public class Drck extends Bird{
    public int num = 2;
     
    public void fly(){
        System.out.println("Drck can not fly!");
    }
     
    public void accessBirdNum(){
        System.out.println(super.num);  //调用父类变量
    }
     
    public void accessDrckNum(){
        System.out.println(num);
    }
}

需要注意的是有隐藏的情况,在父类和子类同名的情况下:

//父类
public class Bird{
    public String fly = "Bird can fly";
}
//子类
public class Drck extends Bird{
        //实际上父类的fly被这里隐藏了
    private String fly = "Drck can not fly";
}
//打印
public class Study {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Drck dc = new Drck();
                System.out.println(dc.fly);            //这里编译不过,  
        System.out.println(((Bird)dc).fly);  //向上转为父类
    }
}

8.多态

//父类
public class Bird{
    public String name = "Bird";
    //父类独有的方法
    public void birdTest(){
        System.out.println("Bird fly");
    }
    //会被子类方法覆盖
    public void test(){
        System.out.println("父类的test");
    }
}
 
//子类
public class Drck extends Bird{
    public String name = "Drck";
    //子类独有的方法
    public void drckTest(){
        System.out.println("drck fly");
    } 
    //覆盖了子类
    public void test(){
        System.out.println("子类的test");
    }
}
 
public class Study {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Bird bd = new Drck();
        System.out.println(bd);
        bd.birdTest();    //父类的方法
        bd.test();        //子类的方法
        //bd.drckTest();  //编译的类型是Bird,没有drckTest方法,编译报错
    }
}

引用变量的强转

强转的规则:
1. 基本的数值类型
2. 有继承关系的两个类型之间
是否可以强制转换可以用instanceof来判断

子类和父类的封装

使用继承的前提:

9.类的初始化

10.Java增强的包装类

•自动装箱(AutoBoxing)和自动拆箱(AutoUnboxing)
Java中除了基本数据类型外,所有引用类型的变量都继承自Object,都可当做Object类型变量使用。基本数据类型在Java中通过特定的包装类实现:

public class Study {
    public static void main(String[] args) {
        Integer inObj = 2;
        Float flObj = 2f;
        Double dbObj = 2.0;
        Byte byObj = 1;
        Character chObj = 'c';
        Boolean bObj = false;
        Short shObj = 1;
        //Object
        Object ob = true;
         
        if (ob instanceof Boolean) {
            bObj = (Boolean)ob;
        }              
    }
}


自动装箱和拆箱的过程由Java完成,利用了向上转型的特性。不需要我们认为干预,但是要注意的是不能将错误的类型装箱和拆箱:将int和Float混用

String和其他类型的互转

### 基本类型转String用praseXXX(String s)或者构造XXX(String s)
### String转基本类型用s.valueOf()方法或者 + ""的方式

``Java
public class Study {
public static void main(String[] args) {
int num = 2;
float numf = 2.2f;
String snum = "123";
//String转换为基本类型,使用praseXXX(String s)
int num1 = Integer.parseInt(snum);
System.out.println("int num:" + num1);
//String转换为基本类型,使用构造XXX(String s)
float num2 = new Float(numf);
System.out.println("float num:" + num2);
//基本类型转换为String,使用String的方法s.valueOf()
String s = String.valueOf(numf);
System.out.println("String num:" + s);
//基本类型转换为String,使用+符号
String s1 = num + "";
System.out.println("String plus num:" + s1);
}//main
}



## toString方法
 

```Java
package aaa;
 
//定义个类,并重写toString方法
public class Bird{
    private int wing;
    private int eye;
     
    //无参构造
    public Bird(){
    }
     
    //有参构造
    public Bird(int wing, int eye){
        this.wing = wing;
        this.eye = eye;
    }
     
    //省略getter和setter方法
     
    //Override toString
    public String toString(){
        return "一只鸟有" + wing + "双翅膀" + eye + "双眼睛";
    }
 
}
//调用

public class Study {
    public static void main(String[] args) {
        Bird bd = new Bird(2,2);
        System.out.print(bd);
    }//main
}

equals方法

单例类

public class Singleton {
    private static Singleton instance;
    //将默认构造私有,方式重复创建对象
    private Singleton(){
    }
    //通过开放的方法获取唯一的实例
    public static Singleton getInstance(){
        if (null != instance){
            instance = new Singleton();
        }
        return instance;
    }
}
原文地址:https://www.cnblogs.com/bugstar/p/8492450.html