JAVA入门
-
基本语法
数组
几种声明数组的方法
array = new int[5]; int[] array = new int[]{1,2,3,4}; int array[] = new int[]{1,2,3,4}; int[] array = {1,2,3,4}; int array[] = {1,2,3,4}; import java.util.Arrays; Arrays.sort(hobbys); //用于排序
foreach 不能用于给数组赋值 因为是临时变量,只读不写。
类与对象
注意事项
- float型变量赋值时需加f,否则会被当做double
静态方法
- 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。
- 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
- 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量
- 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。
初始化
-
构造方法与类同名没有返回值
-
初始化块
public HelloWorld() { System.out.println("通过构造方法初始化name"); name = "tom"; } // 初始化块 { System.out.println("通过初始化块初始化sex"); sex = "男"; } // 静态初始化块 static { System.out.println("通过静态初始化块初始化age"); age = 20; }
封装
- 使用封装,在属性的名字前边加上private,可以限制对象属性的直接修改和访问。用户通过对象的set和get方法对属性进行读写。
- 右键编辑器,generate可以自动生成set get方法;
- this关键字可以避免类方法中的形参与类的属性同名的情况,使用this即可访问类的属性。
内部类
-
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
-
内部类的方法可以直接访问外部类的所有数据,包括私有的数据
-
内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
public class HelloWorld{ //外部类的私有属性name private String name = "imooc"; //外部类的成员属性 int age = 20; //成员内部类Inner public class Inner { String name = "爱慕课"; //内部类中的方法 public void show() { System.out.println("外部类中的name:" + HelloWorld.this.name); System.out.println("内部类中的name:" + name); System.out.println("外部类中的age:" + HelloWorld.this.age); } } //测试成员内部类 public static void main(String[] args) { //创建外部类的对象 HelloWorld o = new HelloWorld (); //创建内部类的对象 Inner inn = o.new Inner(); //调用内部类对象的show方法 inn.show(); } } }
静态内部类
- 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问
- 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();
方法内部类
- 方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
- 由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符 。
系统中的包
包的命名都是小写字母
包名称 功能 java.lang.(类) 包含java语言基础的类 java.util.(类) 包含java语言中各种工具类 java.io.(类) 包含输入、输出相关功能的类 //类名相同的情况下import包 import testP.testClass testClass hello = new testClass(); //是testP的Class testP.testClass helloP = new testP.testClass(); //是testP的Class //类名相同的情况下不import包 testClass hello = new testClass(); //是test的Class testP.testClass helloP = new testP.testClass(); //是testP的Class
继承
- 构造子类对象时,先构造一个父对象,然后再调用子对象的构造函数。
- 属性里的值是先初始化的,然后才调用构造方法里的对值得安排。
- super.属性or方法 可以调用父类得属性和方法
- 要用super();作为父类的构造方法,一定要放在第一行。否则自动调用无参的父类构造方法。
- 如果父类定义了有参数的构造方法,则子类构造方法中若缺省super()就会报错。
Object
toString()
- 默认返回这个类在内存中的地址。
- 重写这个可以返回属性。
- 使用时,System.out.PrintIn(ClassA)
equals()
- 比较两个是否指向同一地址。
- 重写可以 判断某些属性是否一样。
- 使用时,ClassA.equal(ClassB)
getclass()
- 用于判断,是否为同一个类。
ClassA.getclass() == ClassB.getclass()
final
- 修饰类,不可以被继承。
- 修饰方法,不允许被覆盖。
- 修饰属性,将其变为常量,不会进行隐式得初始化(类得初始化属性必须有值),或在构造方法中赋值。
多态
引用多态
- 父类的引用可以指向子类的对象
- 子类的引用不可以指向父类的对象
Animal obj1 = new Animal(); Animal obj2 = new Dog(); //可以 用父类的引用指向子类的对象 Dog obj3 = new Animal(); //不可以用子类的引用指向父类的对象
方法多态
- 创建本类对象时,调用的方法为本类方法
- 创建子类对象时,调用的方法为子类重写的方法或者继承的方法
- 子类独有的新方法,是不能通过obj2调用的
Animal obj1 = new Animal(); //本类有Eat方法 Animal obj2 = new Dog(); //Dog有重写的方法 Animal obj3 = new Cat(); //Cat无方法 obj1.eat(); //父类的方法 obj2.eat(); //Dog重写的方法 obj3.eat(); //父类的方法
抽象类
- 某些情况下,某个父类只是知道其子类应该包含的怎样的方法,但不知道这些子类如何实现这些方法。
- 从多个具有相同特征的类中抽象出一个抽象类,从这个抽象类作为子类的模板,从而避免了子类设计的随意性。
使用规则
- abstract 定义抽象类
- abstract定义抽象方法,只有声明,不需要实现
- 包含抽象方法的类是抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 抽象类不能直接创建,可以测定仪引用变量。
public abstract class absClass { public abstract void call(); public abstract void message(); } //抽象模板上规定的两个函数都不可以缺少,可以多其他的函数,否则会报错 public class subClass extends absClass { public void call() { System.out.println("call"); } public void message() { System.out.println("message"); } public void fuck() { } } //调用时 absClass class1 = new subClass(); class1.call(); class1.message();
友元
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
class Box { double width; public: double length; friend void printWidth( Box box ); void setWidth( double wid ); }; // 成员函数定义 void Box::setWidth( double wid ) { width = wid; } // 请注意:printWidth() 不是任何类的成员函数 void printWidth( Box box ) { /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */ cout << "Width of box : " << box.width <<endl; }
接口
- 接口限制了这些类中必须提供某些方法
- interface关键字声明 implements调用
- 接口中只可以有常量和抽象方法
- 常量自动添加public static final 修饰符
- 方法自动添加public abstract修饰符
[修饰词] interface 接口名 extends 父类[extends 父接口1,父接口2] { 零到多个常量定义 领导多个抽象方法的定义 }
匿名内部类的方法实现接口
//声明一个接口 interface ItestClass{ void playGame(); } //正常使用接口 public class subClass implements ItestClass { @Override public void playGame() { System.out.println("实现接口"); } } //匿名内部类实现接口 ItestClass class2 = new ItestClass() { @Override public void playGame() { System.out.println("匿名内部类实现接口1"); } };//这里有一个分号 new ItestClass() { @Override public void playGame() { System.out.println("匿名内部类实现接口2"); } }.playGame();
-