📄 java3.txt
字号:
sd 0804 Javaday3 2008年6月12日类和对象
类:同一类事物的抽象,概念上的定义
万事万物皆是对象
写程序的时候,写的是类,用的是对象
类包括特征(属性),行为(方法),抽象
对象的特征和行为是具体的
由类到对象的过程
new+构造
构造的用处就是为了创建对象
package xx.xx 可没有或只能有一个
//全小写,分目录class
import xxx.xx 可以有多个
导入其他包的类库,一定要从CLASSPATH导入
public class 类名(类体) //类名要求所有单词首字母都要大写
public 只能有一个,可以没有
类体中只能放:
1.属性
2.方法
3.构造
4.语句块
5.内部类
类体里不能放语句
类体中的属性:
属性的格式:
[修饰符] 类型 属性名 [=默认值];
//属性名首字母小写,其他单词首字母大写
方法的格式:
[修饰符] 返回类型 方法名([参数列表])[抛出异常]{方法体}
//方法名也是首字母小写,其他单词首字母大写
构造的格式:
[修饰符] 类名([参数列表])[抛出异常]{构造体}
//默认构造有1到n个,类名要求所有首字母大写
常量:所有单词都大写
get读set写
---------------------------------------------------------------------------------------------
package com.tarena.day03; //0-1次
//import xx.xx //0-n次
public class TestThis { //class 1-n次,但public只能有一次
private int age; //成员变量
public int getAge(){ //方法可以有0-n次
return age; //对应返回
}
public void setAge(int age){
this.age = age; //This.代表成员,不写代表局部
}
public static void main(String[] args) {
TestThis tt = new TestThis(); //系统默认的构造,获得对象
tt.setAge(20);
}
}
---------------------------------------------------------------------------------------------
封装:
1.保护数据的有效性,在封装过程中对数据进行有效性检查
2.并且隐藏类的实现细节
3.统一的访问方式
4.增强性能
属性private
提供public 方法操作属性
---------------------------------------------------------------------------------------------
package com.tarena.day03;
public class Person {
private String name; //name的默认值是null
private int age; //age的默认值0
{
System.out.println("{Person}");
}
public Person(){ //最好写上无参的构造
System.out.println("Person");
}
public Person(int age){
//实际上有super(); 但效果等于不执行,因为父类是Object
System.out.println("Person age");
//this.age = age; //违背封装
this.setAge(age);
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
if(age<=0 || age>130){
System.out.println("age error");
}else{
this.age = age;
System.out.println(this.age);
}
}
public int getAge(){
return age; //可以写this.age
}
}
class Test{
public static void main(String[] args) {
Person p = new Person();
p.setAge(20);
p.setName("苏三");
}
---------------------------------------------------------------------------------------------
boolean 默认值是false
所有数字默认都是0,只是精度不同
char 的默认值是'\u0000'
引用类型: 所有的引用类型的默认是null
类 class
接口 interface
数组
int i = 10; //基本类型,不是对象
Person p = new Person(); //创建对象
在内存中,有栈,堆,池(常驻内存),代码段(保存方法)
new 是在堆里申请空间
**在Java中所有的参数传递都是值传递,所有的形参都有副本
---------------------------------------------------------------------------------------------
package com.tarena.day03;
public class TestValue {
public void test(int i){ //值传递,所有形参都有副本
i = i/2;
System.out.println(i); //打印的是副本i,所以是5,方法执行完这个 副本会消失
}
public void test(Person p){
p = null;
p.setName("Deng");
}
public static void main(String[] args) {
TestValue tv = new TestValue();
int i = 10;
tv.test(i);
System.out.println(i); //还是10
}
}
输出结果:
5
10
---------------------------------------------------------------------------------------------
重载:
相同方法名
参数类型必须不同,参数个数也可以不同
返回值可以不同,但最好定义相同的返回类型
步骤:
new+构造(堆)
1.申请空间
2.初始化
3.执行构造
顺序:
1.属性初始化
2.执行语句块
3.构造代码执行
---------------------------------------------------------------------------------------------
package com.tarena.day03;
public class TestInit {
private int state1 = 1;//1
{//2
System.out.println("{}:"+state1);
state1 = 3;
}
public TestInit(){//3
System.out.println("con:"+state1);
state1 = 2;
}
public static void main (String[] args){
TestInit ti = new TestInit();
System.out.println(ti.state1);
}
}
输出结果:
{}:1
con:3
2
---------------------------------------------------------------------------------------------
构造重载:
1.只要写2个以上的构造,就会构成重载(自动),需要不同类型和数量的参数
2.不写构造,系统会默认一个无参的构造
3.如果写了构造,系统就不会有默认构造
继承:
继承在逻辑上有 is a 关系
子类is a 父类, 如:学生 是 人
子类可以复用父类的代码
继承是类多态的前提条件
在Java中的继承跟C++不同:
要有extends 关键字,目前讲的是类与类的继承,还有接口继承
public class Manager extends Employee
一个类只能有一个直接父类/基类/超类
类中的属性,方法都可以被继承,构造不能被继承
私有的方法继承不过来,私有属性可以继承过来
在new 一个子类的时候父类的构造会被调用,一种是显式调用,一种是隐式调用父类无参
java.lang.object是所有类的父类,如果没有关键字 extends 那该类的默认父类就是java.lang.object
new 子类的时候会依次调用直接父类的构造,直到object位置
---------------------------------------------------------------------------------------------
package com.tarena.day03;
public class Student extends Person{
private int id = 1;
{
System.out.println("{Student}");
}
public Student(){
super(6); //显式调用父类有参构造
System.out.println("Student");
}
public Student(int i){
this(); //调用本类的无参构造,this()只能在第一行
System.out.println("Student int");
}
public void setId(int id){
this.id = id;
}
public int getId(){
return id;
}
public static void main(String[] args) {
Student s1 = new Student(); //调用父类的无参构造,如果父类定义了有参,那这个子类会报错
// Student s2 = new Student(3); //调用了子类的有参,隐式调用父类构造无参
//s1.age = 5; //age私有,被封装
s1.getAge(); //Person
s1.toString(); //object
s1.getId(); //Student
}
}
输出结果:
{Person}
Person age
{Student}
Student
Student int
---------------------------------------------------------------------------------------------
super:代表父类
this:代表子类
this. / super. 调用本类/父类的属性或方法,用法没有限制,可出现在构造中
this() / super() 调用本类/父类构造
this() / super()不能出现在方法里,这种方法只能出现在构造的第一行,所以在同一个构造里,this()或super()只能有一个
执行顺序:
1.先父后子
2.先找this(),再找super() 如果都有没有就会去找super()
3.先语句块,后构造
1.有this()就无super();
2.有super() //显式
3.无super(),无this() //隐式调用super()
完整封装:
1.属性private
2.提供public方法操作属性(set/get)
3.构造要调用方法,不要赋值
作业:
完成下面的代码
package com.tarena.day03;
public class TestRan {
public static void main(String[] args) {
Math.random(); //[0,1)的随机数
int temp = (int)(Math.random()*36+1); //[1,37)
System.out.println(temp);
//要求生成7个无重复的随机数
int[] t = new int[7];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -