类和对象的简单的复习,在做项目的过程中有时候不知道怎样来调用类创建的对象,简单的几个类可以看清楚,一般在项目中创建十几个类往往就不知道怎么来看
为了以后能够看清楚,现在来回顾一下类和对象的创建,对象的调用和传递(前面写过一篇)
类和对象的基础概念:
JAVA中万事万物都是类 类有字段(属性),方法,嵌套类和嵌套接口 是在其它的类或接口中声明的内部声明的类与接口
a,类的修饰符 ;public private protected 默认的
b,字段:final 最后的不可变的,修饰方法,属性,
static:静态字段:在调用的时候不需要创建对象,而是通过类名直接调用方法
,静态字段是共享的,只要改变一个全部都改变,静态字段不可以在main方法中使用
//静态字段,直接通过类名调用
public class Demo{ public static void main(String[] args){ Demo.init(); } public static void init(){ System.out.println("我是一个静态方法"); } }
//静态字段不可以用在main方法中
非静态字段:
类的初始化:
类除了简单的初始化之外,类还可以含有构造器,构造器是一个语句块,用来在new将对象的引用
返回之前初始化对象,
class demo{ public int count; private static long nextID = 1; demo(){ count = nextID ++; } }
初始化块
class demo{ public int count; private static long nextID = 1; { count = nextID ++; } }
静态初始化:
class demo{ public int count; private static long nextID = 1; static{ count = nextID ++; } }
方法异常与返回;
当调用方法时,控制流从调用的方法传入被调用的方法,被调用的语句将按照它们的语义顺序执行
,当遇到下列三种请款时,方法将结束执行并返回给调用者:执行return语句,到达方法结尾,
抛出为捕获的异常
对象在A中创建 AA a = new AA() ,B类需要A类中的a ,可以直接将AA a;设置为B类的属性就可以? 看下面的代码,:
package 类和对象; /** * * @author Administrator *构造方法及this的使用 */ public class Animal { int legs; String name; //第一个构造方法 Animal(){ this("狗",4); //使用this调用Animal(String , int)构造方法; System.out.println("不带任何参数的构造方法"); } //第二个构造方法 Animal(String name){ this(name,4); //使用this调用Animal(String , int)构造方法; System.out.println("需要带参数的构造函数"); } //第三个构造方法 Animal(String name,int legs){ this.name = name; this.legs = legs; System.out.println("需要两个参数的构造函数"); } void play(){ System.out.println(name +"有" + legs + "条腿"); } }
//
主方法 启动线程
package 类和对象; public class AnimalTest { //主方法 public static void main(String[] args) { // TODO Auto-generated method stub Animal dog = new Animal(); Animal cat = new Animal(); Animaldemo de = new Animaldemo(); de.start(); } }
//线程类,线程没有传递参数;
package 类和对象; //线程类 public class Animaldemo extends Thread { private Animal dog; private Animal cat; private boolean islive = true; @Override public void run() { try { while (islive) { dog.play(); cat.play(); } } catch (Exception e) { islive = false; e.printStackTrace(); } } }
//运行结果;
需要两个参数的构造函数
不带任何参数的构造方法
需要两个参数的构造函数
不带任何参数的构造方法
java.lang.NullPointerException
at 类和对象.Animaldemo.run(Animaldemo.java:22)
分析:在线程中创建了main方法中创建的对象,但是线程在主函数创建的时候没有将需要的对象传给线程
导致线程中的对象是null; 初学者经常会遇到这样的问题
解决方法有两个:
第一个:是通过在创建线程的时候将对象传给线程,线程启动构造函数来接收
1,创建线程的时候传递参数
package 类和对象; public class AnimalTest { public static void main(String[] args) { // TODO Auto-generated method stub Animal dog = new Animal(); Animal cat = new Animal(); Animaldemo de = new Animaldemo(dog, cat); de.start(); } }
package 类和对象; //线程类 public class Animaldemo extends Thread{ //通过线程传递 private Animal dog; private Animal cat; public Animaldemo(Animal dog,Animal cat){ this.dog = dog; this.cat = cat; } private boolean islive = true; @Override public void run() { try { while (islive) { dog.play(); cat.play(); } } catch (Exception e) { islive = false; e.printStackTrace(); } } } 运行结果; 需要两个参数的构造函数 不带任何参数的构造方法 需要两个参数的构造函数 不带任何参数的构造方法 狗有4条腿 狗有4条腿 狗有4条腿 狗有4条腿 .......
第二个:对象直接在线程中创建
//主函数
package 类和对象; public class AnimalTest { public static void main(String[] args) { // TODO Auto-generated method stub Animaldemo de = new Animaldemo(); de.start(); } }
//
package 类和对象; //线程类 public class Animaldemo extends Thread { //在线程中创建对象 Animal dog = new Animal(); Animal cat = new Animal(); private boolean islive = true; @Override public void run() { try { while (islive) { dog.play(); cat.play(); } } catch (Exception e) { islive = false; e.printStackTrace(); } } }
运行结果:
需要两个参数的构造函数
不带任何参数的构造方法
需要两个参数的构造函数
不带任何参数的构造方法
狗有4条腿
狗有4条腿
狗有4条腿
狗有4条腿
.......