注意一点:
String属于引用数据类型,但有一点特殊,可以写
String s1=“hello”; 而不用new。
练习一:
package com.atguigu.java1;
public class RecursionTest {
public static void main(String[] args) {
RecursionTest test=new RecursionTest();
int value1=test.getSum(100);
System.out.println(value1);
int value2=test.getCheng(5);
System.out.println(value2);
}
//求1-n之间自然数和
public int getSum(int n){
if(n==1){
return 1; //递归出口
}else{
return n+getSum(n-1);
}
}
//求1-n之间自然数乘积
public int getCheng(int n){
if(n==1){
return 1;
}else{
return n*getCheng(n-1);
}
}
}
练习二:
已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0的整数,求f(10)的值。
错误写法
正确写法(结果为10497):
package com.atguigu.java1;
public class RecursionTest {
public static void main(String[] args) {
RecursionTest test=new RecursionTest();
System.out.println(test.f(10));
}
public int f(int n){
if(n==0){
return 1;
}else if(n==1){
return 4;
}else{
return 2*f(n-1)+f(n-2);
}
}
}
面向对象的特征——封装与隐藏
package com.atguigu.java;
public class AnimalTest {
public static void main(String[] args) {
Animal a=new Animal();
a.name="大黄";
//a.legs=4; //Animal类中给legs添加了private权限,所以就不能再直接调用,只能走调用setLegs(方法)这条路,更合理
a.setLegs(6);
a.show();
}
}
class Animal{
String name;
private int age;
//给动物腿的数量加一个限制,使其合理。
//实现了对legs属性的封装(使其不对外暴露)
private int legs;
//①对属性的设置
public void setLegs(int l){
if(l>0&&l%2==0){
legs=l;
}else{
legs=0;
}
}
//②对属性的获取
public int getLegs(){
return legs;
}
//提供关于属性age的get和set方法.
public int getAge(){
return age;
}
public void setAge(int a){
age=a;
}
public void eat(){
System.out.println("动物进食");
}
public void show(){
System.out.println("name= "+name+",age= "+age+",legs= "+legs);
}
}
Java四种权限修饰符
Java四种权限修饰符(从小到大排列):
private、缺省、protected、public
四种修饰权限可以用来修饰类及类的内部结构:
属性、方法、构造器、内部类
细说:
①四种修饰权限都可以用来修饰类的内部结构:属性、方法、构造器、内部类;
②规定修饰类的话只能使用缺省和public。
总结:Java提供了四种权限修饰符来修饰类及类的内部结构,体现类及类的内部结构在被调用时的可见性大小。
练习:
package com.atguigu.exer;
public class Person {
private int age;
//设置
public void setAge(int a){
if(age>=0&&age<=130){
age=a;
}else{
System.out.println("输入数据非法!");
}
}
//获取
public int getAge(){
return age;
}
}
package com.atguigu.exer;
public class PersonTest {
public static void main(String[] args) {
Person b=new Person();
b.setAge(12);
System.out.println("获取年龄为:"+b.getAge());
}
}
构造器
package com.atguigu.java;
public class PersonTest {
public static void main(String[] args) {
//创建类的对象:new + 构造器
Person p=new Person(); // Person() 即为一个构造器(默认的空参构造器)
p.eat();
Person p1=new Person("Tom"); //造对象时,把name值也赋上了
System.out.println(p1.name); //Tom
Person p2=new Person("Tommm", 12);
System.out.println(p2.name+", "+p2.age); //Tommm, 12
}
}
class Person{
//属性
String name;
int age;
//构造器
public Person(){
System.out.println("Person()...");
}
public Person(String n){
name=n; //造对象时,把name值也赋上了
}
public Person(String n,int a){
name=n; //造对象时,把name值、age值都赋上了
age=a;
}
//方法
public void eat(){
System.out.println("干饭");
}
public void study(){
System.out.println("学习");
}
}
package com.atguigu.exer;
public class Person {
private int age;
private String name; //私有属性,可以在下面提供公共的get和set方法-----封装性
//声明构造器
public Person(){
age=18;
}
public Person(String n,int a){ //通过此构造器构造对象时,就把这两个属性赋上了值
name=n;
age=a;
}
//设置
public void setAge(int a){
if(age>=0&&age<=130){
age=a;
}else{
System.out.println("输入数据非法!");
}
}
//获取
public int getAge(){
return age;
}
//设置get和set方法
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
}
package com.atguigu.exer;
public class PersonTest {
public static void main(String[] args) {
Person b=new Person();
System.out.println("获取年龄为:"+b.getAge()); //18
Person p1=new Person("Tom", 21);
System.out.println("name="+p1.getName()+",age="+p1.getAge());
}
}
package com.atguigu.exer1;
public class TriAngle { //angle:角 angel:天使
private double base; //底边长
private double height; //高
//提供类必要的构造器
public TriAngle(){ //习惯上提供一个空参构造器
}
public TriAngle(double b,double h){
base=b;
height=h;
}
//设置get和set方法
public void setbase(double b){
base=b;
}
public double getbase(){
return base;
}
public void setHeight(double h){
height=h;
}
public double getHeight(){
return height;
}
}
package com.atguigu.exer1;
public class TriAngleTest {
public static void main(String[] args) {
TriAngle t1=new TriAngle(); //调用空参构造器
t1.setbase(2.0);
t1.setHeight(2.4);
System.out.println("base:"+t1.getbase()+",height:"+t1.getHeight()); //base:2.0,height:2.4
TriAngle t2=new TriAngle(5.1,5.6);
System.out.println("base:"+t2.getbase()+",height:"+t2.getHeight()); //base:5.1,height:5.6
double area=(t1.getbase()*t1.getHeight())/2.0;
System.out.println("面积:"+area);
}
}
属性赋值的先后顺序
首先思考:属性在什么位置可以赋值?
①默认初始化
②显式初始化
③构造器中初始化(赋值)
④通过“对象.方法”或“对象.属性”进行赋值
以上操作的先后顺序是怎样的?
显示赋值肯定在默认赋值后面。
我们验证一下显式初始化和构造器赋值的先后顺序:
package com.atguigu.java;
public class UserTest {
public static void main(String[] args) {
User u=new User();
System.out.println(u.age); //1
User u1=new User(2); //构造器给属性赋值
System.out.println(u1.age); // 2
}
}
class User{
String name;
int age=1;
public User(){
}
public User(int a){
age=a;
}
}
2在后面把1覆盖掉了,所以构造器赋值在显式赋值后。
JavaBean如下即为一个JavaBean:
package com.atguigu.java;
public class Customer {
private int id;
private String name;
public Customer(){
}
public void setId(int i){
id=i;
}
public int getId(){
return id;
}
public void setName(String n){
name=n;
}
public String getName(){
return name;
}
}
UML类图
UML类图的各要素



