Java中的println和printf的区别:
println是用于输出参数内容,然后换行,其参数个数固定为一个。 printf是用于输出带各种数据类型的占位符的参数,其参数个数是不定的。
package testecclipse;
public class addtest {
public static void main(String[] args) {
int m=12,n=34;
System.out.println(m++);
System.out.printf("%d%d",m++,++n);
System.out.printf("%d%d\n",n++,++m);
}
}
Java SE 面向对象详解:
方法不能嵌套定义,可以嵌套调用方法。
- 面向对象程序设计的三大基本特征: 继承(Inheritence)、封装(Encapsulation)、多态
(Polymorphism) - 封装: 类包含了数据与方法,将数据与方法放在一个类中就构成了封装。
- 如何定义类?
修饰符 class 类的名字 { //类的内容(包含了属性与方法) } - 方法。如何定义方法?
修饰符 返回类型 方法名称([参数 1, 参数 2, 参数 3…]) { //方法体 } - main方法是整个 Java程序的入口点,如果类的定义中没有 main方法,则程序无法执行。
- 方法定义不能嵌套,也就说不能在一个方法中定义另外一个方法。方法只能定义在类中。
- 关于方法的执行:首先需要定义方法,接下来就可以使用方法(调用方法),当方法调
用完毕后,方法可以返回值。 方法到底是否返回值是由方法的定义决定的。 - 如何生成对象?通过类来生成对象(通常使用 new 关键字来生成对象)。
public class Person{ }
类名 变量名 = new 类名();
Person person = new Person();
Person person2 = new Person();
Person person3 = new Person();
- 方法调用需要通过对象来完成,方法调用的形式是:
对象变量.方法名([参数值 1, 参数值 2, 参数值 3….]); - 关于方法的注意事项:
1) 在方法定义中,方法的返回类型与 return 后面的变量或常量类型保持一致。 2) 在方法调用时,给方法传递的参数需要与方法定义时的参数保持一致(参数个数一 致,参数类型一致)。 3) 方法定义时的返回类型与接收方法返回值的变量类型保持一致。 - public int add(int a, int b)
{ return a + b; } 方法定义时的参数叫做形式参数。 int a = test.add(8, 3); 方法调用时所赋予的具体值叫做实际参数。 - 关键字 void 表示方法不返回值。
- 如果方法不返回值,那么声明方法的时候使用 void 关键字, 在方法定义中可以有两种
情况实现不返回值: a) 不使用 return 语句。 b) 使用 return,但 return 后面没有任何值或者变量, return 后面只有一个分号,表示 退出方法,返回到方法的调用端。 使用方式: return; 14.如果一个java源文件中定义了多个类,那么这些类中最多只能有一个类是public的,换句话说,定义的多个类可以都不是public的。 15.在java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方法统一是传值(pass by value).Java中没有传引用(pass by reference)的概念。 第16讲 方法重载剖析 1.引用回顾
package testecclipse;
public class ParamTest3 {
public void change(Person person,Person person2) {
person.name="lisi";
person2.name="wangwu";
}
public static void main(String[] args) {
Person person = new Person();
person.name="zhangsan";
Person person2=person;
ParamTest3 test=new ParamTest3();
test.change(person, person2);
System.out.println(person.name);
}
}
class Person{
String name;
}
2.类和对象 类的格式: 修饰符 class 类名{ 类的成员变量 类的成员方法 } 类包括成员变量(用于描述对象的属性)和成员方法(描述对象的行为)。 成员变量格式:修饰符 数据类型 成员变量名 调用成员变量,使用(.)操作符,调用格式:对象名.成员变量名(属性); 成员方法格式: 修饰符 返回类型 方法名([参数类型 参数名])[throw 异常列表]{ 方法体; } 调用成员方法:对象名.成员方法名(); 创建对象:类名 对象名=new 类名([参数]); new 关键字在生成对象时完成了三件事情: a) 为对象开辟内存空间。 b) 调用类的构造方法。 c) 将生成的对象的地址返回。 package testecclipse; //方法参数传递、类、成员变量、方法调用
public class PeopleTest {
int age;
public void change2(PeopleTest p) {
p =new PeopleTest();
p.age++;
}
public void change3(PeopleTest p,int i) {
p.age++;
i++;
}
public void change0(int i){
i++;
}
public static void main(String[] args) {
PeopleTest people =new PeopleTest();
people.change3(people,people.age);
System.out.println(people.age);
}
}
5.方法重载(Overload) 表示两个或多个方法名字相同,但方法参数不同。方法参数不同有两层含义: (1)参数个数不同 (2)参数类型不同。注意:方法的返回值对重载没有任何影响
package testecclipse;
public class OverloadTest {
public int add(int a,int b) {
return a+b;
}
public int add(int a,int b,int c) {
return a+b+c;
}
public static void main(String[] args) {
OverloadTest test =new OverloadTest();
int result =test.add(1, 2);
int result2=test.add(1,2,3);
System.out.println(result);
System.out.println(result2);
}
}
6.构造方法的重载 构造方法重载:只需看参数即可。如果想在一个构造方法中调用另外一个构造方法,那么可以使用this() 的方式调用,this()括号中的参数表示目标构造方法的参数。this调用构造方法,this()必须要作为构造方法的第一条语句。换句话说,this()前面不能有任何可执行的代码 6.1方法和构造方法的区别: 6.1.1构造方法 java构造函数,也叫构造方法,是java中一种特殊的函数。函数名与类相同,无返回值。 特点:1.方法名称和类名相同 2.不用定义返回值类型(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有) 3.不可以写return语句(返回值类型都没有,也就不需要return语句) 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 构造函数是对象一建立就运行,给对象初始化,就包括属性,执行方法中的语句。 而一般函数是对象调用才执行,用".方法名“的方式,给对象添加功能。 一个对象建立,构造函数只运行一次。 而一般函数可以被该对象调用多次。 注:一般函数不能调用构造函数,只有构造函数才能调用构造函数。 6.1.2构造方法与一般方法在写法上的不同: (1)构造方法: public(修饰符) class(定义类的关键字) Test(类名)(){ //无参 Test(类名)(){ } //带一个参数 Test(类名)(String(变量类型) name(变量名)){ } } (2)一般方法: 定义类:
public(修饰符) class(定义类的关键字) Test(类名)(){
private(修饰符) static(修饰符) String(变量类型) s(变量名) = "hello world";
下面是方法的定义:
public(修饰符) static(修饰符) void(返回值类型) main(方法名)(String[] args(参数)){
System.out.println(s);(代码语句)
}
}
代码示例:
package testecclipse;
public class ConstructorOverload {
public ConstructorOverload() {
this(3);
System.out.println("test");
}
public ConstructorOverload(int i) {
System.out.println(++i);
}
public static void main(String[] args) {
ConstructorOverload col =new ConstructorOverload();
}
}
.继承(Inheritance)
Java是单继承的,意味着一个类只能从另一个类继承(被继承的类叫做父类【基类,base class】,继承的类叫做子类),java中的继承使用extends关键字 7.1.当生成子类对象时,java默认首先调用父类的不带参数的构造方法,然后执行该构造方法,生成父类的对象。接下来再去调用子类的构造方法,生成子类的对象。 换句话说,【要想生成子类的对象,首先需要生成父类的对象,没有父类的对象就没有子类对象,比如:没有父亲就没有孩子】
package testecclipse;
public class Child extends Parent {
public Child() {
public Parent(int i) {
System.out.println("parent");
}
public Parent() {
System.out.println("parent");
}
}
class Parent{
public Parent() {
System.out.println("parent");
}
}
7.2super关键字:super表示对父类对象的引用 7.3如果子类使用super()显式调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不会再去寻找父类的不带参数的构造方法。 与this一样,super也必须要作为构造方法的第一条一句执行。前面不能有其他可行性语句
package testecclipse;
public class Child extends Parent {
public Child() {
super(1);
System.out.println("child");
}
public static void main(String[] args) {
Child child= new Child();
}
}
class Parent{
public Parent(int i) {
System.out.println("parent");
}
public Parent() {
System.out.println("parent");
}
}
7.4继承的特点 (1)父类有的,子类也有, (2)父类没有的,子类可以增加 (3)父类有的,子类可以改变
package testecclipse;
public class InheritenceTest {
public static void main(String[] args) {
Apple apple =new Apple();
System.out.println(apple.name);
}
}
class Fruit{
String name="fruit";
}
class Apple extends Fruit{
String name="apple";
}
7.5继承的注意事项 (1)构造方法不能被继承 (2)方法和属性可以被继续 (3)子类的构造方法隐式地调用父类的不带参数的构造方法 (4)当父类没有不带参数的构造方法时,子类需要使用super来显式地调用父类的构造方法,super指的是对父类的引用。 (5)super管家字必须是构造方法的第一行语句。 第18讲 多态剖析 1.方法重写(Override) 又叫复写,子类与父类的方法返回类型一样、方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。
package testecclipse;
public class InheritenceTest2 {
public static void main(String[] args) {
Dog dog=new Dog();
dog.run();
}
}
class Animal{
public void run() {
System.out.println("animal is running");
}
}
class Dog extends Animal{
public void run() {
super.run();
System.out.println("dog is running");
super.run();
}
}
2.方法重写与方法重载的关系 重载发生在同一个类内部的两个或·多个方法,重写发生在父类与子类之间(没有继承就没有重写)。 3.当两个方法形成重写关系时,可以在子类方法中通过super.run()形式调用父类的run方法,其中super.run()不必放在第一行语句,因此此时父类对象已经构造完毕,先调用父类的run()方法还是先调用子类的run()方法是根据程序的逻辑决定的。 3.在定义一个类的时候,如果没有显式指定该类的父类,那么该类就会继承java.lang.Object类(JDK提供的一个类,Object类是java中所有类的直接或间接父类。) 4.多态(Polymorphism) 我们说子类就是父类(玫瑰是花,)因此多态的意思就是:父类型的引用可以指向子类的对象 Flower类型的对象指向了Rse类型的对象(因为Rose也就是花,eg:男人是人,但不能说人是男人) Java SE Lesson2 1、多态:父类型的引用可以指向子类的对象 2.Parent1 p=new Child1); 当使用多态方式调用方法时,首先检查父类中是否有sing()方法,如果没有则编译错误;如果有,再去调用子类的sing();
package testecclipse;
public class PolyTest {
public static void main(String[] args) {
Parent1 p=new Child1();
p.sing();
}
}
class Parent1{
public void sing() {
System.out.println("parent is singing");
}
}
class Child1 extends Parent1{
}
3.一共有两种类型的强制类型转换: (1)向上类型转换(upcast):比如说将Cat类型转换为Animal类型,即将子类型转换为父类型。多于向上类型转换,不需要显式指定。 (2)向下类型转换(downcat):比如将Animal类型转换为Cat类型。即将父类型转换为子类型。对于向下类型转换,必须要显式指定(必须要使用强制类型转换)。
package testecclipse;
public class PolyTest2 {
public static void main(String[] args) {
Animal1 a=new Dog1();
Dog1 dog=(Dog1)a;
dog.sing();
Animal1 b=new Cat1();
Cat1 d=(Cat1)b;
d.sing();
}
}
class Animal1{
public void sing() {
System.out.println("animal is singing");
}
}
class Dog1 extends Animal1{
public void sing() {
System.out.println("dog is singing");
}
}
class Cat1 extends Animal1{
public void sing() {
System.out.println("cat is singing");
}
}
package testecclipse;
public class PolyTest2 {
public static void main(String[] args) {
Cat1 cat=new Cat1();
Animal1 animal=(Animal1)cat;
animal.sing();
Animal1 a=new Cat1();
Cat1 c=(Cat1)a;
c.sing();
}
}
class Animal1{
public void sing() {
System.out.println("animal is singing");
}
}
class Dog1 extends Animal1{
public void sing() {
System.out.println("dog is singing");
}
}
class Cat1 extends Animal1{
public void sing() {
System.out.println("cat is singing");
}
}
package testecclipse;
public class PolyTest4 {
public void run(Car car) {
car.run();
}
public static void main(String[] args) {
PolyTest4 test=new PolyTest4();
Car car=new BMW();
test.run(car);
QQ qq=new QQ();
test.run(qq);
}
}
class Car{
public void run() {
System.out.println("car is running");
}
}
class BMW extends Car{
public void run() {
System.out.println("BMW is running");
}
}
class QQ extends Car{
public void run() {
System.out.println("QQ is running");
}
}
4.抽象类(abstract class) 使用了abstract关键字所修饰的类叫做抽象类。抽象类无法实例化,也就是说,不能new出来一个抽象类的对象(实例) 5.抽象方法(abstract method) :使用abstract关键字所修饰的方法。抽象方法需要定义在抽象类中。相对于抽象方法,之前所定义的方法叫做具体方法(有声明,有实现) 6.如果一个类包含了抽象方法,那么这个类一定是抽象类。 7.如果某个类是抽象类,那么该类可以包含具体方法(有声明有实现) 8.如果一个类中包含了抽象方法,那么这个类一定要声明成abstract class,也就是说,该类一定是抽象类。反之,如果某个类是抽象类,那么该类既可以包含抽象方法,也可以包含具体方法。
package testecclipse;
public class AbstractTest {
public static void main(String[] args) {
}
}
abstract class T{
public abstract void method();
public void test() {
System.out.println("test");
}
}
9.无论何种情况,只要一个类是抽象类,那么这个类就无法实例化。 10.在子类继承父类(父类是个抽象类)的情况下,那么该子类必须要实现父类中所定义的所有抽象方法;否则,该子类需要声明成一个 abstract class。
package testecclipse;
public class AbstractTest {
public static void main(String[] args) {
R r=new R();
r.method();
}
}
abstract class T{
public abstract void method();
public void test() {
System.out.println("test");
}
}
class R extends T{
public void method() {
System.out.println("method");
}
}
package testecclipse;
public class AbstractTest {
public static void main(String[] args) {
}
}
abstract class T{
public abstract void method();
public void test() {
System.out.println("test");
}
}
abstract class R extends T{
public void method() {
System.out.println("method");
}
}
package testecclipse;
public class AreaAbstractTest {
public static void main(String[] args) {
Shape shape =new Triangle(10,6);
int area=shape.computeArea();
System.out.println("triangle:"+area);
shape =new Rectangle(10,10);
area=shape.computeArea();
System.out.println("Rectangle:"+area);
}
}
abstract class Shape{
public abstract int computeArea();
}
class Triangle extends Shape{
int width;
int height;
public Triangle(int width,int height) {
this.width=width;
this.height=height;
}
public int computeArea() {
return (width*height)/2;
}
}
class Rectangle extends Shape{
int width;
int height;
public Rectangle(int width,int height) {
this.width=width;
this.height=height;
}
public int computeArea() {
return this.width*this.height;
}
}
11.接口(interface) 接口的地位等同于class,接口中的所有方法都是抽象方法。 在声明接口中的方法时,可以使用abstract关键字,也可以不使用。通常情况下都会省略abstract关键字。
package testecclipse;
public interface InterfaceTest {
public void output();
}
12.接口可以看做是一种特殊的抽象类(抽象类中可以有具体方法,也可以有抽象方法,而接口中只有抽象方法,不能有具体方法)。 13.类可以实现接口。实现用implements表示,代表了某个类实现了某个接口。 14.一个类实现了某个接口,那么该类必须要实现接口中声明的所有方法。如果该类是个抽象类,那么久无需实现接口中的方法。 15.Java是单继承的,也就是说某个类只能有唯一个父类。一个类可以实现多个接口。
package testecclipse;
public class InterfaceTest1 {
public static void main(String[] args) {
MyClass myClass=new MyClass();
myClass.output();
myClass.output2();
myClass.output3();
}
}
interface MyInterface{
public void output();
}
interface MyInterface2{
public void output2();
}
class MyParent{
public void output3() {
System.out.println("ouotput3");
}
}
class MyClass extends MyParent implements MyInterface,MyInterface2{
public void output() {
System.out.println("output");
}
public void output2() {
System.out.println("output2");
}
}
16.多态 所谓多态,就是父类型的引用可以指向子类型的对象,或者接口类型的引用可以指向实现该接口的类的实例。关于接口与实现接口的类之间的强制类型转换方式与父类和子类直接的强制类型转换方式完全一样。
package testecclipse;
public class InterfaceTest2 {
public static void main(String[] args) {
AA bb=new BB();
bb.output();
}
}
interface AA{
public void output();
}
class BB implements AA{
public void output() {
System.out.println("BB");
}
}
17.static关键字 可以用于修饰属性,也可以用于修饰方法,还可以用于修饰类(后面的课程讲) 18.static修饰属性:无论一个类生成多少个对象,所有这些对象共用唯一一份static成员变量;一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。
public class StaticTest {
public static void main(String[] args) {
MyStatic myStatic =new MyStatic();
MyStatic myStatic2 =new MyStatic();
myStatic.a=10;
System.out.println(myStatic2.a);
}
}
class MyStatic{
static int a;
}
如果一个成员变量是static的,那么我们可以通过类名.成员变量名的方式来使用它(推荐的方式)。
public class StaticTest {
public static void main(String[] args) {
MyStatic myStatic=new MyStatic();
MyStatic.a=10;
System.out.println(myStatic.a);
}
}
class MyStatic{
static int a;
}
19.static修饰方法:static修饰的方法叫做静态方法。对于静态方法来说,可以使用类名.方法名的方式来访问。
public class StaticTest2 {
public static void main(String[] args) {
MyStatic2.output();
}
}
class MyStatic2{
public static void output() {
System.out.println("output");
}
}
20.静态方法只能继承,不能重写(Override)。
21.final关键字
final可以修饰属性、方法、类。
22.final修饰类:当一个类被final修饰时,表示该类是一个终态类,即不能被继承。
public class FinalTest {
public static void main(String[] args) {
F f=new F();
}
}
final class E{
}
class F{
}
23.final修饰方法:当一个方法被final所修饰时,表示该方法是一个终态方法,即不能被重写(Override)。 24.final修饰属性:当一个属性被final所修饰时,表示该属性不能被改写(即为常量)。 25.当final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化(比如说不能把10变为20);如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了。但该引用所指向的对象的内容是可以发生变化的。
public class FinalTest3 {
public static void main(String[] args) {
People2 people =new People2();
people.address.name="shanghai";
}
}
class People2{
final Address address =new Address();
}
class Address{
String name ="beijing";
}
第二次值改为shagnhai 26对于final类型的成员变量,一般来说有两种赋初值方式: (1) 在声明final类型的成员变量时就赋上初值 (2) 在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋初值。 public class FinalTest4 { final int a;//在声明final类型的成员变量时就赋初值 /*构造方法的特点 * 1.方法名称和类名相同 2.不用定义返回值类型(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有) 3.不可以写return语句(返回值类型都没有,也就不需要return语句) ````java */ public FinalTest4() {//构造方法 a=0; } public FinalTest4(int a) {//构造方法 this.a=a; }
}
/*final赋值的两种方式:
* (1) 在声明final类型的成员变量时就赋上初值
* (2) 在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋初值。
*/
27.static代码块:静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态代码块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要想调用某个类生成对象,首先需要将类加载到java虚拟机上(JVM),然后JVM加载这个类来生成对象。
28.类的静态代码块只执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象时都会调用类的构造方法,所以new一次就会调用构造方法一次。
````java
public class StaticTest4 {
P p=new P();
P p2=new P();
S s=new S();
}
class P{
static {//静态代码块,加载到java虚拟机时就执行
System.out.println("P static block");
}
public P() {//构造方法,创建对象时才会执行,进行初始化
System.out.println("P constructor");
}
}
class Q extends P{
static {
System.out.println("Q static block");
}
public Q() {
System.out.println("Q constructor");
}
}
class S extends Q{
static {
System.out.println("S static block");
}
public S() {
System.out.println("S constructor");
}
}
29.如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的静态代码块,一直执行到最底层的静态 代码块,然后再去执行最顶层类的构造方法,一直执行最底层类的构造方法。注意:静态代码块只执行一次。 30.不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量。 总结:静态的只能访问静态的;非静态的访问一切。 32.This关键字 (1)This关键字只能用于方法体内。当一个对象自动创建后,java虚拟机会为这个对象分配一个引用自身的指针,指针名为this。 (2)this只能在类的非静态方法中使用;静态方法和静态的代码块中绝对不能出现this。 (3)this指代的是当前类或者对象本身。即this代表了当前类或对象的一个“引用”。
public class ThisTest {
int x=0;
public void test(int x) {
x=3;
System.out.println("在方法内部:");
System.out.println("成员变量x="+this.x);
System.out.println("局部变量x="+x);
System.out.println("-------------");
}
public static void main(String[] args) {
ThisTest t=new ThisTest();
System.out.println("调用方法前:");
System.out.println("成员变量x="+t.x);
System.out.println("-------------");
t.test(99);
System.out.println("调用方法后:");
System.out.println("成员变量x="+t.x);
}
}
1、接口补充 (1)接口中所声明的方法都是抽象方法,接口中的方法都是public的。 (3) 接口汇中也可以定义成员变量,接口中的成员变量都是public/final/static的。 (4)一个类不能既是final,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,这样abstract希望该类可以被继承而final明确说明该类不能被继承,两者矛盾。因此一个类不能既是final的,又是abstract的。 2、Design Pattern(设计模式) 2.1单例模式(Singleton) 一个类只会生成唯一的一个对象
package Java_Lesson3_study;
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton =Singleton.getInstance();
Singleton singleton2 =Singleton.getInstance();
System.out.println(singleton == singleton2);
}
}
class Singleton{
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if(singleton==null) {
singleton=new Singleton();
}
return singleton;
}
}
3.包与导入语句剖析 3.1包(package) 用于将完成不同功能的类分门别类,放在不同的目录(包)下。包的命名规则:将公司域名反转作为包名。 域名:www.shengsiyuan.com,则包名:com.shengsiyuan 对于包名:每个字母都需要小写。如果定义类的时候没有使用package,那么java就会认为我们所定义的类位于默认包里面(default package)。 6.编译带有package声明的Java源文件有两种方式: (1)直接编译,然后根据类中所定义的包名,逐一手工建立目录结构,最后将生成的class文件放到该目录结构中(很少使用,比较麻烦) (2)使用编译参数 -d,方式为javac -d.源文件.java,这样在编译后,编译器 会自动帮助我们建立好包所对应的目录结构。 7.有两个包名,分别是aa.bb.cc与aa.bb.cc.dd,那么我们称后者为前者的子包。 8.导入(import),将使用package分离的各个类导入回来,让编译器能够找到所需要的类。 9.import的语法:import com.shengsiyuan.PackageTest; 10.import com.shengsiyuan.,表示导入com.shengsiyuan包下面的所有类。 11.import aa.bb.并不会导入aa.bb.cc包下面的类。这时需要这样写: Import aa.bb.; Import aa.bb.cc.; 12.关于package,import,class的顺序问题: (1)首先需要定义包(package),可选 (2)接下来使用import进行导入,可选 (3)然后才是class或者interface的定义。 13.如果两个类在同一个包下面,则不需要导入,直接使用即可。 3.2.访问修饰符(access modifier) (1)public(公共的):被public所修饰的属性和方法可以被所有类访问。 (2)protected(受保护的):被protected所修饰的属性和方法可以在类内部、相同包、以及该类的子类所访问。 (3)private(私有的):被private所修饰的属性和方法只能在该类内部使用 (4)默认的(不加任何访问修饰符):在类内部以及相同包下面的类所使用。 15. Instanceof(谁的实例):判断某个对象是否是某个类的实例。语法形式:引用名instanceof 类名(接口名),返回一个boolean值。 16、System.out.println(people instanceof People);//结果为true,因为Man是People的子类,根据继承,子类就是父类,因此Man也可以看做是People的实例。
package Java_Lesson3_study;
public class InstaceofTest {
public static void main(String[] args) {
Peo people4=new Peo();
System.out.println(people4 instanceof Peo);
}
}
class Peo{
}
18.相等性的比较(==) (1)对于原生数据类型来说,比较的是左右两边的值是否相等。 (2)对于引用类型来说,比较左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同。 4.java.lang.Object类 Java.lang包在使用的时候无需显式导入,编译是由编译器自动帮助我们导入。 4.1API(Application Programma Interface)应用编程接口 4.2.当打印引用时,实际上会打印出引用所指对象的toString()方法的返回值,因为每个类都直接或间接地继承自Object,而Object类中定义了toString(),因此每个类都有toString()这个方法。 4.3关于进制的表示:16进制,逢16进1,16进制的数字包括:0-9,A,B,C,D,E,F package Java_Lesson3_study;
public class ObjectTest{
public static void main(String[] args) {
Object object =new Object();
System.out.println(object);
System.out.println(object.toString());
String str="aaa";
System.out.println(str);
System.out.println(str.toString());
Student student=new Student();
System.out.println(student);
System.out.println(student.toString());
}
}
class Student extends Object{
public String toString() {
return "Hello World";
}
}
4.3 equals()方法,该方法定义在Object类当中,因此Java中的每个类都该具有该方法,对于Object类的equals()方法来说,它是判断调用equals()方法的引用与传进来的引用是否一致,即这两个引用是否指向的是同一个对象。对于Object类的equals()方法来说,它等价于==。
public class StringTest {
public static void main(String[] args) {
Object object=new Object();
Object object2=new Object();
System.out.println(object.equals(object2));
System.out.println(object.equals(object));
}
}
运行结果: false true 对于String类的equals()方法来说,它是判断当前字符串与传进来的字符串的内容是否一致。 对于String对象的相等性判断来说,请使用equals()方法,而不要使用==。 5.String类陷阱剖析 5.1 String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。
public class StringTest2 {
public static void main(String[] args) {
String s1="Hello";
String s2="World";
String s3=s1+s2;
System.out.println(s3);
}
}
5.2 StringPool(字符串池),
package Java_Lesson3_study;
public class ObjectTest2 {
public static void main(String[] args) {
Object object=new Object();
Object object2=new Object();
System.out.println(object==object2);
System.out.println("--------------------------------");
String str=new String("aaa");
String str2=new String("aaa");
System.out.println(str==str2);
System.out.println("--------------------------------");
String str3="bbb";
String str4="bbb";
System.out.println(str3==str4);
System.out.println("--------------------------------");
String str5=new String("ccc");
String str6="ccc";
System.out.println(str5==str6);
System.out.println("--------------------------------");
String s="hello";
String s1="hel";
String s2="lo";
System.out.println(s==s1+s2);
System.out.println("--------------------------------");
System.out.println(s=="hel"+"lo");
}
}
5.3 String s=”aaa”;(采用字面值方式赋值) (1)查找String PooL中是否存在“aaa”这个对象,如果不存在,则在String Pool中创建一个“aaa”对象,然后将String Pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样,s会指向String Pool中的这个“aaa”字符串对象。 (2)如果存在,则不创建任何对象,直接将String Pool中的这个“aaa”对象地址返回来,赋给s引用。 5.4 String str=new String(“aaa”); (1)首先在String Pool中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。 (2)如果没有,则首先在String Pool中创建一个“aaa”对象,然后再在堆中(heap)创建一个“aaa”对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个“aaa”对象。(创建了两次) String str=new String(“aaa”);//string也是类, String str2=new String(“aaa”); System.out.println(str==str2); Java SE Lesson 4 第32讲java数组内存地址解析 4.1包装类(Wrapper Class) 针对原生数据类型的包装。所有的包装类都位于java.lang包下。Java中的8个包装类分别是:Byte,Short,Integer,Long,Float,Double,Character,Boolean。他们的使用方式都是一样的,可以实现原生数据类型与包装类型的双向转换。 4.2 数组(Array): 相同类型数据的集合就叫做数组。 4.3定义数组: type[] 变量名=new type[数组总元素的个数];可以按照以下方式定义长度为10的数组: int[] a=new int[4];;或者int a[]=new int[2];java中推荐第一种方式 public class ArrayTest { public static void main(String[] args) { //方法1: int[] a=new int[4];//a是一个整型数组的引用 a[0]=1; a[1]=2; a[2]=3; a[3]=4; System.out.println(a[3]); // 方法二: int a[]=new int[2]; a[0]=1; a[1]=2; a[2]=3; a[3]=4; System.out.println(a[3]); } }
(1)数组中的元素索引是从0开始的。对于数组来说,最大的索引==数组的长度-1; 4.4定义数组的第三种方式 type[] 变量名={new type[]}{都好分隔初始化值列表}
public class ArrayTest {
public static void main(String[] args) {
int[] b= {1,2,3,4};
System.out.println(b[3]);
int[] c=new int[] {1,2,3,4};
System.out.println(c[3]);
}
}
4.5 length属性 java中的每个数组都有一个名为length的属性,表示数组的长度;length属性是public,final,int的。数组长度一旦确定,就不能改变大小。
public class ArrayTest {
public static void main(String[] args) {
int[] d=new int[100];
for(int i=0;i<d.length;i++) {
d[i]=i+1;
System.out.println(d[i]);
}
}
}
4.6 int[] a=new int[10] int[] a=new int[10],其中a是一个引用,它指向了生成的数组对象的首地址,数组中每个元素都是int类型,其中仅存放数据值本身。
数组里存放的是引用,不是对象
public class ArrayTest2 {
public static void main(String[] args) {
Person[] p=new Person[3];
p[0]=new Person(10);
p[1]=new Person(20);
p[2]=new Person(30);
for(int i=0;i<p.length;i++) {
System.out.println(p[i].age);
}
Person[] p2=new Person[5];
for(int i=0;i<p2.length;i++) {
System.out.println(p2[i]);
}
}
}
class Person{
int age;
public Person(int age) {
this.age=age;
}
}
数组里存放的是引用,不是对象
p[0]=new Person(10);
p[1]=new Person(20);
p[2]=new Person(30);这三句生成Person对象,使得数组引用指向person对象,
public class ArrayTest3 {
public static void main(String[] args) {
Students[] s=new Students[100];
for(int i=0;i<s.length;i++) {
s[i]=new Students();
s[i].name=i%2==0 ? "zhangsan" : "lisi";
}
for(int i=0;i<s.length;i++) {
System.out.println(s[i].name);
}
}
}
class Students{
String name;
}
|